Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,161 views

Published on

MySQL Casual Talks vol.9の発表資料

Published in: Engineering

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

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

×