環境
- MySQL 5.6.29
- rootパスワードなし
追記
シェルスクリプトじゃなくても、--skip-extended-insert
付けるだけでよいとのこと😇
$ mysqldump -uroot -t --compact --skip-extended-insert db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');
INSERT INTO `table_name` VALUES (2,'2016-12-25 12:06:22');
INSERT INTO `table_name` VALUES (3,'2016-12-25 12:06:22');
@eiryu --skip-extended-insertじゃダメなんです?
— かずひら (@kazuhira_r) 2016年12月25日
#!/bin/sh
DB_NAME=db_name
TABLE_NAME=table_name
for id in `mysql -uroot $DB_NAME -N -e "select id from $TABLE_NAME order by 1"`
do
command="mysqldump -uroot -t --compact $DB_NAME $TABLE_NAME --where='id=$id'"
eval $command
done
mysqldumpは、普通に使うとバルクインサート状態で結果を出力する。
$ mysqldump -uroot -t --compact db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');
$ mysql -uroot db_name -e "show create table table_name\G"
*************************** 1. row ***************************
Table: table_name
Create Table: CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
しかし、--where
を使うと条件に合致するレコードのみ出力することが出来る。
$ mysqldump -uroot -t --compact db_name table_name --where='id=1';
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');
それを利用して対象テーブルのidを昇順に取りだし、順次mysqldumpでテーブル指定して--where
に渡しているだけ。
注意点は、idを取り出すときに列名を取り出さないように-N
オプションを付けていること。これがないと、ループの初回で--where=id=id
となり、この状態だと全件バルクインサートで出力される。--where=id=0
などのレコードが存在しない条件だと何も出力されないのだが、なぜか先述の場合は全件出力される。
$ mysqldump -uroot -t --compact db_name table_name --where='id=id'
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');
$ mysqldump -uroot -t --compact db_name table_name --where='id=0'
$ # 出力無し