本記事は Server Upgrade Checks with MySQL Shell の翻訳版です。

MySQL ShellはMySQLの高度なクライアントであり、コードエディタです。MySQL Serverに接続してコマンド・ライン・インターフェース(CLI)で管理することができます。また、MySQL ShellはSQLだけでなく、JavaScriptおよびPythonのスクリプトと、MySQLを操作するAPIを提供しています。さらにX DevAPIを使用すると、リレーショナル・データに加えてドキュメント・データの操作も可能です。本記事ではMySQL Serverインスタンスのアップグレードをご検討の皆様に重宝していただける、アップグレード・チェッカー・ユーティリティをご紹介します。
 

アップグレード時の課題

MySQLのバージョンをアップグレードする際に、構成ファイルの互換性を懸念される方は多くいらっしゃると思います。MySQL Shellには、現在のMySQL Serverインスタンスを新しいバージョンにアップグレードしても問題がないか確認することができる機能があります。

 

アップグレード・チェッカー・ユーティリティ

MySQL Shellのutilグローバル・オブジェクトの一つに、現在のMySQL Serverインスタンスをチェックし、新しいバージョンのMySQLへアップグレードする際の潜在的な問題をあらかじめ検出することができる、checkForServerUpgrade()があります。

下記コマンドをMySQL Shellで実行するとバージョン間の互換性を検出することができます。下に示したのは最も単純な構文です。

>  util.checkForServerUpgrade()

これを実行すると、下図のようにアップグレード・チェック実行に使用されているMySQL Shellのバージョン (下図ではMySQL 8.4) に対して、MySQL Shellが接続しているMySQL Serverインスタンスのバージョン (下図ではMySQL 8.0.37) のアップグレード・チェックが行われます。
 

upgrade checker


上記の図のように、実施例ではMySQL 8.0.37を運用しているMySQL Serverインスタンスを、MySQL 8.4へアップグレードする場合の互換性をチェックしました。本実施例の結果は以下のとおりです。

MySQL  localhost:33060+ ssl  JS >   util.checkForServerUpgrade()

The MySQL server at localhost:33060, version 8.0.37 – MySQL Community Server –
GPL, will now be checked for compatibility issues for upgrade to MySQL 8.4.0.
To check for a different target server version, use the targetVersion option.

1) Removed system variables (removedSysVars)
  No issues found

2) System variables with new default values (sysVarsNewDefaults)
  Warning: Following system variables that are not defined in your
    configuration file will have new default values. Please review if you rely on
    their current values and if so define them before performing upgrade.
  More information:
    https://dev.mysql.com/blog-archive/new-defaults-in-mysql-8-0/

  binlog_transaction_dependency_tracking – default value will change from
    COMMIT_ORDER to WRITESET.
  group_replication_consistency – default value will change from EVENTUAL to
    BEFORE_ON_PRIMARY_FAILOVER.
  group_replication_exit_state_action – default value will change from
    READ_ONLY to OFFLINE_MODE.
  innodb_adaptive_hash_index – default value will change from ON to OFF.
  innodb_buffer_pool_in_core_file – default value will change from ON to OFF.
  innodb_buffer_pool_instances – default value will change from 8 (or 1 if
    innodb_buffer_pool_size < 1GB) to MAX(1, #vcpu/4).
  innodb_change_buffering – default value will change from all to none.
  innodb_doublewrite_files – default value will change from
    innodb_buffer_pool_instances * 2 to 2.
  innodb_doublewrite_pages – default value will change from
    innodb_write_io_threads to 128.
  innodb_flush_method – default value will change from fsynch (unix) or
    unbuffered (windows) to O_DIRECT.
  innodb_io_capacity – default value will change from 200 to 10000.
  innodb_io_capacity_max – default value will change from 200 to 2 x
    innodb_io_capacity.
  innodb_log_buffer_size – default value will change from 16777216 (16MB) to
    67108864 (64MB).
  innodb_log_writer_threads – default value will change from ON to OFF ( if
    #vcpu <= 32 ).
  innodb_numa_interleave – default value will change from OFF to ON.
  innodb_page_cleaners – default value will change from 4 to
    innodb_buffer_pool_instances.
  innodb_parallel_read_threads – default value will change from 4 to
    MAX(#vcpu/8, 4).
  innodb_purge_threads – default value will change from 4 to 1 ( if #vcpu <= 16
    ).
  innodb_read_io_threads – default value will change from 4 to MAX(#vcpu/2, 4).
  innodb_redo_log_capacity – default value will change from 104857600 (100MB)
    to MIN ( #vcpu/2, 16 )GB.

3) Issues reported by ‘check table x for upgrade’ command (checkTableCommand)
  No issues found

4) Check for deprecated or invalid user authentication methods.
(authMethodUsage)
  No issues found

5) Check for deprecated or removed plugin usage. (pluginUsage)
  No issues found

6) Check for deprecated or invalid default authentication methods in system
variables. (deprecatedDefaultAuth)
  No issues found

7) Check for deprecated or invalid authentication methods in use by MySQL
Router internal accounts. (deprecatedRouterAuthMethod)
  No issues found

