箱のプログラミング日記。

えんじにあ奮闘記

【MySQL】SELECT文の結果をCSVファイルにエクスポート

MySQLでSELECT文の結果をCSVファイルにエクスポートしようとした時に少しハマったのでメモ。

発生したエラー

いつものようにMySQLにログインして、こちらの記事を参考にSELECT文の結果をCSVファイルにエクスポートしようとしたところ

mysql>SELECT name FROM users INTO OUTFILE '~/export.csv' ;
ERROR 1045 (28000): Access denied for user 'hoge_user'@'%' (using password: YES)

怒られた。

hoge_userの部分はMySQLのユーザー名で、要はこのユーザーにはファイルの書き込み権限がないからエクスポートできないよという内容らしい。

解決:ログインせず外から実行

エラー文でググったところ、ユーザーの権限を変える方法とかもあったのですが本番DBのため安易に変えるのが嫌だなと思い下記の形で落ち着きました。

$ mysql -u hoge_user -p password -h host -D DB_NAME -e "SELECT name FROM users" > ~/export.csv

ログインせず外から。

-eオプションにSELECT文を渡して無事エクスポートができました。

ちなみに

最初、下記のようなコマンドを実行してエクスポートされたCSVファイルを見ると中身が空の状態になってしまい、なんでだろう...とすごく悩んでしまったのだが

誤)

$ mysql -u hoge_user -p password -h host -D DB_NAME -e "SELECT name FROM users WHERE birthday = "1990-01-01" AND ......" > ~/export.csv

エスケープしてないだけだった。

正)

$ mysql -u hoge_user -p password -h host -D DB_NAME -e "SELECT name FROM users WHERE birthday = \"1990-01-01\" AND ......" > ~/export.csv

特にエラーにならず空のCSVファイルが生成されるようなので注意。

カラム名を除きたい

※2021/05/10追記

SELECT文の結果は通常最上列がカラム名になっているが、除きたい場合は-Nオプションを使用する。

$ mysql -u hoge_user -p password -h host -D DB_NAME -N -e "SELECT id, name FROM users" > ~/export.csv

区切り文字にカンマを指定したい

※2021/05/10追記

「MySQL」「区切り文字」とかでググるとFIELDS TERMINATED BYでカンマを指定する方法がヒットするが、こちらはSELECT ... INTO OUTFILEのオプションのため今回の場合は使えない。

ということでちょっとめんどいのだけどawkを使いました。

$ mysql -u hoge_user -p password -h host -D DB_NAME -e "SELECT id, name FROM users"  \
| awk -v OFS="," '{print $1,$2}' >> ~/export.csv

awkについては下記記事にまとめたので細かいことは省きます。

awkコマンドを使ってみた - 箱のプログラミング日記。

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1.1 mysql のオプション

mysql - Exporting table from Amazon RDS into a csv file - Stack Overflow

MySQLのデータをCSVに吐こうとするとエラーになる。 - H_Yamaguchiのブログ