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

さいきんの MySQL との付き合い方 〜 MySQL 8.0 より後の世界へようこそ 〜

hmatsu47
February 22, 2025

さいきんの MySQL との付き合い方 〜 MySQL 8.0 より後の世界へようこそ 〜

PHP カンファレンス名古屋 2025
2025/2/22 ルーム シンフォニー 14:45 〜

hmatsu47

February 22, 2025
Tweet

More Decks by hmatsu47

Other Decks in Technology

Transcript

  1. 自己紹介 松久裕保(@hmatsu47) • https://qiita.com/hmatsu47 • Web インフラのお守り係をしています • 普段は JAWS-UG

    名古屋(・浜松)や PostgreSQL アンカンファレンスで DB ネタを中心に話しています • 数年前まで「MySQL 8.0 の薄い本」を作って配布していました • PHP のことは何もわかりません ◦ <?php phpinfo(); ?> を書いて満足(本番環境に置いちゃダメなやつ) 2
  2. バージョン番号 • むかし(例:MySQL 5.7.10) ◦ 5(メジャーバージョン番号) ◦ 7(リリースレベル) ▪ メジャーバージョン番号とリリースレベルを合わせてリリースシリーズ番号

    ◦ 10(リリースシリーズ内でのバージョン番号) →日本 MySQL ユーザ会(MyNA)副代表・坂井さんのブログ記事 https://sakaik.hateblo.jp/entry/20151220/mysql_manual_versions 9 「5.6」「5.7」「8.0」は 「リリースシリーズ番号」 とはいえ実質の扱いは 「メジャーバージョン番号」 sys.VERSION_MINOR() だけど「リリースレベル」
  3. バージョン番号 • いま(例:MySQL 9.2.0) ◦ 9(メジャーバージョン番号) ◦ 2(マイナーバージョン番号) ▪ メジャー・マイナーバージョン番号を合わせてリリースシリーズ番号

    ◦ 0(リリースシリーズ内でのバージョン番号) → MySQL 8.0 リファレンスマニュアル(日本語版) https://dev.mysql.com/doc/refman/8.0/ja/which-version.html 10 1 つ目の数字がメジャーバージョン番号 9.x 以降は、主にこの数字が意識される ようになりそう sys.VERSION_MINOR() と符合
  4. リリースサイクル(8.0.34 / 8.1.0 以降) • Innovation Release と LTS Release

    を設定 ◦ いずれも GA(一般提供) ◦ Innovation Release のサポートは 3 ヶ月 ▪ 次のマイナーバージョンが出るまで ◦ LTS Release は Premier Support 5 年+ Extended Support 3 年 ▪ 2 年ごとに登場 ▪ 途中の機能変更なし(という建前) 11
  5. リリースサイクル(8.0.34 / 8.1.0 以降) • リリースは毎年 1・4・7・10 月 ◦ 大きな不具合が見つかった場合はこのタイミングを待たずに適宜

    改修版がリリースされる ◦ HeatWave(後述)の新機能も四半期リリースのタイミングを待た ずに随時リリースされる ▪ リリースシリーズ内でのバージョン番号(3 つ目の数字)も上がる 12
  6. 図示するとこうなる 注:変更の可能性あり https://blogs.oracle.com/mysql-jp/post/introducing-mysql-innovation-and-longterm-support-lts-versions-jp 13 注:重大不具合修正で 9.0.1 もリリース(2024/7) 8.0.34 / 8.1.0

    からリリースモデル変更(2023/7)  ※Premier Support は 2 年間延長されて 2025/4 まで     (Extended Support は延長されず 1 年間のみ) Premier Support + Extended Support
  7. ここまでのまとめ • 8.0.34 / 8.1.0 からリリースモデルが変わった ◦ Innovation Release と

    LTS Release が設定された ▪ どちらも GA • Innovation Release は 3 ヶ月後にサポート終了 • LTS Release は 2 年毎に登場、計 8 年間サポートが継続 ◦ 8.4 の次は 9.7、その次は 10.7 14
  8. アップグレード・ダウングレード方法 • 方法は 4 つ ◦ インプレース ◦ MySQL Shell

    でのクローン(InnoDB Cluster) ◦ バイナリログによる非同期レプリケーション ◦ 論理ダンプとリストア(ロード) ▪ MySQL Shell ダンプ/ロードユーティリティ 16 8.0.34 / 8.1.0 以降はダウングレードも可能に
  9. アップグレード、の前に • アップグレードチェッカユーティリティで事前確認 ◦ MySQL Shell のユーティリティ ◦ アップグレード時に問題になりそうな点を指摘してくれる https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-utilities-upgrade.html

    17 The MySQL server at example.com:3306, version (中略) 3) Usage of utf8mb3 charset Warning: The following objects use the utf8mb3 character set. It is recommended to convert them to use (中略) Errors: 7 Warnings: 36 Notices: 0 7 errors were found. Please correct these issues before upgrading to avoid compatibility issues.
  10. アップグレード、の前に • アップグレードチェッカユーティリティで事前確認 ◦ MySQL Shell のユーティリティ ◦ アップグレード時に問題になりそうな点を指摘してくれる https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-utilities-upgrade.html

    18 The MySQL server at example.com:3306, version (中略) 3) Usage of utf8mb3 charset Warning: The following objects use the utf8mb3 character set. It is recommended to convert them to use (中略) Errors: 7 Warnings: 36 Notices: 0 7 errors were found. Please correct these issues before upgrading to avoid compatibility issues. 便利なユーティリティが多いので mysql コマンドからの移行を推奨
  11. アップグレードの対応状況マトリクス • ケース別利用可否 19 インプレース クローン 非同期 レプリケーション ダンプとロード LTS

    8.4 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4.11 → LTS 8.4.20 ✓ ✓ ✓ ✓ Innovation 8.1 → 8.2 ✓ ✗ ✓ ✓ Innovation 8.1 → 8.3 ✓ ✗ ✓ ✓ Innovation 9.1 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4 → LTS 10.7 ✗ ✗ ✗ ✗
  12. アップグレードの対応状況マトリクス • ケース別利用可否 20 インプレース クローン 非同期 レプリケーション ダンプとロード LTS

    8.4 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4.11 → LTS 8.4.20 ✓ ✓ ✓ ✓ Innovation 8.1 → 8.2 ✓ ✗ ✓ ✓ Innovation 8.1 → 8.3 ✓ ✗ ✓ ✓ Innovation 9.1 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4 → LTS 10.7 ✗ ✗ ✗ ✗ クローンでのアップグレードが可能 なのは同一マイナーバージョンのみ
  13. アップグレードの対応状況マトリクス • ケース別利用可否 21 インプレース クローン 非同期 レプリケーション ダンプとロード LTS

    8.4 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4.11 → LTS 8.4.20 ✓ ✓ ✓ ✓ Innovation 8.1 → 8.2 ✓ ✗ ✓ ✓ Innovation 8.1 → 8.3 ✓ ✗ ✓ ✓ Innovation 9.1 → LTS 9.7 ✓ ✗ ✓ ✓ LTS 8.4 → LTS 10.7 ✗ ✗ ✗ ✗ メジャーバージョンを飛ばして アップグレードすることはできない
  14. ダウングレードの対応状況マトリクス • ケース別利用可否 ⭐:ロールバック目的のみ(プロダクト環境での常用は非推奨) 22 インプレース クローン 非同期 レプリケーション ダンプとロード

    LTS 8.4.20 → 8.4.11 ✓ ✓ ✓ ✓ LTS 9.7 → LTS 8.4 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.6 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.5 ✗ ✗ ✓⭐ ✓⭐
  15. ダウングレードの対応状況マトリクス • ケース別利用可否 ⭐:ロールバック目的のみ(プロダクト環境での常用は非推奨) 23 インプレース クローン 非同期 レプリケーション ダンプとロード

    LTS 8.4.20 → 8.4.11 ✓ ✓ ✓ ✓ LTS 9.7 → LTS 8.4 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.6 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.5 ✗ ✗ ✓⭐ ✓⭐ インプレース・クローンでのダウングレードが 可能なのは同一マイナーバージョンのみ
  16. ダウングレードの対応状況マトリクス • ケース別利用可否 ⭐:ロールバック目的のみ(プロダクト環境での常用は非推奨) 24 インプレース クローン 非同期 レプリケーション ダンプとロード

    LTS 8.4.20 → 8.4.11 ✓ ✓ ✓ ✓ LTS 9.7 → LTS 8.4 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.6 ✗ ✗ ✓⭐ ✓⭐ LTS 9.7 → Innovation 9.5 ✗ ✗ ✓⭐ ✓⭐ メジャー/マイナーバージョンをまたぐ ダウングレードはロールバック目的のみ
  17. クラウドのマネージドサービス利用時の注意 • マネージドサービスによっては ◦ アップグレードパスを限定していることも ▪ 例:Google Cloud の Cloud

    SQL for MySQL では 8.0.37 未満のバージョン から 8.4 への移行は 8.0.37(以降の 8.0.x)を経由する必要がある https://cloud.google.com/sql/docs/mysql/upgrade-major-db-version-inplace?hl=ja#plan-u pgrade (3. MySQL 8.0 から 8.4 にアップグレードする場合は、…) 26
  18. クラウドのマネージドサービス利用時の注意 • サポート期限が本家 MySQL と異なる場合がある ◦ AWS / Amazon RDS

    for MySQL : https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Concepts.Version Mgmt.html ◦ Google Cloud / Cloud SQL for MySQL : https://cloud.google.com/sql/docs/mysql/db-versions?hl=ja 27
  19. 主に問題になるポイント 2 選 +1 • mysql_native_password 認証プラグイン無効化 ◦ 8.4 でデフォルト無効化(クラウドのマネージドサービスを除く)

    • センシティブなキーワードの廃止・置き換え ◦ 8.4 で MASTER / SLAVE が削除された • 動的権限の追加(管理者権限) ◦ 詳しくはこちら(本セッションでの説明は省略) https://gihyo.jp/article/2024/05/mysql-rcn0221 31
  20. その他の差分はこちらで確認 • MySQL Server Version Reference ◦ https://dev.mysql.com/doc/mysqld-version-reference/en/ • MySQL

    Parameters(MyNA 代表とみたまさひろさん作) ◦ https://mysql-params.tmtms.net/mysqld/ 32
  21. mysql_native_password 認証プラグイン無効化 • バージョンアップ前に mysql_native_password 認証を 指定して作成したユーザーが接続不可に ◦ 対象ユーザーの変更・再作成が必要 ▪

    認証プラグインとして caching_sha2_password を使う ▪ ALTER USER で変更する場合は IDENTIFIED BY ‘【パスワード】’ を省略し ない 34
  22. mysql_native_password 認証プラグイン無効化 • 古いライブラリやドライバを使っている場合接続不可に ◦ PHP 7.4.4 以降でパッケージインストールしたものを使っていれ ば大丈夫なはず https://www.php.net/manual/ja/mysqli.requirements.php

    https://www.php.net/manual/ja/ref.pdo-mysql.php ◦ 自前でドライバを組み込んでビルドしたライブラリや、システム 管理用・データ連携用などひっそりと残っている「小物」に注意 35
  23. mysql_native_password 認証プラグイン無効化 • サーバーの設定で有効化はできる ◦ mysql_native_password=on ▪ 注:RDS for MySQL

    などではデフォルトで有効かつ変更不可になっている ▪ デフォルト認証プラグインは authentication_policy で設定 ◦ ご利用は計画的に(セキュリティ的に非推奨) ▪ 9.0.0 で mysql_native_password 認証プラグインは削除 ◦ 詳細はスマートスタイル社のブログ記事で https://blog.s-style.co.jp/2024/05/11793/ 36
  24. センシティブなキーワードの廃止・置き換え • 8.3.0 までは ◦ MASTER / SLAVE を使う構文も非推奨だが併用可能だった ◦

    MASTER / SLAVE を使うと従来どおりのキーワードを出力 →互換性維持のため 例:SHOW SLAVE STATUS と SHOW REPLICA STATUS では出力結果が別 https://yoku0825.blogspot.com/2022/07/mysqlshow-slave-statusshow-replica.html 38
  25. センシティブなキーワードの廃止・置き換え • 8.4.0 で MASTER / SLAVE を使う構文が削除された ◦ 利用中の管理ツールなどが未対応バージョンの場合対応が必要

    ▪ 監視ツールで出力結果をパースして使うケースを含む←ここ重要! ▪ 設定ファイル(my.cnf)や起動スクリプトなども同様 ◦ 詳細はスマートスタイル社のブログ記事で https://blog.s-style.co.jp/2024/07/12381/ 39
  26. ここまでのまとめ • 大きなポイントは 2 つ ◦ mysql_native_password 認証プラグイン無効化 ◦ センシティブなキーワードの廃止・置き換え

    • 接続ユーザーの認証プラグイン設定、古いライブラリや 管理・監視ツールのバージョンアップなどの対応が必要 ◦ 5.x → 8.0 よりはポイントが絞られるが確実に壁になりそう 40
  27. 8.0 で EOL になった製品 • MySQL Workbench ◦ 統合ビジュアル(GUI)ツール ◦

    後継は MySQL Shell for VS Code https://dev.mysql.com/doc/mysql-shell-gui/en/ ▪ gihyo.jp MySQL 道普請便りの MySQL Shell for VS Code 関連記事 https://gihyo.jp/article/2024/10/mysql-rcn0232 https://gihyo.jp/article/2024/12/mysql-rcn0235 https://gihyo.jp/article/2025/02/mysql-rcn0238 42
  28. 8.0 で EOL になった製品 • MySQL Enterprise Monitor ◦ Enterprise

    Edition 以上の契約で使える監視ツール ◦ 今後は Oracle Enterprise Manager for MySQL で代替 https://www.mysql.com/jp/products/enterprise/em.html 43
  29. リブランディングでややこしくなった HeatWave • 要は Oracle Cloud の MySQL マネージドサービス ◦

    以前は「MySQL HeatWave」だったが「HeatWave」が頭に https://www.oracle.com/jp/heatwave/features/ ▪ HeatWave(HeatWave Cluster / 列指向インメモリデータ処理エンジン) ▪ HeatWave GenAI(組み込み LLM・ベクトルストア・チャット) ▪ HeatWave MySQL(マネージドな MySQL Database) ▪ HeatWave Lakehouse(レイクハウス分析) ▪ HeatWave AutoML(機械学習モデルの構築・トレーニング) 46
  30. 主役は🐬に違いない HeatWave • 「本体」その 1 は MySQL Database ◦ 名前が変わって「HeatWave

    MySQL」に ◦ MySQL Database 単体で使える ◦ 列指向エンジン(後述)はオプション 48
  31. 本来のウリはここ↓だったはずの HeatWave • 「本体」その 2 は列指向エンジン ◦ メモリ上に全データを列指向フォーマットで置くエンジン ◦ 集計・分析が得意(超高速)

    ▪ 列指向だけど更新系がほとんど遅くならないのが特徴 ▪ 9.0 からは複数クエリの並列処理も可能に ▪ HeatWave GenAI でベクトルデータの処理をするときなどにも使う ▪ 同様に HeatWave Lakehouse・HeatWave AutoML の処理にも使う 49
  32. 実は 2 つある HeatWave • HeatWave on OCI と HeatWave

    on AWS がある ◦ Oracle Cloud Infrastructure 上にあるのが on OCI ◦ AWS 上のリソースを使ってサービス提供するのが on AWS ◦ on OCI のほうが安くて機能が充実 https://www.oracle.com/jp/heatwave/pricing/ 50
  33. 移行事例も地味に増えてきた HeatWave • AWS や Google Cloud からの移行でコストダウン ◦ Docswell

    の事例 https://www.docswell.com/s/rewtheblow/K4VQ31-20240807-OracleCloud Webinar-Docswell https://zenn.dev/kusuke/scraps/ac9b294bdde490 https://www.docswell.com/  51
  34. ここまでのまとめ • HeatWave は Oracle Cloud 上で提供されている MySQL マネージドサービス •

    通常の MySQL では苦手な集計・分析が得意な列指向イン メモリデータ処理エンジンを持つ(オプション) • 他クラウドからの移行事例が(地味に)増えてきている 52
  35. 私見では • 普通の人が選ぶなら LTS Release 一択 ◦ これが基本 ◦ マイグレーション地獄にならないように

    ◦ 2 年ごとにメジャーバージョンアップするサイクルを作る ▪ 1 メジャーバージョン間の差分は小さいので移行も難しくない (5.7 → 8.0 のようなことはもうないはず) 54
  36. 私見では • ただし HeatWave に限れば Innovation Release もアリ ◦ 追加機能に強い魅力を感じるなら

    ◦ マイグレーション地獄を受け入れる覚悟で ▪ なお HeatWave 各バージョンの提供終了時期は MySQL の EOL とは異なる https://docs.oracle.com/ja-jp/iaas/mysql-database/doc/mysql-server-versions.html (注:HeatWave on AWS では一部提供されないバージョンが存在する) 56
  37. 私見では • 自前インストールもやっぱり LTS Release ◦ Standard Edition / Enterprise

    Edition でのサポート契約を推奨 ▪ 世に出るノウハウが減り続けている→だんだん自前運用が厳しくなっている (そんな時代だからこそ発信できる人はどんどん発信して!) ◦ Community Edition(自力解決💪)ならこのあたり↓も意識しつつ ▪ ビルド方法による性能の違い https://buildup-db.blogspot.com/2024/11/mysql-80.html 57
  38. phpMyAdmin の GitHub の様子を眺めてみた • ざっと見てみた雰囲気では ◦ プロダクトコードには Master /

    Source 両対応の痕跡があった がテストコードは Master のみ ◦ いずれテストコードの修正が必要になりそうな雰囲気が 64
  39. phpMyAdmin の GitHub の様子を眺めてみた • Issues で「mysql_native_password」を検索 ◦ すでに Closed

    なものを含めて検索してみた →過去の苦労も含めて追いかけるため 65
  40. phpMyAdmin の GitHub の様子を眺めてみた • 雑な感想 ◦ phpMyAdmin では MariaDB

    にも対応が必要なのが大変そう →MariaDB は caching_sha2_password とは別の道へ https://mariadb.com/kb/en/authentication-plugin-ed25519/ 67
  41. MySQL のお役立ちサイト • gihyo.jp MySQL 道普請便り ◦ https://gihyo.jp/list/group/MySQL%E9%81%93%E6%99%AE%E8%AB% 8B%E4%BE%BF%E3%82%8A •

    日々の覚書(MyNA 副代表 yoku0825 さんのブログ) ◦ https://yoku0825.blogspot.com/ 71