Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQL5.6から8.4へ 戦いの記録

MySQL5.6から8.4へ 戦いの記録

CakePHPとGoで構築された社内ユーザー向けシステムのデータベースをMySQL5.6から8.4へアップグレードしました。
その旅路は非常に困難で苦難の連続でした。

このトークではMySQLのバージョンによる仕様的な話は多くは語りません。
代わりに、下記の点をお話します。
・なぜMySQL5.6から8.4へアップグレードしたのか
・リスク最小化のための方針
・対応した内容
・アップグレード当日の対応手順と失敗時の手順

社内向けとはいえ、基本的にはデータベースを止めることができない中でどう検証し、何が大変だったかをご紹介します。

Avatar for Koji Yoshida

Koji Yoshida

June 26, 2025
Tweet

More Decks by Koji Yoshida

Other Decks in Technology

Transcript

  1. 2 ⾃⼰紹介 事業戦略部 新規開発チーム 2024年 中途⼊社 よしだ @theyoshida3 • GMOクリエイターズネットワーク株式会社 •

    GMOペパボの可愛い妹分 • 好きなお酒はメガジョッキハイボール • 最近はPHPとGoを使うことが多い
  2. • 概要 • rank, groups, windowなどが新たに予約語として追加 • `(バッククォート)でエスケープして回避可能 • 対応

    • 各DBにgroupsテーブルが存在し、将来的にDB統合の予定 • テーブル名変更とコード修正 先⾏対応 17 予約語
  3. • 概要 • SELECT team_id, name FROM users GROUP BY

    team_id;はエラー • ONLY_FULL_GROUP_BYをオフにすることで回避はできる • ANYVALUEという関数も存在する • 対応 • 該当箇所があり、任意の値で良いケースが存在しない • クエリを修正 先⾏対応 18 GROUP BY厳格化
  4. • 概要 • 不正な値を⾒逃さないモード • 例) NOT NULLでDEFAULTなしのカラムを値指定しないでinsertするとエラー • STRICT_MODEをオフにすることで回避はできる

    • 対応 • カラムにDEFAULT値を指定 • オンラインDDLに対応していないため実施タイミングに注意 先⾏対応 19 STRICT MODE
  5. • 概要 • DATE型へ「0000-00-00」, DATETIME型へ「0000-00-00 00:00:00」などはエラー • STRICT MODE, NO_ZERO_DATEをオフにすることで回避はできる

    • 対応 • Goのtime.Time型は「0001-01-01」が初期状態、そのまま保存していた • *time.Timeへ変更しnilを許容 • カラムのNOT NULLをNULL許容に変更 • オンラインDDLに対応していないため実施タイミングに注意 • 保存済みのデータをnullに変更するクエリ実⾏ 先⾏対応 20 ゼロ⽇付
  6. • メンテナンスモードへ移⾏ • バッチ停⽌ • DBバックアップ • MySQLアップグレード • 動作確認

    • バッチ再開 • メンテナンス解除 • IaC辻褄合わせ • redash動作確認 アップグレード当⽇ 25 作業⼿順
  7. • DBインスタンスのメンテナンス後に接続できなくなる報告あり • Cloud Runの再デプロイ、Cloud SQL Studio(コンソール)でのログインで復旧 • 発⽣するのは下記の組み合わせ •

    Cloud SQL Proxyを使⽤したUnixソケット接続 • caching_sha2_password認証プラグインでの接続 おまけ 31 Cloud Run × Cloud SQL for MySQL8.4でDBに接続できなくなる?