スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Shell 8.0.19 の新機能について

はじめに

2020 年 1 月 13 日に MySQL Shell 8.0.19 がリリースされました。今回は、ここでリリースされている新機能について過去バージョンとの比較をしながら調査をおこないました。

新機能について

MySQL Shell 8.0.19 でリリースされた機能は大きく分けて以下の通りです。

  • InnoDB ReplicaSet に関する管理 API を追加。
  • メタデータスキーマ(mysql_innodb_cluster_metadata) が Ver.2.0 にアップグレード。
  • MySQL Router に関する管理 API を追加。

このうち、InnoDB ReplicaSet については以前にも当ブログで紹介しているので説明を省略します。ここでは、残りの 2 つの機能について詳細を確認していたいと思います。

環境

以下の環境を使用して MySQL InnoDB Cluster を構築します。
※構築方法は以前に当ブログで紹介した手順を使用しています。

  • MySQL Server 8.0.19
  • MySQL Shell 8.0.18 / MySQL Shell 8.0.19
  • MySQL Router 8.0.18 / MySQL Router 8.0.19

メタデータスキーマのアップグレード

MySQL Server 8.0.19 による InnoDB ReplicaSet 機能の実装などにともない、メタデータ情報が格納されている mysql_innodb_cluster_metadata データベースの構成が変化(Ver.1.0.1 → Ver.2.0)しています。

Ver.2.0 にアップグレードされることで、主に以下のテーブルが追加あるいは変更されています。

  • InnoDB RelicaSet のメタデータ情報 : 格納先が replicasets テーブルから async_cluster_* テーブルに変更。
  • MySQL Router のメタデータ情報 : routers テーブルのカラム数が増加。 router_rest_accounts テーブルは MySQL Shell 8.0.19 では使用されていないようです。
  • v2_% テーブル : 各メタデータ情報のビュー。 ar は Async Replication、gr は Group Replication の略称です。基本的にほぼ同じ内容ですが、ある程度情報がまとめて表示されています。

また、メタデータスキーマのバージョンアップに伴って、MySQL Shell 8.0.18 以前から MySQL Shell 8.0.19 にアップグレードした場合、読み取り操作以外は以下のようなエラーが出力されて実行できなくなってしまうので注意してください。

その場合、以下のような手順でアップグレードをおこなう必要があります。

  1. MySQL Shell 8.0.18 を MySQL Shell 8.0.19 にアップグレード。
  2. MySQL Router を 8.0.19 にアップグレード。
  3. dba.upgradeMetadata() を実行。

なお、 dba.upgradeMetadata() を実行すると、アップグレードする MySQL Router が残っている場合は以下のような出力が表示されます。

どの対応を行うか選択できますが、それぞれの内容は以下の通りです。

  1. MySQL Router を全て 8.0.19 以上にアップグレードしたので、アップグレードを継続する。
  2. 古い MySQL Router のメタデータ情報を切り捨ててアップグレードを実行する。
  3. アップグレードを中止する。
  4. もう一度この内容を出力する。

通常は接続している MySQL Router を全て 8.0.19 にアップグレードしてから 1 を選択すれば良いですが、もしメタデータ情報だけ残っていて使用しているかどうか不明な MySQL Router の情報がある場合などは、2 を選択してしまうのが良いかと思います。

2 を選択すると、古いバージョンの MySQL Router の情報は削除される旨の確認があった後、スキーマのアップグレードが完了します。ただし、ここで削除されるのは MySQL Router のメタデータ情報のみであり、MySQL Router との接続ユーザー(mysql_router*_************)は残ったままなので注意してください。

MySQL Router の管理 API

MySQL Shell 8.0.18 までは、MySQL Router のメタデータ情報を routers テーブルからのみ確認することができました。

そのため、どの接続が現在使用されているか、既に使用しなくなっているものがあるかどうかなどは、 SHOW PROCESSLIST コマンドで現在の状態を確認するくらいしか確かめる方法がなく、使わなくなったメタデータ情報がある場合には、該当のメタデータ情報やユーザー情報を手動で削除するか、諦めて放置するしかありませんでした。

MySQL Shell 8.0.19 からは、以下の API が追加されており、それぞれ MySQL Router のメタデータ情報を操作することが可能になっています。

[cluster/replicasetオブジェクト].listRouters()

現在の MySQL Router の接続を表示します。

MySQL Shell 8.0.18 との違いは lastCheckIn が追加されていることです。この項目により、最後に MySQL Router からの接続(疎通確認)がいつ来たかを確認することが可能になっています。そのため、この内容がかなり前の日付になっていたり、そもそも null になっている場合は、現在使用されていない接続である可能性が高いと推測することができます。

[cluster/replicasetオブジェクト].removeRouterMetadata()

上記のように不要な接続を確認することができたら、 removeRouterMetadata("Routername") でその情報を削除することができます。

これでユーザー管理の煩雑さからも解放…されると思いきや、MySQL Router の接続ユーザーはしっかりと残っているようです。

そのため、メタデータ情報を削除した MySQL Router を再び立ち上げると、問題なく接続することができてしまいます。

したがって、MySQL Shell 8.0.19 においても、不要になった MySQL Router のユーザーは適宜手動で削除するか、放置して増えるがままに任せるしかないようです。

まとめ

ここまで、MySQL Shell 8.0.19 における新機能やその内容について確認してきました。機能についてはまだ痒い所に手が届いていないですが、徐々に機能も拡充されてきており、大きなバグも取れてきている印象を受けます。
※ここでは説明を省きますが、MySQL Shell 8.0.18 までは、autocommit=0 のときに正常にクラスタ―を構築できず、各種の操作(removeInstance()など)にも影響が出てしまうバグ(Bug #30202883, Bug #30324461)などが存在しています

まだまだ新機能が追加されている MySQL 8.0 において、これからの更新と改善には引き続き注目していきたいところです。

MySQL
Return Top