MySQL道普請便り

第237回MySQL 8.4でのMaster/Slave構文の廃止にどう対応するか

MySQL 8.4がGA(一般公開)されてから半年が経過しました。今年はこのバージョンを検討する方も増えてくるのではないでしょうか。MySQL 8.4では、バージョン8.0でサポートされていたいくつかの構文が削除され、新しい構文への移行が求められるようになりました。この変更により、既存の自作ツールやスクリプトの修正が必要になる場合も多いと考えられます。

本記事では、MySQL 8.4で削除された構文とその対応方法について紹介します。ぜひ、今後の運用にお役立てください。

バージョン8.4で削除された構文

MySQL 8.4ではいくつかの構文が削除されましたが、特に影響が大きいのはレプリケーション関連の構文です。従来使用されていた「Master/Slave」という用語が、⁠Source/Replica」に置き換わったことで、これに関連する構文も変更されました。

MySQL 8.0ではこれらの構文は非推奨とされながらも利用可能でしたが、バージョン8.4では完全に削除され、実行するとSyntax Errorとなります。

以下は、バージョン8.4.3でSHOW SLAVE STATUSを実行した際のエラーメッセージの例です。

バージョン8.4.3でshow slave statusを実行するとエラー
mysql> show slave status\G
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave status' at line 1

削除された構文とその代替

以下の表は、削除された構文とその代替となる構文を示しています。

削除された構文 バージョン8.4での構文
START SLAVE START REPLICA
STOP SLAVE STOP REPLICA
SHOW SLAVE STATUS SHOW REPLICA STATUS
SHOW SLAVE HOSTS SHOW REPLICAS
RESET SLAVE RESET REPLICA
CHANGE MASTER TO CHANGE REPLICATION SOURCE TO
RESET MASTER RESET BINARY LOGS AND GTIDS
SHOW MASTER STATUS SHOW BINARY LOG STATUS
PURGE MASTER LOGS PURGE BINARY LOGS
SHOW MASTER LOGS SHOW BINARY LOGS

オプション名の変更

また、CHANGE MASTER TOで使用されていた各種オプション名も変更されています。以下に代表的な変更を示します。

バージョン8.0までのオプション バージョン8.4でのオプション
MASTER_AUTO_POSITION SOURCE_AUTO_POSITION
MASTER_HOST SOURCE_HOST
MASTER_USER SOURCE_USER
MASTER_PASSWORD SOURCE_PASSWORD
MASTER_PORT SOURCE_PORT
MASTER_LOG_FILE SOURCE_LOG_FILE
MASTER_LOG_POS SOURCE_LOG_POS

構文が削除された背景

これらの構文が置き換わった背景には、以下の理由があります。

MySQLのレプリケーションでは長年「Master」⁠Slave」という用語が使用されてきましたが、これらの用語は否定的な起源を持つため、MySQLでは「Source」⁠Replica」などの新しい用語に置き換える方針が採用されました。

また、MySQL非同期レプリケーションは変更ストリームを扱う技術であり、レプリケーション構成では「Source」が中心的役割を果たしています。この用語は、双方向レプリケーション、多段レプリケーション、循環レプリケーションなど、複雑なトポロジを正確に表現するのに適しているため選ばれました。一方、⁠Primary」などの用語は、これらの用途には適していないと判断されました。

詳細については、MySQL Terminology Updatesをご確認ください。

対応方法の検討

MySQL 8.4で削除された構文を確認しましたが、これまでのバージョン(8.0や5.7)を引き続き利用する場面もあるかもしれません。そのような場合、環境に応じて構文を切り替えて対応する必要があります。以下では、具体的な対応方法について、SHOW SLAVE STATUSを例に解説します。

MySQLコメントを利用する

第54回 SQLコメントを使ってみようで説明されている通り、MySQLではコメント文にバージョン番号を記載することで、特定のバージョン以降でのみコマンドを実行する制御が可能です。

たとえば、MySQL 8.4以降でSHOW REPLICA STATUSを実行するには、以下のように記述します。

mysql> /*!80400 SHOW REPLICA STATUS */;

ただしこの方法では、8.4でSHOW REPLICA STATUSを使用し、8.0以前でSHOW SLAVE STATUSを使用するような細かい切り替えはできません。この場合は、他の方法を検討する必要があります。

prometheus/mysqld_exporterの場合

監視ツールとして有名なprometheus/mysqld_exporterでは、現在バージョン8.4をサポートしています。このツールのコードを見ると、以下のような動作でバージョン間の互換性を実現しています。

  1. 最初にSHOW SLAVE STATUSを実行。
  2. エラーが返された場合、SHOW REPLICA STATUSを実行。

具体的なコードは以下のプルリクエストで確認できます。

この方法により、バージョン8.4以降でも問題なく動作する仕組みが実現されています。

Percona Toolkitの場合

Percona Toolkitは、バージョン3.7.0からMySQL 8.4をサポートしています。その対応は、以下のように柔軟な設計がなされています。

  1. すべてのSHOW SLAVE STATUSをSHOW ${replica_name} STATUSという変数に置き換え。
  2. バージョンが8.1以上であれば${replica_name}にreplicaを代入。
  3. それ以前のバージョンでは${replica_name}にslaveを代入。

具体的なコードは以下のコミットで確認できます。

まとめ

今回は、MySQL 8.4で削除された構文と、それに伴う対応方法について解説しました。特に、SHOW SLAVE STATUSのようにレプリケーション関連の構文がSHOW REPLICA STATUSに置き換わるなど、Master/SlaveからSource/Replicaへの用語変更に伴う大きな影響がありました。

バージョンアップを検討する際は、現在使用しているツールやスクリプトを確認し、必要に応じて修正や移行計画を立てることが重要です。また、今後のMySQLの変更にも対応できるよう、公式ドキュメントやツールの更新情報を定期的にチェックすることをお勧めします。

より詳細について知りたい場合は、公式ドキュメントの リリースノート⁠Deprecation and Removal Notes⁠をご確認ください。

おすすめ記事

記事・ニュース一覧