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については下記記事にまとめたので細かいことは省きます。
参考
MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1.1 mysql のオプション
mysql - Exporting table from Amazon RDS into a csv file - Stack Overflow