Javaプログラムでアップロード後の「Test.csv」ファイルの所有者、グループを変更後にMySQLコマンドを実行するとエラーが発生する理由

このQ&Aのポイント
  • Javaプログラムを使用してアップロード後の「Test.csv」ファイルの所有者とグループを変更し、MySQLコマンドの「LOAD DATA INFILE」を実行すると、アクセス拒否のエラーが発生します。
  • アップロード後のファイルの所有者とグループを手動で変更してからMySQLコマンドを実行すると、問題なくインポートできます。
  • Javaプログラムを利用する場合、アップロード後のファイルの所有者とグループを変更する権限がないため、アクセス拒否のエラーが発生します。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • sublota22
  • ベストアンサー率100% (3/3)
回答No.1

ファイルをインポートするには、FILE権限が必要です。 phpMyAdminツール等で、 mysqlデータベース内、userテーブル内の、 「File_Priv」フィールドの値を、Nから→Yに変更して保存してから、 MySQLサービスをリブートすればよいです。 (所有者とグループは、rootのままでOKです)

hiroasa21
質問者

お礼

うまくインポート出来ました。 ありがとうございました。

関連するQ&A

  • 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
  • 文字コード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
  • 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  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

  • CSVファイルのインポートについて

    宜しくお願いします。 CSVファイルをインポートしようとして、四苦八苦しています。item.csvというファイルをitemという名前のテーブルにインポートしようとしています。 load data local infile "item.csv" into table item fields terminated by ','; とコマンドを入力すると、 The used command is not allowed with this MySQL version というエラーが返されます。そこで、 load data infile "item.csv" into table item fields terminated by ','; と入力すると、 Access denied for user: '****@localhost' (Using password: YES) というエラーが返されます。 csvファイルの置き場所も解らないので、同じサーバの/public_html/test/php/csv/item.csvという位置と、/public_htmlよりもう一階層上のフォルダにitem.csvというファイルをアップしてあります。 相対パスやサーバがどの程度の階層まで検索してくれるのか解らないので、絶対パスでも指定してみましたが、全く同じエラーが返されてきました。 エラーの内容を翻訳してみたところ、 The used command is not allowed with this MySQL version 「使用されたコマンドは、このMySQL版で許されない」 Access denied for user: '****@localhost' (Using password: YES) 「ユーザー:『****@localhost』(パスワード:YESを使うこと)のために許されないアクセス」 という意味になりました。正直、どうすればいいのかさっぱりわかりません。この状況の打開策をご教授頂ければ助かります。何卒、宜しくお願い致します。尚、MySQLのバージョンはレンタルサーバの情報によると、「3.23.××以降」となっています。

    • ベストアンサー
    • 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
  • CSVファイルについて

    MYSQL5.0を使用しています。 MYSQLからCSVファイルを開いて、そこへデータを書き込みたいと思っているんですが、なかなかうまくゆきません。 MYSQLから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
  • CSVファイルを毎日、全レコード一括更新したい

    毎日、CSV形式で送られてくる最新のデータがあります。 それを自動的にMySQLに一括で追加・更新したいと考えています。 CSVファイルは毎日、データが追加されたり、UPDATEされたり、削除されたりしています。そのCSVファイルのデータを神様DBとして、上書きしたいと思っています。 つまり、前日のMySQLのデータを本日のデータで完全に上書きしたいと考えています。 単にデータをロードするだけなら mysql> load data infile "ファイルパス/ファイル名.csv" -> into table テーブル名 fields terminated by "," lines terminated by "\n"; でよいと思いますが、完全上書きの方法がよくわかりません。 それとも、上記方法で同じことを2度すると完全に上書きされるのでしょうか?同じレコードが2つ出来上がるのでしょうか?それともマージされるのでしょうか? もし、お分かりでしたらご教授ください。

    • ベストアンサー
    • MySQL
  • CSVファイルのデータが、データベース上で文字化け

    CSVファイルのデータが、データベース上で文字化けする現象を解決したい! CSVファイルは、任意の場所にFTPソフトを使用してアップロードし、プログラム上でCSVを読み込むという手順です。 ■開発関係情報 phpは使用しておらず開発はperlを使用 開発プログラムの文字コードはEUC-JPで、出力されるHTMLの文字コードはShift-JISです。 (1)hetemlに設置した場合は正常に動作しました。 予め作成されていたデータベースのエクスポートファイルをインポートしてテーブルを作成しましたがインポート時のファイルの文字セットは「utf8」で、コーディングへの変換は「non」で実行しています。 MySQLバージョン:5.0.82 MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 2.11.11.3 MySQL クライアントのバージョン: 4.0.25 (2)無料のレンタルサーバー(国外)に設置すると文字化けします。 (1)と同じ手順で行うと、データベース上でCSVデータの日本語が文字化けします。 MySQLバージョン:5.1.65-cll MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 3.4.11.1 MySQL クライアントのバージョン: 4.1.22 そこでCSVをFTPでアップせずデータベースでインポート(ファイルの文字セット:utf-8、エンコーディングの変換なし)しようとすると「CSV入力のカラム数が不正です」というエラーになります。 色々と調べていると、文字コードをすべてEUCに統一すると文字化け解決と書いてあったので、CSVファイル・MySQLの接続照合順序・インポートするときの文字セットなどの思い当るところ全てをEUCに指定して、エンコーディングへの変換を「EUC」に「全角カナへ変換する」にチェックを入れて実行してみても、やはり「CSV入力のカラム数が不正です」エラーになります。 この時、フォーマット項目で「LOAD DATA文を使用したCSVの読み込み」を選択し、特有のオプションで「カラムの終端記号」を「,」「カラム囲み記号」を「"」に設定して、CSVファイルでは区切りを「,」と「","」の2パターンで試しても同じエラーでした。 また、気になる点としては、MySQLの文字セットはUTF-8のままでどうやって変更するのかがわかりません。 開発にphpは使用していなくても、phpmyadminを使用しているということはphp.iniの設定が必要ですよね? php.iniの設定は、権限が与えられていなければサーバー側で設定を行ってもらう必要があるのでしょうか?(初歩的な事ですみません) 試行錯誤していますが、解決法が分からず困っています。 どなたかご教示いただけませんでしょうか。 何卒よろしくお願い致します。

  • csvファイルをMySQLにインポートしたい

    phpでcsvファイルをフォルダにアップロードし、これをMySQLにインポートするプログラムを作成しています。 以下のソースを実行したところエラーが発生しました。 -----food.csv---------------------------------------------------------------------- "No","name","price" "1","うどん","100" "2","ぱすた","500" "3","カレー","300" ---------------------------------------------------------------------------------- -----BaseDAO.php------------------------------------------------------------------ <?php class BaseDAO{ function connect(){ try { $dsn = "mysql:host=localhost;dbname=food"; $option = array( // エラーモードを例外スローに設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // local ファイルからload可能にする PDO::MYSQL_ATTR_LOCAL_INFILE => true ); $user = 'username'; $password = 'password'; $pdo = new PDO($dsn, $user, $password, $option); $pdo->exec("SET NAMES utf8"); return $pdo; //var_dump($pdo); } catch (PDOException $ex) { print($ex->getMessage()); die("データベース接続に失敗しました"); } return null; } function disconnect($dao){ $dao = null; } } ?> ---------------------------------------------------------------------------------- ------uploadcsv.php----------------------------------------------------------------- <?php require_once 'BaseDAO.php'; //csvファイルのアップロード if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { //「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); //fileパス $file = "files/" .$_FILES["upfile"]["name"]; $sql_src = <<<SQL LOAD DATA LOCAL INFILE %s INTO TABLE `%s` CHARACTER SET sjis fields terminated by ',' enclosed by '"' lines terminated by '\\r\\n' IGNORE 1 LINES SQL; $table= 'food'; //テーブル名 $inport=new BaseDAO(); //インスタンス作成 $pdo=$inport->connect(); //pdoクラスに接続 $sql = sprintf($sql_src , $pdo->quote($file), $table); //sql文の実行 $stmt = $pdo->query($sql); echo "インポートが完了しました!"; //失敗したとき } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> -----index.html--------------------------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>sample</title> </head> <body> <form action="uploadcsv.php" method="POST" enctype="multipart/form-data"> ファイル:<br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> </form> </body> </html> ---------------------------------------------------------------------------------- --------foodテーブルを作成するSQL文------------------------------------------------ CREATE TABLE IF NOT EXISTS `food` ( `No` int(11) NOT NULL, `name` varchar(50) NOT NULL, `price` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ---------------------------------------------------------------------------------- 実行したところ以下のエラーが発生しました。 Warning: PDO::query() [pdo.query]: LOAD DATA LOCAL INFILE forbidden in C:\xampp\htdocs\food\uploadcsv.php on line 30 <当方のPC環境> phpMyAdmin:3.3.9 PHP: 5.3.5 Apache 2.2.17 MySQL 5.5.8 XAMPP version 1.7.4 フォルダ(files)にcsvファイルがアップロードされているところまでは確認できましたが、MySQLにインポートされていないようです。 BaseDAO.php内の「PDO::MYSQL_ATTR_LOCAL_INFILE => true」が効いていないように思えます。 初歩的な質問で凝縮ですが、原因を教えていただきたく存じます。

    • ベストアンサー
    • PHP

専門家に質問してみよう