カジュアルに本番データを開発環境に入れる #mysqlcasual
TRANSCRIPT
![Page 1: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/1.jpg)
カジュアルに 本番データを
開発環境に入れるMySQL Casual Talks vol.9
@oinume
![Page 2: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/2.jpg)
自己紹介
๏ Kazuhiro Oinuma (@oinume)
๏ MySQL user since v3.23
๏ CyberAgent,Inc
๏ Ameba Ownd
![Page 3: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/3.jpg)
![Page 4: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/4.jpg)
๏ 簡単にオシャレなWebサイトが作れる
๏ ブログっぽいデザイン、キュレーションメディアのようなデザインなどカスタマイズも可能
๏ Starbucks, VOGUE, NIGO, etc…
![Page 5: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/5.jpg)
カジュアルに 本番データを
開発環境に入れる
![Page 6: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/6.jpg)
動機
๏ 開発環境でちゃんとしたテストデータを作るのつらい
๏ UGCかつデザインのバリエーションが多い
๏ 本番環境ディプロイ後に発見される不具合たち
![Page 7: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/7.jpg)
http://techlife.cookpad.com/entry/2014/10/03/110806
![Page 8: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/8.jpg)
本番データを開発環境に入れちゃおう
![Page 9: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/9.jpg)
DBサーバー構成
App
Replication
ELB
Slave
Master
調査用
RDS
![Page 10: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/10.jpg)
流れ๏ 1. 調査用のDBからmysqldump
๏ 2. 開発環境のDBにインポート
๏ 3. データを開発環境向けにUPDATE
๏ 上記をJenkinsのJobで毎日動かす
๏ あえてレプリケーション方式にはしなかった
๏ リアルタイム性は不要
๏ レプリが止まった時の対応が面倒そう
![Page 11: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/11.jpg)
補足๏ mysqldumpしたファイルのサイズは3GB弱ぐらい
๏ 小規模!!
๏ mysqldump するのに3分ぐらい
๏ dumpファイルをインポートするのに20分ぐらい
๏ MySQLのバージョンは5.6.19
๏ 5.7じゃなくてすいません(́・ω・`)
![Page 12: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/12.jpg)
第一段階mysqldumpしてインポートするだけなら簡単
![Page 13: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/13.jpg)
問題๏ mysqldumpしてからインポートするため、データが一度消えてしまう
๏ →開発環境独自に作ったデータが消えてしまう
๏ 対策:開発環境独自のレコードのidを+10億に
๏ AUTO_INCREMENTをずらす
![Page 14: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/14.jpg)
流れ v21. 調査用のDBからmysqldump
2. 開発環境DBでid >= 10億 のレコードをバックアップ
3. 1.の本番データを開発環境DBにインポート
4. データを開発環境向けにUPDATE
5. 2.でバックアップしたデータをリストア
6. 各テーブルのAUTO_INCREMENT値をずらす
![Page 15: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/15.jpg)
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}
![Page 16: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/16.jpg)
AUTO_INCREMENT のずらし方
๏ INFORATION_SCHEMAから各テーブルの現在のAUTO_INCREMENT値を取得
๏ ALTER TABLE {table} AUTO_INCREMENT=… でずらす
![Page 17: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/17.jpg)
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;
![Page 18: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/18.jpg)
INFORMATION_SCHEMA からAUの値を取得
+--------------------------------+----------------+ | table_name | auto_increment | +--------------------------------+-----------------+ | blog_posts | 900000 | | blog_post_categories | 250000 | | pages | 590000 |
…
※数字はフィクションです
![Page 19: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/19.jpg)
AUTO_INCREMENTずらす
ALTER TABLE {table} AUTO_INCREMENT=…
![Page 20: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/20.jpg)
よかったこと๏ 不具合が本番ディプロイ前に発見しやすくなった
๏ 機能追加・修正のイメージがしやすくなった
๏ ユーザーと同等の体験をして開発できる
๏ 開発時に重いクエリに気付きやすくなった
๏ ALTER TABLEする場合にどのぐらい時間がかかるか簡単に試せる
![Page 21: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/21.jpg)
カジュアルに本番データを開発環境に入れちゃおう
![Page 22: カジュアルに本番データを開発環境に入れる #mysqlcasual](https://reader034.vdocuments.mx/reader034/viewer/2022042505/588626ad1a28ab8f2c8b6197/html5/thumbnails/22.jpg)
ありがとう ございました