oinume journal

Scratchpad of what I learned

mysqldumpで特定のレコードだけエクスポートする

忙しい人向けまとめ

  • mysqldumpの--whereオプションを使うと特定のレコードだけmysqldumpできる
  • --whereにはLIMIT句も指定できる
  • --whereオプションで大量のデータから一部だけをmysqldumpすることが可能

本文

mysqldump、データだけエクスポートしたりCREATE TABLEだけエクスポートできたり細かいところまで気が利いているなぁと思うツール。今日知ったのは --whereでdumpするレコードを限定できるよ、ということ。さらに、--whereにはLIMITも指定できるので、「特定の条件にマッチするレコード100件だけ」みたいなエクスポートもできる。

以下、具体例。

$ mysql -u <user> -p<password> <database>

mysql> CREATE TABLE hoge (
  id INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

mysql> INSERT INTO hoge VALUES (1, 'foo'), (2, 'bar'), (3, 'baz');

こんな感じでレコードを作って、--where 'id=1'を指定してmysqldumpしてみる。

$ mysqldump -u<user> -p<password> <database> hoge --where 'id=1'

(snip)
LOCK TABLES `hoge` WRITE;
/*!40000 ALTER TABLE `hoge` DISABLE KEYS */;
INSERT INTO `hoge` VALUES (1,'foo');
/*!40000 ALTER TABLE `hoge` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
(snip)

id=1のレコードだけmysqldumpされる。では次にORDER BYとLIMITをつけてみる。

$ mysqldump -u <user> -p<password> <database> hoge --where 'id>=2 ORDER BY id DESC LIMIT 1'

(snip)
INSERT INTO `hoge` VALUES (3,'baz');
(snip)

となって、idの降順でソートして1件だけmysqldumpができた。

まとめ

プログラムの動作検証のためにデータをmysqldumpしたいけど、本番データだとレコード数が多くて丸ごとmysqldumpするのがつらい時に--whereをつけると幸せになれるはず。