mita2 database life

主にMySQLに関するメモです

MySQL 8.0 で無理矢理ダウングレードを試みる(未完了)

以前も書きましたが、MySQL のバージョンが 8.0 になってからダウングレードが出来なくなりました。マイナーバージョンであってもダウングレードすることが出来ません。ダウングレードするには、古いバージョンをインストールしたサーバを用意し、mysqldumpでデータを投入しなおす必要があります。

mita2db.hateblo.jp

バイナリハックで無理矢理ダウングレード

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 = {

うーん、ちょっとこれは、一筋縄では行かない予感がしてきました。つづく?