Mariadb较新版本导入mysqldump时报错ROW_FORMAT=COMPRESSED及其他问题

于 2021-09-04 发布

ROW_FORMAT=COMPRESSED

出现这个问题主要是Mariadb 10.6开始默认设置了innodb对ROW_FORMAT=COMPRESSED的表只读(readonly),对应的设置项是cnf中[mysqld]节的innodb_read_only_compressed。(参见 innodb-read-only-compressed

碰到有关ROW_FORMAT=COMPRESSED报错的场景主要有:

  1. 从低于Mariadb 10.6版本的旧Mariadb中mysqldump然后导入新版本数据库中
  2. Nextcloud的occ做maintenance:repair

为了解决这个问题,需要做以下处理:

  1. 用命令行参数--skip-innodb-read-only-compressedsystemctl edit --full mariadb直接添加到ExecStart=后面)让它支持读写,进行导入(针对上面的情况1)
  2. 进入mysql命令行,用ALTER TABLE 表名 ROW_FORMAT=DYNAMIC;来修改ROW_FORMAT
  3. 关掉--skip-innodb-read-only-compressed(用systemctl edit来删掉之前添加的参数)
  4. 进行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。真是方便了很多呢!

目录