JAWS ミート 〜Re:Born 東海道〜 2022/7/9
Aurora MySQL v1 → v3 移行で気を付けたほうが良いこと(7 つ + α)JAWS ミート 〜Re:Born 東海道〜2022/7/9まつひさ(hmatsu47)
View Slide
自己紹介松久裕保(@hmatsu47)● https://qiita.com/hmatsu47名古屋で Web インフラのお守り係をしていますMySQL 8.0 の薄い本を作って配っていました○ https://qiita.com/hmatsu47/items/ceb75caf46e3c761095d○ GitHub リポジトリの他、印刷版を BOOTH で配布していました○ 2021/5 発行の 8.0.24 対応版を最後に更新停止しました2
本日のネタ● Aurora MySQL v1(5.6 互換)EoL 発表○ https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.MySQL56.EOL.html● 2023/2/28 までに v2 または v3 へ移行が必要○ せっかく移行するなら v3 へ● ただいま移行に向けて作業中→気を付ける点は?3
Aurora MySQL v1 の EoL までの流れ(一応)● 2022/9/27 : 新規クラスタ等作成停止○ 以下は(EoL まで)実行可能■ v1 スナップショットの復元■ クラスタにリードレプリカ追加■ インスタンス設定変更 など● 2023/2/28 : EoL(予定)※時刻は 00:00:00 UTC4
v3 移行で気を付ける点● v1 → v2 と比べると結構たくさんある● ただし本日は網羅的な話はしない● 面倒なことになりやすい点だけピックアップ5
https://zenn.dev/hmatsu47/books/aurora-mysql3-plan-book移行全体の話は Zenn の本で6
気を付ける点① 予約語● テーブル名・列名と被る場合→要バッククォート● マイナーバージョンアップでも追加の可能性○ MySQL 8.0(Aurora MySQL v3 )から方針変更● ORM・クエリビルダの機能で対応可ならそれを使ってバッククォート対応する7
気を付ける点② 結果の(暗黙)ソート● GROUP BY … ASC/DESC 廃止○ GROUP BY & 同じ列を指定した ORDER BY と等価● GROUP BY(ORDER BY なし)ソート順不定○ 以前は GROUP BY … ASC と同じ結果に● GROUP BY / ORDER BY 無指定○ 主キー順 or 使用インデックス順→本来は不定8
気を付ける点③ 一時テーブル● CREATE TEMPORARY TABLE● Reader でディスクに書き出し不可○ 「ENGINE=」の指定に制約○ 一時テーブル用メモリ容量不足の恐れ○ https://aws.amazon.com/jp/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/9
気を付ける点④ 内部一時テーブル● こちらは UNION の処理などで内部的に使われる一時テーブルの話● CREATE TEMPORARY TABLE 同様、Reader でのディスク書き出し不可○ メモリ容量不足の恐れあり10
気を付ける点⑤ 接続用ライブラリ● 公式 Connector と非公式ライブラリがある● いずれにせよバージョンアップ時に挙動が変わる可能性がある○ 例:ON UPDATE CURRENT_TIMESTAMP 列に MySQLConnector/J にて null で更新→ OK だったのが NG に■ explicit_defaults_for_timestamp 有効時11
気を付ける点⑥ レプリケーション(移行時)● 3 バージョン間レプリケーション→サポート外に○ MySQL 5.6 → 8.0 のレプリケーションも● 切り戻し方向を考えれば移行は DMS 使用が妥当● DMS : time・float 列がそのままでは移行不可○ テーブルマッピングで該当列の型変換を個別指定する■ 精度(桁数)指定ありの float は NG12
気を付ける点⑦ 管理系の情報● Information Schema / Performance Schema○ MySQL 5.7 で sys スキーマ追加導入、8.0 で再編○ かなり変化しているので先の本でも対象外に● 管理情報を使って自動化をしている場合は要注意○ 自動化していなくても情報の見方が変わる点に注意○ Performance Insights の待機イベントも変化13
おまけ : COUNT(*) が失速する New!!● MySQL 8.0.14 から COUNT(*) が並列処理可に● 実際には失速した○ CPU 使用率が 100% に■ でも Performance Insights では接続数分の負荷しかない謎○ バッファプールに載っているのに Disk 読んでる?■ MySQL の既知の不具合っぽい挙動(本家では解決済み)14
番外 : 組織内ロストテクノロジー化● 注 : もちろん本来の意味ではない● 近年、「メールが分かる」技術者が減少○ 雰囲気でメールを送受信している● RDBMS についてもそれに近づきつつある○ 技術を理解しているメンバー不在←つらい■ 修正対応プロジェクトで割と話が伝わりづらい15
まとめ● 結論:がんばりましょう○ AWS と MySQL の知識の両方が必要です○ くれぐれも無理はしないように○ ノールックバージョンアップは、運が良ければ行けるかもしれませんが事故ると死にます16