はじめに
2024 年 4 月 30 日に MySQL 8.4 Long-Term Support (LTS) がリリースされました。
LTS と Innovation Release の違いについては、以前のブログ記事でも触れていますが、公式リファレンスにも新しく説明が追加されているので、まずはこちらをご参照ください。
今回は、MySQL 8.4 からサポートされるようになった下位バージョンへのダウングレード方法について、その範囲と方法について確認していきたいと思います。
サポート範囲
Downgrade Path Path Examples Supported Downgrade Methods Notes Within an LTS series 8.4.y LTS to 8.4.x LTS In-place, logical dump and load, MySQL Clone, or by using replication From an LTS or Bugfix series to the previous LTS or Bugfix series 8.4.x LTS to 8.0.y Logical dump and load or by using replication Only supported for rollback purposes (that is, if no new server functionality has been applied to the data) From an LTS or Bugfix series to an Innovation series after the previous LTS series 8.4.x LTS to 8.3.0 Innovation Logical dump and load or by using replication Only supported for rollback purposes (that is, if no new server functionality has been applied to the data) From within an Innovation series 8.3 to 8.2 Logical dump and load or by using replication Only supported for rollback purposes (that is, if no new server functionality has been applied to the data)
サポートされるダウングレードの範囲については、以下の 4 つに分けられています。
- 同一の LTS 内 : 例) 8.4.5 → 8.4.1 など
- 特定の LTS から前の LTS(あるいはバグ修正リリース) : 例) 8.4.0 → 8.0.37 など
- 特定の LTS から前の LTS 以降の Innovation Release : 例) 8.4.0 → 8.3.0 など
- Innovation Release の間 : 例) 8.3.0 → 8.2.0 など
MySQL 8.0 においては 8.0.34 以降がバグ修正リリースであるため、それ以前のバージョン(MySQL 8.0.33 以前)についてはダウングレードのサポート対象外である点に注意する必要があります。なお、2 から 4 についてはロールバック(切り戻し)のためのダウングレードのみがサポートされており、普段から利用することは想定されていません。
また、アップグレードの際は LTS を跨ぐような(MySQL 8.0 LTS → MySQL 9.x LTS)アップグレードはサポートされていないため、恐らくダウングレードにおいても同様に 1 つ前の LTS までしかサポートされていないことが想定されます。
サポートされるダウングレード方法
1 の場合、以下の方法によるダウングレードがサポートされています。
- インプレースダウングレード
- クローンプラグインを利用したダウングレード
- 論理バックアップのリストアによるダウングレード
- レプリケーション機能を利用したダウングレード
一方 2 から 4 においては制限があり、以下のダウングレード方法しかサポートされていないので注意してください。
- 論理バックアップのリストアによるダウングレード
- レプリケーション機能を利用したダウングレード
それでは、それぞれの実施手順について確認をおこなってみたいと思いますが、現時点で MySQL 8.4 のバージョンは 1 つしかないので、今回は MySQL 8.0 のバグ修正リリースへのダウングレード方法に絞って検証をおこないます。
論理バックアップのリストアによるダウングレード
この方法は、MySQL 8.0.33 以前と同様のダウングレード手順となります。
なお、現時点で公式から手順は公開されていませんが、過去バージョン(MySQL5.7)のリファレンスに手順が存在しているので、こちらを参考に実施していきます。
環境情報
- OS : Redhat Enterprise Linux 9
- MySQL : MySQL 8.4.0 および MySQL 8.0.34(ダウングレード先)
- 設定値 : RPM パッケージインストール後のデフォルト値を使用
論理バックアップの取得
以下のどちらかの方法で論理バックアップを取得します。なお、mysqlpump については MySQL 8.4 で削除されてしまったのでご注意ください。
今回は mysqldump による論理バックアップを取得する方法で検証してみたいと思います。
まず、以下のコマンドでバックアップを取得します。
1 2 3 4 5 6 7 8 |
# mysqldump [接続用オプション] --single-transaction \ --all-databases \ --events \ --triggers \ --routines \ --output-as-version=BEFORE_8_2_0 \ > all_dump.log |
–output-as-version は新しく追加されたオプションであり、後方互換性のために以下の値を設定することが出来ます。
- SERVER :
実行したサーバーを読み込んで、そのバージョンと互換性を持つようにダンプファイルを構成します。 - BEFORE_8_0_23 :
source
およびreplica
という用語を、現在は削除されているMASTER
およびSLAVE
に置き換えて出力します。 - BEFORE_8_2_0
SHOW CREATE EVENT
におけるDISABLE ON REPLICA
の出力をDISABLE ON SLAVE
に置き換えます。
今回はダウングレード先が MySQL 8.0.34 であるため、 BEFORE_8_2_0
を指定してバックアップを取得します。
データの初期化とリストア
RPM パッケージのダウングレードをおこなった後、一度全てのデータを削除して、その後データの初期化をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# mysql --version mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) # rm -rf /var/lib/mysql # mysqld --initialize # chown -R mysql:mysql /var/lib/mysql # systemctl start mysqld # grep "temporary password" /var/log/mysqld.log (...) 2024-05-14T08:59:47.682299Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: <Nt-e8/RXtkf # mysql -uroot -p Enter password: [先ほど確認したパスワードを入力] (...) mysql> ALTER USER root@localhost IDENTIFIED BY 'MySQL8.0'; mysql> quit |
初期化をおこなった後、データのリストアを実行します。
1 |
mysql -uroot -pMySQL8.0 < all_dump.log |
リストア後は、ユーザー権限などの反映をおこなうため一度プロセスの再起動をおこない、これでダウングレードが完了します。
1 |
# systemctl restart mysqld |
レプリケーション機能を利用したダウングレード
現時点で公式から手順は公開されていませんが、ダウングレードマニュアルの「using replication」という記載や、以前公開された LTS に関する記事の内容から推察すると、たとえば(ロールバックのために)MySQL 8.4 をソースとして MySQL 8.0.34 とレプリケーションをおこなうことがサポートされるようになったと理解できます。
MySQL の非同期レプリケーションによるアップグレードとダウングレード
ビジネス・クリティカルな環境でのアップグレードは多くの場合、MySQL の非同期レプリケーションを用いて行われ、新しいバージョンでの環境が現在のバージョンのレプリカとして設定されます。これにより、ダウンタイムがほぼゼロのアップグレードが可能になります。
レプリケーションはある LTS または Innovation リリースをソースとすると、次に挙げるバージョンをレプリカとして可能になります。
- 次の LTS リリース
- 次の LTS リリースまでの間の全ての Innovation リリース (例として、LTS 8.4 → LTS 9.7は可能ですが、LTS 8.4 → LTS 10.7 は不可)
新しいバージョンを展開した後に問題が発生した場合は、以前のバージョンにレプリケートして戻せることが重要です。したがって、MySQL の非同期レプリケーションは以前のバージョンにレプリケートできます。このサポートはロールバックのみを目的としており、新しい機能はまだ使用されていないことが必要ですし、通常の継続的な本番環境構築の一部と見なすことはできません。
用途としては、たとえば MySQL 8.0 から MySQL 8.4 へのアップグレードを非同期レプリケーションを利用して切り替えた後、何らかの理由で MySQL 8.0 へ切り戻しを実施する必要が発生した場合に備えてこの手順を実施することで、ダウンタイムを抑えてダウングレードが実施できることが期待できます。
環境情報
[ソースサーバー]
- OS : Redhat Enterprise Linux 9
- MySQL : MySQL 8.4.0
- 設定値 : RPM パッケージインストール後のデフォルト値を使用(server_id のみ指定)
[ダウングレード先(レプリカサーバー)]
- OS : Redhat Enterprise Linux 9
- MySQL : MySQL 8.0.34
- 設定値 : RPM パッケージインストール後のデフォルト値を使用(server_id のみ指定)
(切り替え前)非同期レプリケーションの構築
MySQL 8.4 に切り替えて更新処理を開始する前に、MySQL 8.0.34 とのレプリケーションを開始しておきます。
まずはソースサーバーのバイナリログポジションを確認します。このとき、 SHOW MASTER STATUS
は利用できなくなっているので注意してください。
1 2 3 4 5 6 7 |
[MySQL8.4]mysql> SHOW BINARY LOG STATUS\G *************************** 1. row *************************** File: binlog.000004 Position: 691 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: |
その後、MySQL 8.0 側でレプリケーションを開始します。実際にはレプリケーションユーザーは既に作成されているかと思いますが、必要に応じて以下のようなユーザーを作成するようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[レプリケーション用ユーザーを作成する場合] [MySQL8.4]mysql> CREATE USER repl@'%' IDENTIFIED BY 'P@ssw0rd'; [MySQL8.4]mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%'; [レプリケーション設定] [MySQL8.0]mysql> CHANGE REPLICATION SOURCE TO -> SOURCE_HOST='192.168.174.161', -> SOURCE_USER='repl', -> SOURCE_PASSWORD='P@ssw0rd', -> SOURCE_LOG_FILE='binlog.000004', -> SOURCE_LOG_POS=691, -> SOURCE_SSL=1, -> GET_SOURCE_PUBLIC_KEY=1; [MySQL8.0]mysql> START REPLICA; [MySQL8.0]mysql> SHOW REPLICA STATUS\G (...) Replica_IO_Running: Yes Replica_SQL_Running: Yes (...) |
その後、もし切り戻しが必要になった場合は、レプリカである MySQL 8.0 に切り替えをおこなうことで、ダウングレードが完了します。
まとめ
ここまで、MySQL 8.4 においてサポートされるダウングレード方法について確認しました。
これまでは公式にはサポートされていなかったレプリケーションによるダウングレードがサポートされるようになったことで、ダウンタイムを抑えた切り戻しが実施しやすくなったのではないかと思います。
ただし、サポートされるようになったとはいえ全ての機能に対する後方互換性が担保されるようになったわけではありません。そのため、以下の非互換性についてチェックして、ダウングレードしても問題ないかどうかの確認を忘れないようにご注意ください。
https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html