• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CentOS(Linux)上の/var/lib/mysqlディレクトリ)

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

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

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

  • ベストアンサー
回答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