これは MySQL Advent Calendar 2022 8 日目の記事です。
はじめに
MySQL Server 8.0.29はGAであるにもかかわらず、今はダウンロードすることができません。
(なんかそれ自体闇歴史の最後を飾っても良い話な気がしてきた。きっと誰かが書くだろうw)
それは8.0.29でALGORITHM=INSTANTを使用して追加(削除も含む)されたカラムを持つInnoDBテーブルのデータが正しく解釈されないという重大な問題があるためです。
具体的にはどのような話なのでしょう?
バグの詳細については多くがセキュリティの点から非公開となっているので、公開されているリリースノート等で見ていきましょう。
(リリースノートの和訳についてはDeepLを使ってそのままのものを記載してます。
わかりにくいからと言ってどういうことかを説明すると書いてはいけないことを
書いてしまうかもしれませんので、申し訳ないですが英語か翻訳から感じ取ってください)
リリースノートを眺める
現在、リリースノートは8.0.29以降では8.0.30、8.0.31のものが出ています。
8.0.30のリリースノートより
InnoDB: A TRUNCATE TABLE operation failed to remove data dictionary entries for columns that were dropped using ALGORITHM=INSTANT. Thanks to Marcelo Altmann for the contribution. (Bug #34302445)
訳:TRUNCATE TABLE操作で、ALGORITHM=INSTANTを使用して削除された列のデータ辞書エントリーを削除できない。
ちなみにMarcelo AltmannはOracle ACEでPercona社の人です。この8.0.29とPercona XtraBackupの非互換性の記事や、このバグについての話も書いてますね。
InnoDB: An incorrect nullable column calculation on tables with instantly added columns caused data to be interpreted incorrectly. (Bug #34243694)
訳:即座に追加されるカラムを持つテーブルで、不正なNullableカラムの計算が行われ、データが不正に解釈されることがありました。
InnoDB: After upgrading to MySQL 8.0.29, a failure occurred when attempting to access a table with an instantly added column. (Bug #34233264)
訳:MySQL 8.0.29 にアップグレードした後、即座に追加されたカラムを持つテーブルにアクセスしようとすると失敗することがありました。
InnoDB: Only the physical position of instantly added columns was logged, which was not sufficient for index recovery. The logical position of columns was also required. (Bug #34181432)
訳:即座に追加された列の物理的な位置のみが記録され、インデックスの復元には不十分であった。カラムの論理位置も必要であった。
8.0.31のリリースノートより
InnoDB: After upgrading to a release that supports row versions for columns added or dropped using ALGORITHM-INSTANT, a failure occurred during an instant ADD COLUMN operation on a table with a nullable column and an instantly added column. (Bug #34488482)
訳:ALGORITHM-INSTANT を使用して追加または削除された列の行バージョンをサポートするリリースにアップグレードすると、NULL 可能な列とINSTANTで追加される列を持つテーブルで(ALGORITHM)INSTANT ADD COLUMN 操作中に失敗が発生しました。
InnoDB: A column added using ALGORITHM=INSTANT was visible in read views created before the DDL operation that added the column. (Bug #33937504)
訳:ALGORITHM=INSTANT を使用して追加された列が、列を追加した DDL 操作の前に作成された読み取りビューに表示されていました。
今回の騒動を受けて僕個人が思う事
これはあくまで個人的に思ってることで、会社は一切関係無いんでそこのところだけはご理解ください。
機能追加はマイナーバージョンでするもんじゃない(少なくともGAになってからは)
今回のことがあるまではMySQL何でこんなアップグレード時に機能ぶっこんでくるんだよ!バグが生まれ続けるじゃねーか…、
などと思いつつも、便利になるんなら仕方ないのかなとも思ってたんです。
でも、リリースしたものをダウンロードできなくしたって言うのはあまりにもカッコ悪い。
やはり「機能追加はマイナーバージョンでするもんじゃない」です。(他のRDBMSではあまり見ないですしね)
最新=Bestじゃなくなった
そのせいで気軽にアップグレードしてくださいを言いにくくなりましたよ。
もちろん、今は8.0.31まであるんで特定のバグを解消する方法がアップグレードするしかないんならそれをお勧めしますよ。
しかし新機能が追加されてたら、そいつのせいでまた何か起きるんじゃないかとユーザーは疑心暗鬼になるし、僕としても絶対に無いとは言えないのでそれについてはどうしようもない。
信用をこれ以上失わないためにも今後は新機能追加とか勘弁願いたいし、やるなら8.1だとか9.0だとか別バージョン切ってやって欲しいですわ。
次の8.0.32は1月頃でしょうかね。そこでも何らかの情報は上がってくるかもしれませんが、改良はしても新機能追加だけは勘弁。
yoku0825さん、あなたはホンマに凄い!
この先見の明と野生の勘に中の飼育員もアッパレでした。
ぼくらが選んだ次のMySQL 8.0 / MySQL80 Which We Choose - Speaker Deck
「INSTANT DROP COLUMN(と、その影響で任意の個所にINSTANT ADD COLUMNできるようになった)はヤバい」
最後に
意外と8.0.29を使っている人を問合せで見かけます。
それは氷山の一角で、サポート外の人たちを含めたら相当数なんじゃないかと思ってます。
早急にアップグレードを検討することをお勧めします。
すぐにはアップグレードが難しければALGORITHM=INSTANT を使用してカラム追加は避けてください。
明日は そんな先見の明と野生の勘を持つ、【現役Oracle ACE】の yoku0825 さんです!