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)
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;
自分にFILE特権を与えるには、次のようにします。
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
exit
service mysql restart
異なるディストリビューションと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
または何かを介してパイプします。
このページとStackOverflowの他の多くのページの提案を理解するために何時間も費やしました。
MySqlでアクセス許可をどのように変更しても、何も動作しませんでした。
元の権限に戻しました。
最終的に私のために働いたものは他の人の提案より簡単でした:
echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv
上記のCSV(実際にはTSVである必要があります)にデータを出力するための2つの方法について、空の値がエントリにある場合、エクスポートしている場合、対応する列へのデータの誤った割り当てにより、データがめちゃくちゃになる可能性があります。
回復のためのデータの整合性を懸念して、私はこのウェブサイトを見つけました:
https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/
mysqldump
の--xml
オプションを使用すると、データをXML形式にエクスポートでき、カスタムスクリプトでTSVを含む必要な形式に解析できます。