狠狠撸

狠狠撸Share a Scribd company logo
カジュアルに
本番データを
開発環境に入れる
MySQL Casual Talks vol.9
@oinume
自己紹介
? Kazuhiro Oinuma (@oinume)
? MySQL user since v3.23
? CyberAgent,Inc
? Ameba Ownd
カジュアルに本番データを開発環境に入れる #mysqlcasual
? 簡単にオシャレな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をずらす
流れ v2
1. 調査用の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}
础鲍罢翱冲滨狈颁搁贰惭贰狈罢=… でずらす
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} 础鲍罢翱冲滨狈颁搁贰惭贰狈罢=…
よかったこと
? 不具合が本番ディプロイ前に発見しやすくなった
? 機能追加?修正のイメージがしやすくなった
? ユーザーと同等の体験をして開発できる
? 開発時に重いクエリに気付きやすくなった
? ALTER TABLEする場合にどのぐらい時間がかか
るか簡単に試せる
カジュアルに本番データを
開発環境に入れちゃおう
ありがとう
ございました

More Related Content

カジュアルに本番データを開発環境に入れる #mysqlcasual