AmazonのCloud9を使っています。データベースはMySQLです。
MySQLでの検索結果をテキストファイルに落としたいなーと思って。select文を発行すると件数がめちゃくちゃ多くて(1000件とか!)、Cloud9のターミナル上では全部表示できないのよ。
参考になるページを見つけてやってみたんだけど、ちょっとハマったのでメモっておくわ。
SELECT INTO OUTFILEを使う方法
SELECT * FROM テーブル INTO OUTFILE ‘ファイル名’;
を試してみたんだけど、エラーが出ちゃった。
$ mysql -u root
mysql USE データベース名;
ってやって、
ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement
うーん、エラーメッセージがよくわかんないけど、サーバオプションのsecure_file_privが設定されていると、指定したディレクトリ以外への出力が禁止されるらしい。セキュリティ的な理由なのね。
以下のSQL文を発行して、secure_file_privがどこを許可しているか確認してみるわ。
+———————+
| @@secure_file_priv |
+———————+
| /var/lib/mysql-files/ |
+———————+
1 row in set (0.00 sec)
なるほど、/var/lib/mysql-files/っていうディレクトリにしか出力できないみたい。なのでSQL文を以下のように書き換えるわ。
Query OK, 1146 rows affected (0.02 sec)
これで出力できたかな?って思って、上記のディレクトリにcdコマンドで移動してみるわ。
bash: cd: /var/lib/mysql-files/: Permission denied
えー!権限がないって言われちゃった。せっかく出力したテキストファイルが取得できないじゃないですかー!😭
ということで、他の方法も探してみることにしたわ。
teeとnoteeを使ってファイル出力する方法
今度はちゃんとできました!🙌
mysql USE データベース名;
ってやって、
>mysql select * from users;
>mysql notee
以下のような表示になるわ。
Logging to file ‘dump.txt’
>mysql select * from users;
1146 rows in set (0.00 sec)
mysql> notee
Outfile disabled.
mysql> exit;
すると、いまいるディレクトリ配下にdump.txtっていうファイルができてます!やったー!🎉
teeコマンドとnoteeコマンドについて
teeコマンドは、標準出力をファイルに書き出すと同時に、ターミナルにも表示するコマンドなの。noteeコマンドは、teeコマンドを停止させるコマンドよ。これらを組み合わせることで、MySQLのクエリ結果をファイルに保存しつつ、ターミナルでも確認できるから便利なの。
SELECT INTO OUTFILEとteeの使い分け
SELECT INTO OUTFILEは、MySQLサーバがアクセスできるディレクトリに直接ファイルを出力する方法。teeコマンドは、MySQLクライアントから標準出力をファイルにリダイレクトする方法よ。secure_file_privの設定によっては、SELECT INTO OUTFILEが使えない場合があるから、その場合はteeコマンドを使うのがおすすめね。
補足:MySQLの権限について
/var/lib/mysql-files/ディレクトリへのアクセス権がない場合は、MySQLのユーザにそのディレクトリへの書き込み権限を付与する必要があるわ。ただし、セキュリティ上のリスクもあるので、慎重に検討してね。権限の付与方法は、LinuxのコマンドやMySQLの設定ファイルなどを利用して行うことができるわ。
てことで以上です。

