CentOS上のディレクトリでCSVファイルの所有者・グループを変更してMySQLにインポートする際にエラーが発生する

このQ&Aのポイント
  • CentOS上の/var/lib/mysqlディレクトリにCSVファイルをアップロードして、所有者とグループを変更した後にMySQLコマンドでインポートしようとすると、エラーが発生します。
  • Javaプログラムを使用せずに手動で所有者とグループを変更してMySQLコマンドでインポートする場合は問題なくできますが、Javaプログラムを使用するとエラーが発生します。
  • エラーの原因はJavaプログラムが実行する際に権限の問題が発生しているためです。詳しい原因を特定するには、JavaプログラムのコードとMySQLの権限設定を確認する必要があります。
回答を見る
  • ベストアンサー

CentOS(Linux)上の/var/lib/mysqlディレクトリ

CentOS(Linux)上の/var/lib/mysqlディレクトリ上(MySQLデフォルトのデータディレクトリ)へ、 CSVファイル「Test.csv」(文字コードWindows-31J(CP932))を、 アップロードしてから、 以下のJavaプログラム(エラー処理内容だけは省略していますが・・・)  ↓ final Runtime rt = Runtime.getRuntime(); final Process pr = rt.exec("chown mysql:mysql" + " " + "/var/lib/mysql/Test.csv"); try { pr.waitFor(); final int intRet = pr.exitValue(); if (intRet != 0) { return; } } catch (final Exception ex2) { return; } を実行して、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させて、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 なぜか、 以下のエラーが発生します。  ↓ java.sql.SQLException: Access denied for user 'SYSASA'@'localhost' (using password: YES) なお、別のやり方として以下のテストも試してみました。  ↓ 上記のJavaプログラムを実行せずに、 アップロード後のファイルを直接、 CentOS上から手作業(プロパティ)で、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 問題無く、インポート出来ています。 そこで、 ご質問内容なのですが、 Javaプログラムを利用しているか、していないか だけの違いで、 なぜか、上記致しましたJavaプログラムで、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 上記のエラーになります。 何がエラーの原因なのでしょうか? もしお気づきの点などございましたら、 ぜひ教えてください。 お世話になります。 以上、宜しくお願い致します。

  • MySQL
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

OSのファイルシステムの所有者や権限と、MySQLのアカウントや権限の話がごちゃ混ぜになっているような。。。 JAVAでMySQLに接続する時、どういう指定になっているのでしょうか? JAVAを使用せず、手作業で接続する時、どういう指定になっているのでしょう?

hiroasa21
質問者

お礼

お世話になっております。 その後、MySQLの書籍などを調べたところ、 「ファイルをインポートするには、FILE権限が必要です」 とあった為、phpMyAdminツールで、 mysqlデータベース内、userテーブル内の、 「File_Priv」フィールドの値を、Nから→Yに変更して保存後、 MySQLサービスをリブートした後で、 プログラムはそのままで、再度インポートを試したところ、 エラーが解消されて、無事にインポート出来るようになりました。 (所有者とグループはrootのままでOKでしたので、  それはエラー原因ではなかったようです・・・) 今回、ご回答いただきましたおかげで、 私の方では基本に立ち返って、いろいろと見直しをすることで、 上記のエラー原因を発見することにつながりました。 また機会がございましたら、 宜しくお願い致します。 本当にご回答いただきまして、ありがとうございました。

hiroasa21
質問者

補足

