Linux/Ubuntu 上の MySQL で SELECT 結果を CSV形式のファイルに出力する方法についての覚え書きです。
環境
Ubuntu 16.04 LTS
MySQL 5.7.22
方法
CSV形式のファイルに出力
SELECT文の最後に「INTO OUTFILE 〜」と続けて書いて、SELECT文の結果をカンマ区切りのCSV形式で保存します。
SELECT * FROM tb INTO OUTFILE '/tmp/select.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
これで /tmp にCSV形式のファイルとして保存されました。
Libreoffice等で開いてみると正常に表示されます。
–secure-file-privの設定
初回にSELECT文などの結果をCSVなどのファイルに保存しようとすると「–secure-file-priv」オプションによって実行できませんと表示されます。
SELECT * FROM tb INTO OUTFILE '/tmp/select.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
その場合には MySQL の設定を変更して再起動します。
# 設定変更 $ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf ... secure_file_priv="" # 再起動 $ sudo systemctl restart mysql
MySQL の再起動後にファイル出力のSQLを実行すると正常に実行されます。
パーミッションエラー
CSVファイルの出力先をホームディレクトリ下などに保存しようとするとパーミッションエラーが発生しました。
SELECT * FROM tb INTO OUTFILE '/home/akiyoshi/select.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'; ERROR 1 (HY000): Can't create/write to file '/home/akiyoshi/select.csv' (Errcode: 13 - Permission denied)
そういう場合は /tmp ディレクトリ直下に保存するようにすると問題なく保存できそうです。
この記事を読んだ人はこんな記事も読んでいます。
【Linux】MySQLのSELECT結果をCSVファイルで出力する方法