本番に近いテスト用DBを用意したい

本番のDBがあったとして、それに近いデータでテストすることは大変重要!
本番なら気づけたのにな〜!というのが格段に減る。
でも本番のデータをコピーして使うのは怖い場合があって(例えば個人情報)、万が一お漏らししても問題のないようにマスキングして使いたい。
そんなことを考える、個人的なメモ。

DBの構成

本番とテスト(staging)があるとするじゃろ。

hoge_prod が本番用DBのホスト、 hoge_stgがテスト用DBのホストじゃ。

テーブル

create table employees (
id BIGINT NOT NULL AUTO_INCREMENT,
name varchar(100),
email varchar(100),
secret_num INT,
PRIMARY KEY (id));

テストデータ

insert into employees (name, email, secret_num) values ("kaiba", "[email protected]", 1234);
insert into employees (name, email, secret_num) values ("waketi", "[email protected]", 222);
insert into employees (name, email, secret_num) values ("ematette", "[email protected]", 123);
+----+----------+--------------------------+------------+
| id | name | email | secret_num |
+----+----------+--------------------------+------------+
| 1 | kaiba | [email protected] | 1234 |
| 2 | waketi | [email protected] | 2222 |
| 3 | ematette | [email protected] | 123 |
+----+----------+--------------------------+------------+

本番のデータをコピーする

巨大なDBであれば、スナップショットをコピーしてやるのが良いですが、mysqlのuserテーブルも本番のものになるので、テスト用のユーザにして変更し直す必要があります。
小さいDBであればmysqldumpでテスト対象のDBだけ上書きしてやるのが楽。
本番をdumpして、テストに流す。逆にすると死にます。

mysqldump -uprod_user -p******* -hhoge_prod my_database | mysql -utest -pTEST -hhoge_stg my_database

まずいデータをマスクする

update employees set name=concat("name",id), 
email=concat("dev+",id,"@example.com"), 
secret_num=1111;
+----+-------------------+-------------------+------------+
| id | name | email | secret_num |
+----+-------------------+-------------------+------------+
| 1 | name1 | [email protected] | 1111 |
| 2 | name2 | [email protected] | 1111 |
| 3 | name3 | [email protected] | 1111 |
+----+-------------------+-------------------+------------+

やったぜ。
concatでidと結合してやるのがミソ。

という個人的なメモでした。