以前も書きましたが、MySQL のバージョンが 8.0 になってからダウングレードが出来なくなりました。マイナーバージョンであってもダウングレードすることが出来ません。ダウングレードするには、古いバージョンをインストールしたサーバを用意し、mysqldumpでデータを投入しなおす必要があります。
バイナリハックで無理矢理ダウングレード
mysqldump するのが面倒。。。ということで、データファイルをいじって、どうにか古いバージョンで起動できないかやってみます。 結論から言うと、まだ攻略できずにいます。
以下、作業記録。
ダウングレードした際のエラーメッセージから、mysql.ibd
にバージョン情報が含まれていることが推測できます。
mysql.ibd
に記録されているバージョンを古いバージョンに無理矢理書き換えることができれば、古いバイナリでも起動できる可能性がありそうです。
2020-02-09T05:03:23.282471Z 1 [ERROR] [MY-013171] [InnoDB] Cannot boot server version 80018 on data directory built by version 80019. Downgrade is not supported mysqld: Can't open file: 'mysql.ibd' (errno: 0 - )
経験からだいたい、データファイルの先頭のヘッダ部分にこういったメタ情報が(バイナリで)書かれているであろうと推測できます。
8.0.19を示す、80019
を 16進数にした値を頭にいれておきます。mysql.ibd
にこのバイナリ列がどこかにあるはずです。
# printf %x 80019 13893
やっぱり、先頭の9バイト目〜12バイトの4バイトにバージョンが書かれていそうです。
# xxd mysql.ibd | head -n2 0000000: d42f 71ae 0000 0000 0001 3893 0000 0001 ./q.......8..... ^^^^^^^^^ 0000010: 0000 0000 6e1d 5d0e 0008 0000 0000 0000 ....n.].........
データファイルのバイト列を書き換えます。まずは、xxd
で16進数のテキストファイルに変換し、編集しやすくします。
# xxd -p mysql.ibd > mysql.ibd.hex # head -n1 mysql.ibd.hex d42f71ae000000000001389300000001000000006e1d5d0e000800000000
013893
の部分を013892
に差し替えます。
# echo $(head -n1 mysql.ibd.hex | cut -b1-18)013892$(head -n1 mysql.ibd.hex | cut -b25-) > mysql.ibd.8018hex # tail -n +2 mysql.ibd.hex >> mysql.ibd.8018hex
16進のテキストファイルからバイナリに戻します。
$ cat mysql.ibd.8018hex | xxd -r -p - - > mysql.ibd $ chown mysql:mysql mysql.ibd
起動してみる
(゜д゜)<あらやだ!
先ほどのメッセージは出なくなったものの、checksum で弾かれてしまった。
2020-02-09T12:10:09.861801Z 1 [ERROR] [MY-012224] [InnoDB] Checksum mismatch in datafile: mysql.ibd, Space ID:4294967294, Flags: 18432. Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
checksum を無視しちゃいましょう。
$ vim /etc/my.cnf innodb_checksum_algorithm=none
それでも、まだエラーがでて、起動できませんね。。。ぐぬぬぬ
2020-02-09T12:16:22.837006Z 1 [ERROR] [MY-013326] [Server] Upgrading the server from server version '80019' is not supported.
エラーメッセージからソースコードを追っていきます。
# grep -B1 -r 'Upgrading the server' share/errmsg-utf8.txt ER_SERVER_UPGRADE_VERSION_NOT_SUPPORTED eng "Upgrading the server from server version '%u' is not supported."
dd
、つまり Data Dictionary でチェックが入ってそうです。
# grep -r ER_SERVER_UPGRADE_VERSION_NOT_SUPPORTED * share/errmsg-utf8.txt:ER_SERVER_UPGRADE_VERSION_NOT_SUPPORTED sql/dd/impl/bootstrap/bootstrapper.cc: LogErr(ERROR_LEVEL, ER_SERVER_UPGRADE_VERSION_NOT_SUPPORTED, sql/dd/impl/bootstrap/bootstrapper.cc: LogErr(ERROR_LEVEL, ER_SERVER_UPGRADE_VERSION_NOT_SUPPORTED,
ソースを辿っていくと、DDのテーブルごとのエントリーにバージョン情報が含まれていて、ここも書き換えないとダメそうです。
sql/dd/impl/tables/dd_properties.cc
68 /* 69 Initialize the descriptors of the valid keys. The keys are used for 70 the following purposes: 71 72 DD_VERSION Actual DD version. 73 IS_VERSION Actual I_S version. 74 PS_VERSION Actual P_S version. 75 SDI_VERSION Actual SDI version. 76 LCTN L_C_T_N setting used during 77 --initialize. 78 MYSQLD_VERSION_LO Lowest server version which has 79 been using the data directory. 80 MYSQLD_VERSION_HI Highest server version which has 81 been using the data directory. 82 MYSQLD_VERSION Current server version. 83 MINOR_DOWNGRADE_THRESHOLD The current DD can be used by 84 previous MRUs, unless their 85 target DD version is less than 86 the downgrade threshold. 87 SYSTEM_TABLES List of system tables with 88 definitions. 89 UPGRADE_TARGET_SCHEMA Temporary schema used during 90 upgrade. 91 UPGRADE_ACTUAL_SCHEMA Temporary schema used during 92 upgrade. 93 MYSQLD_VERSION_UPGRADED The server version of the last 94 completed successful upgrade. 95 */ 96 m_property_desc = {
うーん、ちょっとこれは、一筋縄では行かない予感がしてきました。つづく?