ROW_FORMAT=COMPRESSED
出现这个问题主要是Mariadb 10.6开始默认设置了innodb对ROW_FORMAT=COMPRESSED的表只读(readonly),对应的设置项是cnf中[mysqld]节的innodb_read_only_compressed。(参见 innodb-read-only-compressed)
碰到有关ROW_FORMAT=COMPRESSED报错的场景主要有:
- 从低于Mariadb 10.6版本的旧Mariadb中mysqldump然后导入新版本数据库中
- Nextcloud的occ做
maintenance:repair时
为了解决这个问题,需要做以下处理:
- 用命令行参数
--skip-innodb-read-only-compressed(systemctl edit --full mariadb直接添加到ExecStart=后面)让它支持读写,进行导入(针对上面的情况1) - 进入mysql命令行,用
ALTER TABLE 表名 ROW_FORMAT=DYNAMIC;来修改ROW_FORMAT - 关掉
--skip-innodb-read-only-compressed(用systemctl edit来删掉之前添加的参数) - 进行occ的repair
Table ‘user’ already exists
导入mysqldump的文件时可能会报这个错,只需要修改mysqldump出来的文件,在文件开头添加:
1 | DROP TABLE IF EXISTS `mysql`.`global_priv`; |
参考MariaDB - MySQL - ALL-DB Import - Table ‘user’ already exists。但是遇到这个问题的时候通常已经导入了一些了,担心数据库不完整,想reset一下怎么办?
重置Mariadb为刚安装的状态
贴一个脚本,适用于Debian 10 (buster):
1 |
|
参见How to reset MariaDB into a “fresh install” state?。
更优雅地开关innodb_read_only_compressed
总是systemctl edit实在太难顶,实际上cnf也是提供了设置项的。在/etc/mysql/mariadb.conf.d里面新建一个配置文件50-innodb_rw.cnf,填入以下内容即可打开skip-innodb-read-only-compressed选项:
1 | [mysqld] |
保存之后systemctl restart mariadb即可。如果要改回readonly,那就注释掉第二行,重启mariadb。真是方便了很多呢!