カジュアルに本番データを開発環境に入れる #mysqlcasual
TRANSCRIPT
カジュアルに 本番データを
開発環境に入れるMySQL Casual Talks vol.9
@oinume
自己紹介
๏ Kazuhiro Oinuma (@oinume)
๏ MySQL user since v3.23
๏ CyberAgent,Inc
๏ Ameba Ownd
๏ 簡単にオシャレなWebサイトが作れる
๏ ブログっぽいデザイン、キュレーションメディアのようなデザインなどカスタマイズも可能
๏ Starbucks, VOGUE, NIGO, etc…
カジュアルに 本番データを
開発環境に入れる
動機
๏ 開発環境でちゃんとしたテストデータを作るのつらい
๏ UGCかつデザインのバリエーションが多い
๏ 本番環境ディプロイ後に発見される不具合たち
http://techlife.cookpad.com/entry/2014/10/03/110806
本番データを開発環境に入れちゃおう
DBサーバー構成
App
Replication
ELB
Slave
Master
調査用
RDS
流れ๏ 1. 調査用のDBからmysqldump
๏ 2. 開発環境のDBにインポート
๏ 3. データを開発環境向けにUPDATE
๏ 上記をJenkinsのJobで毎日動かす
๏ あえてレプリケーション方式にはしなかった
๏ リアルタイム性は不要
๏ レプリが止まった時の対応が面倒そう
補足๏ mysqldumpしたファイルのサイズは3GB弱ぐらい
๏ 小規模!!
๏ mysqldump するのに3分ぐらい
๏ dumpファイルをインポートするのに20分ぐらい
๏ MySQLのバージョンは5.6.19
๏ 5.7じゃなくてすいません(́・ω・`)
第一段階mysqldumpしてインポートするだけなら簡単
問題๏ mysqldumpしてからインポートするため、データが一度消えてしまう
๏ →開発環境独自に作ったデータが消えてしまう
๏ 対策:開発環境独自のレコードのidを+10億に
๏ AUTO_INCREMENTをずらす
流れ v21. 調査用のDBからmysqldump
2. 開発環境DBでid >= 10億 のレコードをバックアップ
3. 1.の本番データを開発環境DBにインポート
4. データを開発環境向けにUPDATE
5. 2.でバックアップしたデータをリストア
6. 各テーブルのAUTO_INCREMENT値をずらす
id >= 10億 のレコード のみmysqldump
$ mysqldump -h {db_host} -P {db_port} \ -u{db_user} -p{db_password} \ ̶no-create-info \ ̶order-by-primary \ ̶default-character-set=utf8mb4 \ ̶insert-ignore \ ̶where “id >= 10億” {db_name} {table}
AUTO_INCREMENT のずらし方
๏ INFORATION_SCHEMAから各テーブルの現在のAUTO_INCREMENT値を取得
๏ ALTER TABLE {table} AUTO_INCREMENT=… でずらす
INFORMATION_SCHEMA からAUの値を取得
SELECT t.table_name, t.auto_increment FROM information_schema.tables AS t INNER JOIN information_schema.columns AS c ON t.table_name = c.table_name WHERE t.table_schema = '{db_name}' AND c.table_schema = ‘{db_name}' AND t.auto_increment IS NOT NULL AND c.column_key = 'PRI' /* 主キーのみ対象 */ ORDER BY t.table_name;
INFORMATION_SCHEMA からAUの値を取得
+--------------------------------+----------------+ | table_name | auto_increment | +--------------------------------+-----------------+ | blog_posts | 900000 | | blog_post_categories | 250000 | | pages | 590000 |
…
※数字はフィクションです
AUTO_INCREMENTずらす
ALTER TABLE {table} AUTO_INCREMENT=…
よかったこと๏ 不具合が本番ディプロイ前に発見しやすくなった
๏ 機能追加・修正のイメージがしやすくなった
๏ ユーザーと同等の体験をして開発できる
๏ 開発時に重いクエリに気付きやすくなった
๏ ALTER TABLEする場合にどのぐらい時間がかかるか簡単に試せる
カジュアルに本番データを開発環境に入れちゃおう
ありがとう ございました