Nextcloud Hub 10(也就是31.0)对数据库进行了大幅度优化,这对于使用 Mysql(MariaDB)数据库,自低版本升级上来的用户来说,就比较麻烦了,需要手动调整数据库表。否则会出现告警信息”Incorrect row format found in your database. ROW FORMAT=Dynamic offers the best database performances for Nextcloud.”,之后就是一大串需要修改的表名清单。
出现这个告警也没有必要紧张,不做处理也不会影响 Nextcloud 的基本功能,可能性能上会有些影响。告警的意思就是数据库中使用了不正确的行格式,推荐将表的行格式设置为”Dynamic”。
当 Mysql 数据库表使用 InnoDB 存储引擎时,InnoDB 存储引擎支持多种行格式,包括 Compact、Redundant、Dynamic和Compressed等。Dynamic 行格式是其中一种,它在存储数据时更为灵活和高效。
出现之前的告警,就是因为 Nextcloud 数据库中的一些数据表没有使用 Dynamic 行格式,现在需要将它们的行格式修改成 Dynamic。
首先登录 Mysql(MariaDB) 数据库,使用如下语句查看 Nextcloud 数据库中所有表使用的存储引擎:
MariaDB [(none)]> select table_name, engine from information_schema.tables where table_schema='nextcloud';
其中” table_schema=’nextcloud’ “为 Nextcloud 使用的数据库名,示例为”nextcloud”。语句执行完成后,就会显示所有表使用的存储引擎。不出意外的话,表的存储引擎会使用 InnoDB。
然后再执行如下语句查看数据表的行格式:
MariaDB [(none)]> select table_name, row_format from information_schema.tables where table_schema = 'nextcloud';
根据输出结果就会发现,数据表的行格式并不是全为 Dynamic。
之后,就可以使用如下语句调数据表的行格式,例如调整”oc_users”表:
MariaDB [(none)]> ALTER TABLE nextcloud.oc_users ROW_FORMAT=DYNAMIC;
此时,就将”oc_users”表的表格式修改 Dynamic 了。
这样一个表一个表的修改显然比较麻烦,也可以使用如下命令,将所有需要修改的表查出:
MariaDB [(none)]> select table_name, row_format from information_schema.tables where table_schema = 'nextcloud' and row_format <> 'Dynamic';
然后将每个表名的前后分别加上”ALTER TABLE nextcloud.”和” ROW_FORMAT=DYNAMIC;”,就为每个表分别生成了一条调整语句,将其保存成”nextcloud.sql”文件,并在 Mysql 中执行该语句文件即可。例如保存在”/root”目录,则使用:
MariaDB [(none)]> source /root/nextcloud.sql
执行成功后,所有的表格式就调完成了。
当然,也有人提供了一个脚本文件,内容如下:
#!/bin/bash # Prompt for database credentials read -p "Enter Database Name: " DB_NAME read -p "Enter Username: " DB_USER read -s -p "Enter Password: " DB_PASS echo # Execute all ALTER TABLE statements in one query mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -Bse " SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ROW_FORMAT=DYNAMIC;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$DB_NAME' AND ENGINE = 'InnoDB' " | mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME"
将以上文件保存成一个 shell 文件,例如”row_format.sh”,再使用”sudo ./row_format.sh”执行脚本即可。
脚本执行后,需要输入 Mysql 的数据库登录用户名密码以及 nextcloud 使用的数据库名,就会自动完成表格式的修改了。
以上两种方法都能实现要求,个人觉得第一种相对安全些,毕竟全程可控么。
调整完所有表的表格式,Nextcloud 的告警也就不会再出现了。