MySQL 8.4 LTSにおけるセンシティブなキーワードの廃止について
ソフトウェアの世界では、かねてからプログラム上で使用されているセンシティブなキーワードの置き換えが進められてきましたが、2020年頃からの「Black Lives Matter」(BLM)運動が広がった時期に MySQL でもバージョン8.0より差別的と捉えられる可能性があるキーワードの置き換えが進められてきました。
2020年1月にはコミュニティバグ上に機能リクエストが起票され
Bug #99806 replace master/slave terminology with primary/replica
Submitted: 8 Jun 2020 16:30
Reporter: Steve David
https://bugs.mysql.com/bug.php?id=99806
2020年7月には MySQL Terminology Updates というブログ記事が公開され、用語の置き換えを推進していくことが宣言されています。
先日リリースされた MySQL 8.4.0 LTS では、上記に該当するキーワードを含む従来のコマンドが実行できなくなっており、それらの機能を使用している様々なツールへの影響が考えられます。
今回の記事では、過去のバージョンから現バージョンに至るまでのこれらのキーワードの置き換えについて調査しました。
MySQL 8.0.23における変更
このバージョンでは、MASTER/SLAVE
の語句を使用するコマンドに対して、それらの語句を置き換えるためのコマンドエイリアスが提供されました。
具体的には MASTER
は SOURCE
に、 SLAVE
は REPLICA
に変更されました。
Changes in MySQL 8.0.23 (2021-01-18, General Availability)
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html#mysqld-8-0-23-deprecation-removal
元コマンド | エイリアス | 説明 |
---|---|---|
CHANGE MASTER TO |
CHANGE REPLICATION SOURCE TO |
MASTER_HOST等のオプションのエイリアスとしてSOURCE_HOST等を追加 |
START SLAVE |
START REPLICA |
MASTER_LOG_POSおよびMASTER_LOG_FILEについて、SOURCE_LOG_POSおよびSOURCE_LOG_FILEのエイリアスを追加 |
STOP SLAVE |
STOP REPLICA |
- |
SHOW SLAVE STATUS |
SHOW REPLICA STATUS |
- |
SHOW SLAVE HOSTS |
SHOW REPLICAS |
- |
RESET SLAVE |
RESET REPLICA |
- |
また、Com_change_master
ステータス変数のエイリアスとして、 Com_change_replication_source
ステータス変数が提供されました。
MySQL 8.0.26における変更
このバージョンでは、システム変数・ステータス変数、テーブル名やメトリックに付随する以下の文字列の置き換え、エイリアスの提供が行われています。
Changes in MySQL 8.0.26 (2021-07-20, General Availability)
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-26.html#mysqld-8-0-26-feature
置き換え前 | 置き換え後 | 説明 |
---|---|---|
master | source | - |
slave | replica | - |
mts | mta | multi-threaded-slave から multi-threaded-appliyer への変更 |
上記の語句の置き換え、エイリアス化が以下のように様々な箇所で行われました。
- performance_schema内の各テーブルのデータ
- 各テーブルの
EVENT_NAME
や、threads
、processlist
テーブルで表示されるスレッド名、待機イベント名等 - performance_schema内のこれらのデータは 8.0.26以前のバージョンとは 非互換 となりました
- これに伴い、
SHOW PROCESSLIST
や、information_schema.processlist
、スロークエリログ上に出力されるスレッド名等も置き換えられています - 救済措置として8.0.25以前と互換性を保つための
terminology_use_previous = "BEFORE_8_0_26"
が導入されました
- 各テーブルの
- 準同期レプリカ
- プラグイン名(
rpl_semi_sync_master/slave.so
->rpl_semi_sync_source/replica.so
) - プラグインファイル名(
semisync_master/slave.so
->semisync_source/replica.so
) - オプション名、ステータス変数名
- 以前の名称のプラグインを使うことも可能です
- プラグイン名(
- MySQLソースコード
- C++ ファイル名
- C++ ファイルのヘッダーガード
- デバッグシンボル
- レプリケーション プロトコル ハンドシェイクで渡されるユーザー変数
- これらは内部的な変更でありユーザに影響しません
- MySQL Server システム変数名
- 例として log_slave_updates 等
- MySQL Server ステータス変数名
- 例として Com_slave_start 等
- MySQL Server コマンドラインオプション
- mysqladmin コマンドラインオプション
- mysqlbinlog コマンドラインオプション
- mysqldump コマンドラインオプション
- MySQL Server SQL関数名
一部NDB Cluster関連のオプション・ステータス変数や、削除予定のオプション・ステータス変数については、従来の語句のまま残されました。
MySQL 8.0.33における変更
このバージョンでは、エラーメッセージに含まれる master, slave, MTS といった用語が置き換えられました。
Changes in MySQL 8.0.33 (2023-04-18, General Availability)
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-33.html#mysqld-8-0-33-feature
Replication: As part of ongoing work to change old terminology used in MySQL products, the terms “master”, “slave”, and “MTS” have been replaced in error messages relating to MySQL Replication by “source”, “replica”, and “MTA”, respectively. This includes all error messages listed in messages_to_clients.txt and messages_to_error_log.txt relating to replication; the present task does not perform this replacement for messages used in other contexts.
See the MySQL 8.0 Error Message Reference, for more information. (Bug #108422, Bug #34594819, WL #14191)
MySQL 8.2.0における変更
このバージョンでは、さらに残っていたコマンドについてのエイリアスが提供されました。
Changes in MySQL 8.2.0 (2023-10-25, Innovation Release)
https://dev.mysql.com/doc/relnotes/mysql/8.2/en/news-8-2-0.html#mysqld-8-2-0-sql-syntax
元コマンド | エイリアス | 説明 |
---|---|---|
RESET MASTER |
RESET BINARY LOGS AND GTIDS |
MASTER_HOST等のオプションのエイリアスとしてSOURCE_HOST等を追加 |
SHOW MASTER STATUS |
SHOW BINARY LOG STATUS |
MASTER_LOG_POSおよびMASTER_LOG_FILEについて、SOURCE_LOG_POSおよびSOURCE_LOG_FILEのエイリアスを追加 |
SHOW MASTER LOGS |
SHOW BINARY LOGS |
- |
PURGE MASTER LOGS |
PURGE BINARY LOGS |
- |
上記に合わせて Com_show_master_status ステータス変数が Com_show_binary_log_status 変数にリネームされています。
また、 ALTER EVENT
、CREATE EVENT
で使用されている DISABLED ON SLAVE
句は DISABLED ON REPLICA
に変更されています。
https://dev.mysql.com/doc/refman/8.0/ja/replication-features-invoked.html#idm45467798485328
https://dev.mysql.com/doc/refman/8.0/ja/create-event.html
さらに、mysqldump
が出力するダンプファイルの内容について、センシティブなキーワードに関する互換性を保持する形式とするかどうかを --output-as-version
オプションで制御できるようになりました。
--output-as-version = BEFORE_8_0_23
では、MASTER/SLAVE表記のコマンドになり、--output-as-version = BEFORE_8_2_0
では8.2.0によるエイリアスを除きSOURCE/REPLICA形式になり、--output-as-version = SERVER
ではサーバのバージョンを基準にそれらを使い分ける形になります。
MySQL 8.4.0における変更
そして先日リリースされたMySQL 8.4.0においては、2020年から進めてきたセンシティブなキーワードの置き換えを前進させて、置き換え対象の語句を含むコマンド、変数、オプションは 削除 されました。
Changes in MySQL 8.4.0 (2024-04-30, LTS Release)
https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html#mysqld-8-4-0-deprecation-removal
Master/Slave等のコマンドはすべて構文エラーとなります。
今まで慣れ親しんだコマンドが構文エラーとなってしまうと驚いてしまうかもしれませんが、これは8.4の予想された動作です。
1 2 |
$ mysql -e "SHOW SLAVE STATUS" ERROR 1064 (42000) at line 1: 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 |
ステータス変数、システム変数を確認すると、まだすべてが削除されていません。
ですが、これらは非推奨であったりNDB専用の変数であったりするため、将来のバージョンでは大半は削除されていく予定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ mysql -e "select @@version" +-----------+ | @@version | +-----------+ | 8.4.1 | +-----------+ $ mysql -e "SHOW GLOBAL STATUS LIKE '%master%'" $ mysql -e "SHOW GLOBAL STATUS LIKE '%slave%'" +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | Slave_open_temp_tables | 0 | +------------------------+-------+ $ mysql -e "SHOW GLOBAL VARIABLES LIKE '%master%'" +------------------------------------------------+-------+ | Variable_name | Value | +------------------------------------------------+-------+ | binlog_rotate_encryption_master_key_at_startup | OFF | | master_verify_checksum | OFF | | sync_master_info | 10000 | +------------------------------------------------+-------+ $ mysql -e "SHOW GLOBAL VARIABLES LIKE '%slave%'" +-----------------------------+---------------+ | Variable_name | Value | +-----------------------------+---------------+ | init_slave | | | log_slave_updates | ON | | log_slow_slave_statements | OFF | | rpl_stop_slave_timeout | 31536000 | | skip_slave_start | OFF | | slave_allow_batching | ON | | slave_checkpoint_group | 512 | | slave_checkpoint_period | 300 | | slave_compressed_protocol | OFF | | slave_exec_mode | STRICT | | slave_load_tmpdir | /tmp | | slave_max_allowed_packet | 1073741824 | | slave_net_timeout | 60 | | slave_parallel_type | LOGICAL_CLOCK | | slave_parallel_workers | 4 | | slave_pending_jobs_size_max | 134217728 | | slave_preserve_commit_order | ON | | slave_skip_errors | OFF | | slave_sql_verify_checksum | ON | | slave_transaction_retries | 10 | | slave_type_conversions | | | sql_slave_skip_counter | 0 | +-----------------------------+---------------+ |
影響されるソフトウェアについて
MySQLのエコシステムを支えるソフトウェアに Master/Slave
の語句を使用しているものは数多くあります。
今も活発にメンテナンスされているものもあれば、そうではないソフトウェアもあり、従来のMaster/Slave
表記のコマンドを使用しているソフトウェア、またはソフトウェアの部分的な機能は8.4以降で利用できなくなります。
代表的なソフトウェアで影響を受けるものに以下があります。
※ 影響の有無の判断については、ソースコード中に MASTER/SLAVE
の語句を含んだコマンドを実行しているか否かで判定
- percona toolkit
- pt-online-schema-change, pt-table-checksum, pt-archiver等レプリカの監視や操作を行うもの
- PT-1906によって対応は進められています
- gh-ost
- なお、pt-online-schema-change, gh-ostの後発ツールであるspiritでは8.4対応が済んでいます
- orchestrator
- mha
- innotop
- Issueは上がっておりyoku0825さんの環境で8.4を使い始めたら対応されるとのコメントがありました😀
- phpmyadmin
また、独自に作成している監視用スクリプト等も、8.4対応になっていない場合はエラーとなってしまいます。
上記に限らず幅広い影響が考えられますので、8.4へのアップグレード前に影響範囲についてチェックを行う必要があるでしょう。
まとめ
MySQL 8.4でのセンシティブなキーワードの置き換えについて説明させていただきました。
何らかの救済措置があればよかったのですが、現在のところ互換モードがオプションで設定できるといった情報は確認できていません。
今はもうメンテナンスされていないソフトウェアであっても有用なものは数多くあるかと思います。
ぜひ今後のリリースで何かしらの対応策が出ることに期待したいところです。
Lets enjoy MySQL!