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
2
DROP TABLE IF EXISTS `mysql`.`global_priv`;
DROP VIEW IF EXISTS `mysql`.`user`;
参考MariaDB - MySQL - ALL-DB Import - Table ‘user’ already exists。但是遇到这个问题的时候通常已经导入了一些了,担心数据库不完整,想reset一下怎么办?
重置Mariadb为刚安装的状态
贴一个脚本,适用于Debian 10 (buster):
1
2
3
4
5
#!/usr/bin/sh
systemctl stop mysql
rm -rf /var/lib/mysql/*
mysql_install_db
systemctl start mysql
参见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
2
[mysqld]
innodb_read_only_compressed=OFF
保存之后systemctl restart mariadb
即可。如果要改回readonly,那就注释掉第二行,重启mariadb。真是方便了很多呢!