MySQLで、
- CSVインポート
- CSVエクスポート
- mysqldump(書き出し)
- mysqldump(読み込み)
のコマンド、たまに使うけど毎回「なんだっけ、、?」となる上に、同時に叩くことが多いので、一箇所に集約
CSVのインポート
load data local infile "ファイル名"
into table テーブル名
fields terminated by '区切り文字'
optionally enclosed by '囲み文字'
(column1, column2); # 読み込みたいカラム名
以下のようなエラーが出て失敗する場合は、
ERROR 1148: The used command is not allowed with this MySQL version
--local-infile=1
をつけてmysqlクライアントを起動すればいい
(参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.6 LOAD DATA LOCAL のセキュリティーの問題 )
CSVのエクスポート
select フィールド名
from テーブル名
into outfile ’出力したいファイル名’
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とかならば以下のような対処で
[ MySQL ] データをCSVでエクスポートしようとして、secure-file-privに引っかかった件 - Qiita
mysqldump(書き出し)
mysqldumpの出力結果は、結局のところそのデータベースやテーブルの状態を再現するための「SQL文」であることを念頭に置く。
オプションは適宜調べる。
よく使うのは、-d
:定義のみのdump、-t
:テーブル作成しない、-n
:DB作成しない、だろうか。
すべてのDBをdump
mysqldump -u USER_NAME -p -h HOST_NAME -A -n > OUTPUT_FILE_NAME
DBを指定してdump
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME1 > OUTPUT_FILE_NAME
複数DB指定したい場合は以下のように(-B
オプション)
mysqldump -u USER_NAME -p -h HOST_NAME -B DB_NAME1 [DB_NAME2 ...] > OUTPUT_FILE_NAME
テーブルを指定してdump
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME > OUTPUT_FILE_NAME
複数テーブル指定したい場合は以下のように
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME1 [TABLE_NAME2 ...] > OUTPUT_FILE_NAME
mysqldump(読み込み)
bashからmysqlコマンドで
mysql -u USER_NAME -p -h HOST_NAME DB_NAME < OUTPUT_FILE_NAME
mysqlクライアントが起動している状態でsource
mysqlクライアントをすでに立ち上げている場合だとこっちも便利
mysql> source OUTPUT_FILE_NAME;
TODO
たいてい毎回こういうコマンドをコピペして微妙に書き換えて実行するので、タイポしたりして失敗してフラストレーション溜まる…
DB名とかテーブル名とか入力させる対話式のシェルスクリプト作るのもありかも。