お世話になっております。 さっそくご質問をいただいておりました2点を以下にご回答させていただきます。 (1)JAVAでMySQLに接続する時、どういう指定になっているのでしょうか?     ●以下のような指定に致しております。 public String import_CsvFile(final String strCsvFileName) throws NamingException, SQLException { String strMessage = null; Connection conn = null; PreparedStatement pstmt = null; try { final Context context = new InitialContext(); final DataSource ds = (DataSource) context .lookup("java:cmp/ev/jdbc/ace"); conn = ds.getConnection(); // クライアントPC内のCSVファイル(Test.csv)(文字コードWindows-31J(CP932)(俗に言うExcelのCSV形式ファイル))を読み込みながら、 // MySQLのテーブル(TestTable)(文字コードUTF-8)内へインポート final StringBuffer sbSql = new StringBuffer(); sbSql.append("LOAD DATA INFILE"); // MySQLのコマンドを指定 sbSql.append(" ?"); // インポート元のCSVファイル名を指定 sbSql.append(" INTO TABLE TestTable"); // インポート先のMySQLテーブル名を指定(文字コードUTF-8のテーブル) sbSql.append(" character set cp932"); // 文字コードがWindows-31J(CP932)のCSVファイル sbSql.append(" FIELDS TERMINATED BY ','"); // 区切り文字がカンマのCSVファイル sbSql.append(" ENCLOSED BY '\"'"); // 全ての各文字列をダブルコーテーションで囲んでいるCSVファイル sbSql.append(" LINES TERMINATED BY '\r\n'"); // 1件(1レコード)ごとの改行文字が、「印字位置を行頭に戻す」「1行進める」というWindows標準の改行コード(CRLF) sbSql.append(" IGNORE 1 LINES"); // CSVファイルの先頭1件(1レコード)のみをスキップして、それ以降を読み込ませている pstmt = conn.prepareStatement(sbSql.toString()); pstmt.setString(1, strCsvFileName); final int intResult = pstmt.executeUpdate(); (2)JAVAを使用せず、手作業で接続する時、どういう指定になっているのでしょう?     ●以下のような指定に致しております。      上記(1)のJavaプログラムの前に、昨日質問で掲載したJavaプログラムがあるのですが、      そのプログラムをコメント化(無効化)して、      CSVファイルの属性のみを、CentOSのXWindow上のKonqueror(KDE3.5)ツールを利用して、      CSVファイルを右クリックし、「プロパティ」-「許可情報」タグをクリックし、      画面内の所有者欄内のユーザ、グループを、元のrootから→mysqlに手作業で変更して      から、上記(1)のJavaプログラムを実行してMySQLテーブル内にインポート出来ていました。

関連するQ&A

  • CSVファイル「Test.csv」(文字コードWindows-31J(

    CSVファイル「Test.csv」(文字コードWindows-31J(CP932))を、 CentOS(Linux)上の/var/lib/mysqlディレクトリ上(MySQLデフォルトのデータディレクトリ)へ、 アップロードしてから、 以下のJavaプログラム(エラー処理内容だけは省略していますが・・・)  ↓ final Runtime rt = Runtime.getRuntime(); final Process pr = rt.exec("chown mysql:mysql" + " " + "/var/lib/mysql/Test.csv"); try { pr.waitFor(); final int intRet = pr.exitValue(); if (intRet != 0) { return; } } catch (final Exception ex2) { return; } を実行して、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させて、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 なぜか、 以下のエラーが発生します。  ↓ java.sql.SQLException: Access denied for user 'SYSASA'@'localhost' (using password: YES) なお、別のやり方として以下のテストも試してみました。  ↓ 上記のJavaプログラムを実行せずに、 アップロード後のファイルを直接、 CentOS上から手作業(プロパティ)で、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 その後、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 問題無く、インポート出来ています。 そこで、 ご質問内容なのですが、 Javaプログラムを利用しているか、していないか だけの違いで、 実施しているのですが、 なぜか、上記致しましたJavaプログラムで、 アップロード後の「Test.csv」ファイルの「所有者」、および「グループ」を、 元々の「root」から、「mysql」に変更させてから、 MySQLコマンドの「LOAD DATA INFILE」を実行すると、 上記のエラーになります。 何が問題なのか? もしお気づきの点などございましたら、 ぜひ教えてください。 お世話になります。 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • csvファイルを使ってMySQLのテーブルを更新し

    約2万件ある15個のカラムで構成されるMySQLのテーブルがあります。 このテーブルをcsvファイルを使って更新しようと考えています。 csvファイルにはレコードIDとあるカラムの変更する値の2つのセルで 構成されています。 行数は毎回異なりますが、だいたい300行前後です。 csvファイルの具体的イメージはこんな感じです。 id order ============ 2,  200 4,  10 7,  460 11,  35 MySQLのテーブルの方にも「id」と「order」というカラムが存在します。 java や PHP を使ってやる方法はわかるんですが、プログラムを作成しないで SQLだけで行いたいと考えています。 LOAD DATA LOCAL INFILE などがあることがわかったのですが、レコードを REPLACE  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

  • MYSQLのDBに大容量のCSVをUPしたいです。

    さくらインターネットのMYSQLのDBに大容量(約13MB)のCSVファイルをアップロードする方法を教えて下さい。 下記(1)~(3)のようにいくつかの方法を試しましたが、結果的に全件をアップロードができていません。 (1)最初にレンタルサーバーのさくらインターネットでサーバーを借りましたが、phpMyAdminにCSVファイルをアップロードしようしました。 kuin_mstという名前のテーブルを作成後、このテーブルを選択してインポート画面からインポートするCSVファイルを選択し、設定として「ファイルの文字セット」をutf8に、 「インポートするファイルの形式」のCSV形式のフィールド区切り記号をカンマに、フィールド囲み記号を空白に指定しました。 そして、実行を押すと、しばらくして「Internet Explorerではこのページは表示できません。」が表示されました。 これに対してF5キーを押して再実行すると元の画面に戻り、kuin_mstテーブルの件数を見ると、122915件中58114件がアップロードされてました。 他のインポートするファイルの形式の「LOAD DATA する CSV」や「SQL」も試しましたが、結果として何もアップロードされませんでした。 考察:13MBのデータを3回分に分割してこの作業を行えば目的が達成できるように思いますが、結果として入れるべき全件のデータがアップロードされたのかを検証する方法が分かりません。 (2)さくらはSSHが使えるのでpoderosaをダウンロードしてサーバーにアクセスしましたが、SQLのみ記述されたtest1.txtをアップロードするコマンドを次のように投入したら テーブルの削除や作成は成功しエラーが発生しませんでした。 コマンド 「mysql -h mysql○○○.db.sakura.ne.jp -u アカウント名 -p DB名 < test1.txt」 しかし、このtest1.txt内に「LOAD DATA INFILE './KEN_ALL.CSV' INTO TABLE kuin_mst FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';」 の一行を加えて実行すると「ERROR 1045 (28000) at line 2513: Access denied for user 'ユーザー名'@'%' (using password: YES)」というエラーが発生します。 このエラーを調べると「コンソールからデータベース接続する時にパスワードが間違っている」と説明しているサイトがありましたが、何度確認しても間違えていませんし、間違えていたら「LOAD DATA ~」の行を 追加していない状態の処理で同じエラーが出るはずです。 ちなみに、自宅PCのWEBサーバーで、「LOAD DATA ~」を追加したtest1.txtをコマンドプロンプトで実行するとアップロードが正常に行われるのでCSVファイル自体は問題がないはずです。 ※KEN_ALL.CSVファイルは、郵便番号-住所データ(utf-8保存で約13MB)でレコードはカンマ区切り(例として1レコード抜粋→640941,ホッカイドウ,サッポロシチュウオウク,アサヒガオカ,北海道,札幌市中央区,旭ケ丘) となっています。 ※test1.txtとKEN_ALL.CSVの両ファイルは/home/アカウント名の階層に置いてこの処理を実行しました。 結果として何が原因でアップロードができないのかがよくわかりませんでした。 (3)BIGDUMPという大容量ファイルを分割してDBにアップロードできるツールを見つけたので、いろいろと説明があるサイトを参考にブラウザにて実行したらKEN_ALL.CSVファイルがFilenameの欄に表示されました。 同画面でstart import1をクリックしましたが、「You have to specify $csv_insert_table when using a CSV file. 」というメッセージが出てきました。 結果として、この意味がよくわかりませんでしたが、カンマ区切りのみのCSVファイルだけをアップロードすることはできないのかもと思いました。 以上、悪戦苦闘しても解決できないのでどうかアドバイスを下さい。 宜しくお願いします。 ■環境 UNIX系 OS FreeBSD Apache 1.3.x PHP 5.2.17 phpMyAdmin 3.3.10.3 MySQL 5.1 MySQL 文字コード UTF-8 bigdump ver.0.34b

    • ベストアンサー
    • MySQL
  • LOAD DATA INFILE の使用について

    サーバにある、CSVファイルをデータベース(mysql)に登録したいです。 $query = "LOAD DATA INFILE '[ファイル名]' INTO TABLE [テーブル名] FIELDS TERMINATED BY ','"; を $result = mysql_query($query); として実行すると、 Access denied for user 'user'@'%' (using password: YES) というエラーになります。 色々検索すると、ユーザーはrootユーザーでないといけない・・・というのを見かけたのですが・・・ 普通のユーザーではLOAD DATA INFILEを使用できませんか? 私は、レンタルサーバを使用していて、レンタルサーバ上からしかユーザーを追加できません。 この場合、LOAD DATA INFILE~ は使用できないのでしょうか? また、もし使用できない場合、代替手段はあるのでしょうか?

    • ベストアンサー
    • PHP
  • csvからmySQLのデータベース作成

    カンマ区切りのcsvファイルを読み込んでMySQLのデータベースを作成したくて、下記のプログラムを作成しました。 しかし、正常に動作しません。どこに問題があるのでしょうか。 よろしくお願いします。 <?php $file = '"test.txt"'; //------------------------------------------------------------- //データベースアクセス //------------------------------------------------------------- $url = 'test-test.com'; // MySQL hostname $user = 'test_user'; // Your MySQL user name. $pass = 'password'; // Your MySQL password. $db = 'test_db'; // MySQLへ接続する $link = mysql_connect($url,$user,$pass); if ( $link == FALSE ) { error(__line__); } // データベースを選択する $sdb = mysql_select_db($db,$link); if ( $sdb == FALSE ) { error(__line__); } mysql_query("SET NAMES utf8"); //CSVデータの取り込み $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE test fields terminated by"; $sql .= " LINES "; $sql .= " TERMINATED BY '\r\n' "; $sql .= " IGNORE 1 LINES"; $result = mysql_query($sql, $conn); if (!$result) { $message = 'Invalid query: ' . mysql_error() . "\n"; $message .= 'Whole query: ' . $sql; die($message); } //------------------------------------------------------------- // エラーメッセージ表示 //------------------------------------------------------------- function error($line) { echo "error code:" . $line; exit; } ?> ---------- .CSVファイル ---------- 日付,内容,備考 0901,value,etc 0902,value2,etc2

    • ベストアンサー
    • PHP
  • mysqlについての質問です。

    macbook air の mountaion lion を使用しています。 csvファイルをmysqlのコマンドラインから呼び込もうとすると mysql> load data infile "file://localhost/Users/uekikouji/excel/t.csv" into table tb1N fields terminated by ','; ERROR 13 (HY000): Can't get stat of '/usr/local/var/mysql/file:/localhost/Users/uekikouji/excel/t.csv' (Errcode: 2) と表示されます。なにが原因でしょうか悩んでいます。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLで連続csvファイルを読み込むために

    MySQL 5.6を最近使い始めました。 大量のcsvファイルで保存されているデータを読み込んで、データベースとして扱いたいのですが、どうすれば良いでしょうか? ファイル名は、 data1_1.csv data1_2.csv data1_3.csv data2_1.csv data2_2.csv といった形で、規則正しく並んでいるのですが、大量にあるため、ループを使って自動化したいと思っております。そのために、LOAD DATA INFILE ファイル名 を使って、このファイル名を順次変えて繰り返す方法がわかりません。 まず、ファイル名に変数が使えるのかと思って @file="data1_1.csv"としてファイル名を置き換えてみたのですが、エラーでした。これでは、この1_1を順次動かす以前に変数が無理なのかも?と思っています。 何かやり方があるようでしたら、どなたかお教えください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 文字コードMS932(Windows-31J)のテキストファイル(CS

    文字コードMS932(Windows-31J)のテキストファイル(CSVファイル)を、 MySQLのLOAD DATA INFILEでインポートしたところ、 漢字などの全角文字が文字化けしてしまいました。 その後、MySQL上で「show variables like 'character_set_database'」を SQL実行したところ、「utf8」と表示された為、 試しに、 元のCSVファイル自体の文字コードを、 テキストエディタで「UTF-8」に変換したCSVファイルを、 MySQLのLOAD DATA INFILEでインポートしたところ、 うまくインポート出来ました。 そこで、ご質問内容ですが、 MySQLのLOAD DATA INFILEでインポートする際に、 文字コードMS932(Windows-31J)のテキストファイル(CSVファイル)を、 直接、文字コードUTF-8のテキストファイルとして、 読み込ませながらインポートするような方法が、 もしございましたら、ぜひ教えてください。 もし、それが無理でしたら、 上記の文字コード変換する方法として、 どのような方法があるかなどをアドバイスいただけましたら幸いです。 お世話になります 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQL の load data infile

    お世話になります。 MySQL のload data infile ... コマンドを使ってCSVファイルをテーブルに転送することをよくやっていますが、このコマンドには現在あるデータはそのままにして、新たにデータを追加するオプションなどはあるのでしょうか? 今までは空のテーブルにデータを転送していただけですが、既にあるデータに上書きすることなく、追加する方法があれば教えていただきたいと思います。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • CSVファイルをMYSQLにインポート

    先日からMYSQL+PHPの勉強をはじめました。 データベース構築の際、以前作成したCSVファイルをMYSQLのテーブルとして 利用したいと考えております。 そこで、MYSQLコマンドより、 LOAD DATA LOCAL INFILE 'ファイル名.csv' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 0 rows affected (0.04 sec) Records: 102 Deleted: 0 Skipped: 102 Warnings: 0 とCSVファイル自体が悪いのかSQL文に問題がるのかインポートがうまくいきません。。 ちなみにCSVは  0,2011/6/2 0:00,80.94,81.32,80.55,80.92 0,2011/5/25 0:00,81.94,82.17,81.8,81.95 0,2011/5/23 0:00,81.77,82.04,81.32,81.99 環境はphpdevで一括でインストールした phpadmin: バージョン2.3.2 MYSQL: MySQL4 apache: 1.3.27 初心者で基本的な質問かもしれないですがどうかご教授お願いします。

    • ベストアンサー
    • MySQL