MySQLで特定のカラムや条件付きデータをファイルにエクスポートする方法

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_idusernameカラムのみを抽出してファイルに出力するには:

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'"

タグ: MySQL mysqldump INTO OUTFILE secure_file_priv データエクスポート

6月22日 20:14 投稿