本番に近いテスト用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", "kaiba@kaibacorp.co.jp", 1234);
insert into employees (name, email, secret_num) values ("waketi", "waketi@kaibacorp.co.jp", 222);
insert into employees (name, email, secret_num) values ("ematette", "ematette@kaibacorp.co.jp", 123);
+----+----------+--------------------------+------------+
| id | name | email | secret_num |
+----+----------+--------------------------+------------+
| 1 | kaiba | kaiba@kaibacorp.co.jp | 1234 |
| 2 | waketi | waketi@kaibacorp.co.jp | 2222 |
| 3 | ematette | ematette@kaibacorp.co.jp | 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 | dev+1@example.com | 1111 |
| 2 | name2 | dev+2@example.com | 1111 |
| 3 | name3 | dev+3@example.com | 1111 |
+----+-------------------+-------------------+------------+

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

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

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL