web-dev-qa-db-ja.com

MySQLデータをファイルに出力できません

MySQLテーブルからファイルにデータを出力しようとしていますが、権限エラーが発生しています。

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

問題のディレクトリが777にchmoddedされている場合、MySQLユーザーがファイルを書き込めないのはなぜですか?興味深いことに、/ tmp /にも書き込むことができません。

編集: DBユーザーが適切なMySQL権限を持っているようです:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
13
dotancohen

MySQLドキュメントによると SELECT ... INTO OUTFILE

INTO OUTFILEまたはINTO DUMPFILEによって作成されたファイルは、サーバーホスト上のすべてのユーザーが書き込み可能です。これは、MySQLサーバーが実行しているアカウントのユーザー以外のユーザーが所有するファイルを作成できないためです。 (この理由およびその他の理由で、mysqldをrootとして実行してはなりません。)したがって、ファイルは内容を操作できるように、誰でも書き込み可能でなければなりません。

次のようにSELECT INTO OUTFILEを/ var/lib/mysqlに出力する必要があります

SELECT * FROM data INTO OUTFILE 'data.csv';

もちろん、gs @ localhostに対するFILE権限があることを確認する必要があります。

この許可を与えるには2つの方法があります

方法#1

GRANT FILE ON *.* TO 'gs'@'localhost';

方法#2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
FLUSH PRIVILEGES;

UPDATE 2012-05-01 07:09 EDT

自分にFILE特権を与えるには、次のようにします。

  • ステップ01)service mysql restart --skip-networking --skip-grant-tables
  • ステップ02)mysql <hit enter>
  • ステップ03)UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
  • ステップ04)exit
  • ステップ05)service mysql restart
12
RolandoMySQLDBA

異なるディストリビューションとOSはすべて、OUTFILEのdestinationsを同じように処理するわけではありません。

たとえば、ソケットを使用するLinuxでmysqldデーモンを実行すると、OUTFILEが/tmpディレクトリ。大したことではありません。それは、OUTFILEアプローチを使用しているだけです。つまり、権限を処理し、ファイルがどこに移動したかを見つけるという欠点があります。

この質問の目的は特に「OUTFILEの使用方法」ではないため、一部のMySQLデータをファイルにキャプチャすることだけを目的としているため、FILE権限などをいじる必要がない別の方法を次に示します。 。

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

この出力は、デフォルトではタブ区切りです。コンマの場合は、ファイルに書き込む前にsedまたは何かを介してパイプします。

1
AaronDanielson

このページとStackOverflowの他の多くのページの提案を理解するために何時間も費やしました。

MySqlでアクセス許可をどのように変更しても、何も動作しませんでした。

元の権限に戻しました。

最終的に私のために働いたものは他の人の提案より簡単でした:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv

1
Ryan

上記のCSV(実際にはTSVである必要があります)にデータを出力するための2つの方法について、空の値がエントリにある場合、エクスポートしている場合、対応する列へのデータの誤った割り当てにより、データがめちゃくちゃになる可能性があります。

回復のためのデータの整合性を懸念して、私はこのウェブサイトを見つけました:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

mysqldump--xmlオプションを使用すると、データをXML形式にエクスポートでき、カスタムスクリプトでTSVを含む必要な形式に解析できます。

0
Nguyen H Chan