Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

3.378 Aufrufe

Veröffentlicht am

MySQL Casual Talks vol.9の発表資料

Veröffentlicht in: Ingenieurwesen
  • Als Erste(r) kommentieren

カジュアルに本番データを開発環境に入れる #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. ありがとう ございました

×