MySQL データベースをどのようにアップグレードするかを決める際、単にアップグレード元とアップグレード先のバージョンだけを考えればよいということはほとんどありません。

最適な方法は、データベースのサイズ、ストレージエンジン、レプリケーショントポロジ、利用可能なインフラストラクチャ、許容できるダウンタイム、バックアップの準備状況、アプリケーションの互換性、ロールバック要件などによって変わります。長時間のメンテナンス時間を確保できる小規模なスタンドアロンデータベースであれば、インプレースアップグレードが適しているかもしれません。一方、厳しい可用性要件を持つ数TB規模の本番システムでは、レプリカを先にアップグレードする方法、クローンやバックアップを使って別環境を構築する方法、あるいは論理移行が必要になる場合があります。

こうした判断を支援するため、MySQL Shell 向けのオープンソース Python プラグインである MySQL Upgrade Advisor を開発しています。

注意: このプロジェクトは、私個人によるMySQLコミュニティへのコントリビューションです。Oracle製品ではなく、MySQL Enterprise Editionの一部でもありません。また、Oracle Supportのサポート対象ではありません。このツールが生成する推奨事項はあくまで参考情報であり、使用する前に独自にレビューおよび検証する必要があります。

github.com/mfrankmysql/mysql-upgrade-advisor

開発に関する開示事項: このプロジェクトは、OpenAIのChatGPTを使用して全面的に「vibe coding」で開発しました。私が要件、ドメイン知識、テストのフィードバック、設計方針を提供し、ChatGPTが実装、テスト、ドキュメント、パッケージングを生成し、反復的に修正しました。このコードはコミュニティでのテストを目的として公開しているものであり、実験的なソフトウェアとしてレビューしてください。

Advisor の機能

Advisorはアップグレード元のMySQLインスタンスに読み取り専用で接続し、自動的に判別可能な以下の情報を収集します。

  • 正確な MySQL バージョンとエディション
  • データベースサイズ、テーブル数、最大テーブル、ストレージエンジンの使用状況
  • スタンドアロン、非同期レプリケーション、グループレプリケーション、InnoDB ReplicaSet、InnoDB Cluster、InnoDB ClusterSet のトポロジ
  • GTID、バイナリログ、レプリケーション、クローン に関する情報
  • メタデータが利用できる場合の MySQL Enterprise Backup の履歴
  • 要求されたターゲットバージョンに対する MySQL Shell Upgrade Checker の結果

その後、サーバーから確実に取得できない情報について、インタラクティブな質問を行います。たとえば以下のような項目です。

  • 許容可能な書き込み停止時間の上限
  • 2台目のサーバーまたはデータベースの完全なコピーを用意できるか
  • アプリケーションとコネクタの認定状況
  • トラフィックの切り替えが可能か
  • バックアップからのリストアをテスト済みか
  • データ検証計画
  • ロールバック要件
  • 本番環境と同等の規模でアップグレードをリハーサル済みか

質問にはynhで回答できます。h (ヘルプ)を選択すると、その質問が重要な理由、確認すべき情報、適切な回答を判断する方法が説明されます。

アップグレード手順を生成し出力

このツールの目的は、単に合格/不合格という結果を出すことではありません。

検出した環境と運用担当者の回答に基づいて、Advisorは以下を含む詳細なアップグレード手順を生成します。

  • 推奨するアップグレード方法と、その環境に適している理由
  • 必要となる正確なバージョンアップグレードの段階
  • 検討した代替手段
  • 他の方法が却下された、または優先順位が低くなった理由
  • 事前準備とインフラストラクチャの要件
  • Upgrade Checkerによる検出結果
  • バックアップ、初期データ投入、同期、切り替えの手順
  • 検証と監視に関するガイダンス
  • 中止条件とロールバックに関する考慮事項
  • ロールバックが単純なトラフィック切り替えでは済まなくなるポイント
  • 準備状況のチェックに失敗した場合の修復方法とコマンドテンプレート