8) Checks for errors in column definitions (columnDefinition)
  No issues found

9) Check for allowed values in System Variables. (sysvarAllowedValues)
  No issues found

10) Checks for user privileges that will be removed (invalidPrivileges)
  Verifies for users containing grants to be removed, since privileges are
    removed as part of the upgrade, raises a NOTICE to inform the user about
    users that will be losing invalid privileges

  ‘root’@’localhost’ – The user ‘root’@’localhost’ has the following privileges
    that will be removed as part of the upgrade process: SET_USER_ID

11) Checks for partitions by key using columns with prefix key indexes
(partitionsWithPrefixKeys)
  No issues found

Errors:   0
Warnings: 20
Notices:  1

NOTE: No fatal errors were found that would prevent an upgrade, but some potential issues were detected. Please ensure that the reported issues are not significant before upgrading.

 

アップグレード・チェッカーによると、上記の例では互換性に関して重大な問題は検出されず、ほとんどの出力はシステム変数の更新に関する内容です。この結果から、既存のデータベースを変更せずにMySQL 8.4にアップグレードできるということがわかります。

util.checkForServerUpgrade()の実行でチェックされる項目について詳しくは、公式Webマニュアルを参照してください。
 

他のシステムを検出

先述の実施例では、MySQL Shellが接続しているMySQL Serverインスタンスをチェックしましたが、util.checkForServerUpgrade()では対象のMySQL Serverインスタンスを指定することも可能です。別のインスタンスに接続しutil.checkForServerUpgrade()を実行するには下記を参考にしてください。

> util.checkForServerUpgrade('shell_user@10.0.0.128:3306', {"password":"XXXXXXXXXX", "targetVersion":"8.4.0"})


オプション

util.checkForServerUpgrade()には先述で実行した構文以外に、オプションもあります。下記にいくつかご紹介します。

  • targetVersion … アップグレード先のMySQL Serverインスタンスのバージョンを指定
  • include … 実行に含める確認事項をコンマ区切りで指定
  • exclude … 実行に含めない確認事項をコンマ区切りで指定

他のオプションについては公式Webマニュアルをご覧いただくか、下記コマンドで表示し確認してください。

> \? util.checkForServerUpgrade


まとめ

MySQLを新しいバージョンにアップグレードする際に、手動で互換性の問題を検出しそれに対処するのは、データベース管理者の皆様にとって困難で時間のかかる作業だと思います。MySQL Shellのutil.checkForServerUpgrade()を使用することで、バージョン間の互換性に関する問題をすばやく検出し、MySQL Serverインスタンスがアップグレードの準備ができていることを確認することができます。

また、MySQLのポッドキャストInside MySQL: Sakila Speaksで公開中のエピソードMySQL Shell Does All The Things!では、MySQL Developer AdvocateのScott Stroz、MySQL Community ManagerのFrederic Descamps、Senior Principal Software EngineerのMiguel AraujoらがMySQL Shellの歴史やおすすめの機能をご紹介していますので、ぜひお聞きください。