MySQLのデータをファイルに出力する際、mysqldumpを使うのが一般的だが、全テーブルではなく特定のカラムや条件に合致するレコードだけをエクスポートしたい場合もある。
例えば、example_dbデータベース全体をダンプするには以下のように実行する:
mysqldump -u root -p example_db > example_db.sql
特定のテーブル(例:users)のみを出力する場合は:
mysqldump -u root -p example_db users > users_table.sql
しかし、テーブルが非常に大きい場合や必要なのは一部のカラムだけというケースでは、SELECT ... INTO OUTFILE構文が有効である。たとえば、usersテーブルからuser_idとusernameカラムのみを抽出してファイルに出力するには:
mysql -u root -p example_db -e "SELECT user_id, username FROM users INTO OUTFILE '/tmp/users_export.csv'"
ただし、MySQLが--secure-file-privオプション付きで起動されている場合、上記コマンドは次のようなエラーを返す可能性がある:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
この制限を確認するには、MySQLクライアント内で次のコマンドを実行する:
SHOW VARIABLES LIKE 'secure_file_priv';
出力されたパス(例:/var/lib/mysql-files/)にのみファイルを書き込めるため、コマンドを修正してそのディレクトリを使用する必要がある:
mysql -u root -p example_db -e "SELECT user_id, username FROM users INTO OUTFILE '/var/lib/mysql-files/users_export.csv'"
もしsecure_file_privの値がNULLの場合、ファイル出力が完全に無効になっている。この制限を解除するには、MySQLの設定ファイル(通常は/etc/my.cnfまたは/etc/mysql/my.cnf)の[mysqld]セクションに以下を追加し、MySQLを再起動する:
[mysqld]
secure_file_priv = /path/to/export/directory
さらに、WHERE句を用いて出力対象のレコードを絞り込むことも可能である。例えば、user_idが10より大きいレコードのみをエクスポートするには:
mysql -u root -p example_db -e "SELECT user_id, username FROM users WHERE user_id > 10 INTO OUTFILE '/var/lib/mysql-files/users_filtered.csv'"