[自分用メモ]MariaDB使用時に”InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.”になる

ContainerSoftware

docker環境において、基本的にはMySQLよりもMariaDBを指定することが多いのですが、そこもあまり深く考えずにタグを :latest で設定していたところ掲題のようなエラーが発生し、MariaDBが起動しないことがありました。

原因?

どうやら参考した記事によると、MariaDB 10.6からは innodb_read_only_compressed オプションが既定で有効になったことのためのようです。

対応

docker環境においては、command にて以下のコマンドを追加し、それぞれのオプションを無効化することで今回の問題に対応できるそうです。

  • --innodb_strict_mode=OFF
  • --innodb_read_only_compressed=OFF
  • innodb_read_only_compressed
    • ROW_FORMAT=COMPRESSEDのテーブルは読み取り専用になります。
  • innodb_strict_mode
    • XtraDB/InnoDBは特定のケースで警告ではなくエラーを返すようになり、厳格なSQLモードに似た状態になります。
mysql:
  image: mariadb
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_USER: db
    MYSQL_PASSWORD: db
    MYSQL_DATABASE: db
  command:
    - "--character-set-server=utf8mb4"
    - "--collation-server=utf8mb4_unicode_ci"
    - "--innodb_strict_mode=OFF"
    - "--innodb_read_only_compressed=OFF"
  volumes:
          - ./db:/var/lib/mysql

zabbix-dockerで構築した環境で、かつMariaDBを latest のタグで運用していて、何も考えずに docker pull して起動しなくて慌てました。検証環境だというのもあって大きな影響があったわけではないですが、重要な環境の場合はタグでしっかり管理して運用把握するようにしましょう。

ちなみにzabbix-dockerで公開されているdocker-compose.ymlには、そのままだとMariaDBは設定されていない(筆者がMySQLから置き換えた)ものをなので、普通はこのような状況にはならないはずです。

MariaDB 10.6未満からのバージョンアップを計画している人はご注意ください。

参考

InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE. と言われデータベースに書く込めないときの解決法 | ゆっくり遅報
mariadb10.6から「innodb_read_only_compressed」が追加されこれがデフォルトでONになっています。 この場合これと「innodb_strict_...
MariaDB Documentation
InnoDB Strict Mode | Server | MariaDB Documentation
InnoDB Strict Mode enforces stricter SQL compliance, returning errors instead of warnings for invalid CREATE TABLE optio...
タイトルとURLをコピーしました