41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

オラ、internal_tmp_disk_storage_engineなんてパラメータ知らねえぞ~!

はじめに

この記事は MySQL Advent Calendar 2024 シリーズ2 1日目の記事です。

せっかくシリーズ2があるので、25日過ぎたけど簡易的なネタでもぶっこんでみようかと。

何をしてどうなった?

アップグレードの時に以下のエラーメッセージが出てアップグレードできなかった。

エラーメッセージ

エラーログに以下のようなメッセージが出ます。

[ERROR] [MY-000067] [Server] unknown variable 'internal_tmp_disk_storage_engine=InnoDB'.

理由

internal_tmp_disk_storage_engineってパラメータなんですが、5.7.5で入り、8.0.16で削除されました。

そのため、8.0.16よりも前のバージョン(※5.7.5以降)でmy.cnfやmy.iniにinternal_tmp_disk_storage_engineを設定して、それをそのまま使って起動すると上記のようなメッセージが出るというわけです。

オンディスク内部一時テーブルのエンジンを設定できるパラメータで、デフォルトがInnoDBなんですが、それをMyISAMにすることができました。

理由はいくつかありますが、InnoDBがMyISAMよりもサイズ的な制限が多いこと、内部一時テーブルがでかくなりやすくて再起動しないと縮小できないのが困ること、またはバグ対応などでしょう。

場合によってはワーニングに

ちなみに、これ、面白いのが、my.cnf | my.ini に書かれてる場合だけで、SET PERSISTで設定した場合はエラーじゃなくて以下のようにワーニングに格下げするところです。

[Warning] [MY-013185] [Server] Currently unknown variable 'internal_tmp_disk_storage_engine' was read from the persisted config file.

ワーニングなんで起動はします。でも、RESET PERSISTで削除しといたほうがログ的にはいいでしょうね。

対応方法

8.0.16以上にアップグレードした際に、MySQL Server起動前にmy.cnfからinternal_tmp_disk_storage_engineパラメータの記述を削除するかコメントアウトすればいいだけです。

ワーニングの場合でも先ほども書いたようにRESET PERSISTで削除しとくことをお勧めします。

ところで、なんでinternal_tmp_disk_storage_engineは削除されたんだろ?

Bug #91377対応でしょう。

しかし、削除したことで・・・

internal_tmp_disk_storage_engineがInnoDBで固定化されたことで別のバグ(Bug #95285)が回避できないという問題もありました。

これについては、5.7では5.7.31に、8.0では8.0.21にアップグレードすることで修正されました。

そのため、8.0.16から8.0.20を使用している場合はこのバグの回避策が無いので、アップグレードが必要という話になりますね。

(8.0の迷走がこの辺はすさまじい頃ですね・・・)

関連ドキュメント

終わりに

実はこれ書いているのアドカレ終わった12月26日w

休みにMySQLのことを色々と見直そうと思ってデカい記事書きたかったんだけど、なかなかまとまらないので小出しにできるやつはそういう風にしようと思って書いているのでした。