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


13

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)

2
ディレクトリツリー全体でMySQLにアクセス権を付与する必要があります。inMySQLにアクセスできない場合、権限を付与しても意味がありませんdotanchoen。言い換えれば、銀行の金庫の安全保管箱は大きく開いたままにすることができますが、銀行の金庫のドアがロックされている場合は、箱に入れません。あなたのgsユーザーは、mysqlの持っている必要がありFILE、実際にそのクエリを実行するための権限を。

問題は、パーマを選択していない可能性があることですか?Mysqlのアクセス許可は、ディレクトリのアクセス許可によって制御されません。特定のmysqlユーザーとして実行するには、mysql -u <username> -pを使用する必要があります。ユーザーがデータベースにアクセスできるようにするには、MySqlの許可を見てください。dev.mysql.com/doc/refman/5.1/en/grant.html

ありがとう、このユーザーにはSELECT権限があります。私はしばしばこのユーザーとしてデータベースを閲覧します。
-dotancohen

ありがとう、マーク、それが私が恐れていたものです。だから私は他のユーザーが私のホームディレクトリにも読み書きできるようにすることなく、他のユーザーが書き込むことができる「受信トレイ」フォルダを持つことはできませんか?
-dotancohen

2
ユーザーがMySQL docsでFILE説明されている特権を持っていることを確認します
マイクパーセル

回答:


12

SELECTの MySQLドキュメントによると... OUTO 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;

更新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

ありがとう。の出力で質問を更新しましたSHOW GRANTS。DBユーザーには適切な権限が必要なようです。
-dotancohen

DBユーザーには適切な権限がありません。FILE権限だけを持つユーザーに与えられているGRANT ALL PRIVILEGES ON *.*だけのよう、RELOADSHUTDOWN。これは、これらがグローバルな管理特権であるためです。GRANT ALLあなたが持っている権限があるためgsにのみデータベース。
RolandoMySQLDBA

1

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

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

この質問の目的は具体的には「OUTFILEの使用方法」ではなく、MySQLデータをファイルにキャプチャすることだけを目的としているため、FILEパーミッションなどをいじる必要のない代替方法があります。 。

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

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


1

このページとStackOverflowの他の多くのページの提案を理解しようとして、何時間も費やしました。

MySqlでパーミッションをどのように変更しても、何も機能しませんでした。

元の権限に戻しました。

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

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


1
このメソッドは、Bash CLI上で使用するのに適しています。ただし、OPの質問では、MySQLクライアントCLIからファイルにデータを出力する方法について質問しています。
-dotancohen

0

上記のCSV(実際はTSV)にデータを出力する2つの方法に関して、エクスポートするエントリに空の値がある場合、対応する列へのデータ。

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

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

--xmlオプションでmysqldumpは、データをXML形式にエクスポートし、カスタムスクリプトでTSVなどの必要な形式に解析できることを説明しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.