現在のルールでは、以下のような方式を評価できます。

  • 直接インプレースアップグレード
  • 段階的インプレースアップグレード
  • MySQL Shellによる論理ダンプとロード
  • レプリカを先にアップグレードするローリングアップグレード
  • クローンを使用して別環境を構築するインプレースアップグレード
  • 物理バックアップを使用して別環境を構築するアップグレード

現在の対象範囲

今回のテストリリースでは、以下を含むOracle MySQL環境を対象としています。

  • MySQL 5.7
  • MySQL 8.0
  • MySQL 8.4 LTS
  • MySQL 9.7 LTS
  • MySQL 26.7以降のInnovationリリースをターゲットとしたアップグレード計画

現在は以下のトポロジを検出できます。

  • スタンドアロン MySQL
  • 従来型の非同期レプリケーション
  • グループレプリケーション
  • InnoDB ReplicaSet
  • InnoDB Cluster
  • InnoDB ClusterSet

正確なアップグレードパスのサポート状況は、バージョンによって異なります。Advisorでは、自身が評価できるアップグレードパス、インストールされているUpgrade Checkerが認識しているサポート状況、そして本番環境でのアップグレードを承認する前に必要となる追加の確認事項を区別して扱います。

テストへのご協力をお願いします

さまざまなバージョン、データベースサイズ、プラットフォーム、トポロジに対してAdvisorをテストしていただけるSE、DBA、パートナー、MySQLコミュニティの皆さんを募集しています。

特に以下のようなフィードバックをお待ちしています:

  • アップグレード元のバージョン、エディション、トポロジ、データベースサイズを正しく検出できたか
  • すでに自動的に把握できているはずの情報について質問されなかったか
  • 質問とヘルプ・テキストは理解しやすかったか
  • 推奨されたアップグレード方式は適切だったか
  • 重要な代替手段や前提条件が抜けていなかったか
  • 切り替え、検証、中止、ロールバックの手順は役に立ったか
  • Upgrade Checker、AdminAPI、バックアップ検出、レポート生成のいずれかの処理でエラーが発生したか

「この質問は分かりにくかった」「この手順ではこのトポロジに対応できない」といったフィードバックもぜひお願いします。

プロジェクトのリポジトリとテストリリースはこちらから入手できます。

github.com/mfrankmysql/mysql-upgrade-advisor

まずは使い捨ての環境、開発環境、またはテスト環境で試してください。リポジトリに記載されたインストールおよびテスト手順に従い、生成されたレポートを公開GitHub Issueに添付する場合は、機密情報などを削除してください。

安全性とサポート範囲

現在、MySQL Upgrade Advisorはアドバイスの提供のみを行う読み取り専用ツールです。アップグレードの実行、スキーマやデータの変更、レプリケーションの変更、Clone操作の実行、ソフトウェアのインストール、サーバーの再起動、バックアップやリストア、レプリカの昇格、アプリケーショントラフィックの切り替えは行いません。

生成されるアップグレード手順に含まれるコマンドは、運用担当者が確認するためのテンプレートです。Advisor自身が実行することはありません。

このプロジェクトの位置付けは以下のとおりです:

  • 個人によるオープンソースのコントリビューションです
  • Oracle 製品ではありません
  • 公式にサポートされる MySQL ユーティリティではありません
  • Oracle Support の対象ではありません
  • MySQLの公式ドキュメントやサポートによるガイダンスに代わるものではありません
  • すべての環境に対して推奨事項が正確または完全であることを保証するものではありません

生成された推奨事項に基づいて実際に作業を行う前に、対象となるMySQLの正確なバージョンについて、提案されたアップグレードパスを公式ドキュメントで確認してください。アプリケーションの互換性をテストし、バックアップからリストアできることを確認し、ロールバック手順を検証するとともに、本番環境を代表するデータとワークロードを使用してアップグレード全体をリハーサルしてください。

このプロジェクトは現在も活発に開発されており、Universal Permissive Licenseのもとで公開されています。

皆さんからのフィードバック、そして現在利用されている多種多様なMySQL環境でAdvisorがどのように動作するのかを見ることを楽しみにしています!

いつも MySQL をご利用いただき、ありがとうございます。