Site Loader

在Nextcloud 15或更高版本中,系统支持文件名或评论中使用4字节字符(比如emoji表情),但由于大多数用户是由Nextcloud旧版本升迁到新版本,数据库并没有更新相关设置。会导致【安全及设置警告】中提示”所使用的数据库为MySQL但没有对4字节字符的支持。为正确处理文件名或评论中使用的4字节字符(比如emoji表情),建议开启MySQL的4字节字符支持。“

可通过开启MySQL的4字节字符解决问题,具体步骤如下:

在开启MySQL的4字节符前,先把当前Nextcloud数据库备份一下,以备不时之需。

执行如下命令,其中密码是数据库root用户的密码,数据库是Nextcloud的数据库,数据将备份到/var/tmp下,备份文件格式为gzip,备份存放目录及备份文件名称可自行设定

mysqldump -uroot -p密码 数据库 | gzip > /var/tmp/data`date +%Y-%m-%d_%H%M%S`.sql.gz

查看/var/tmp,备份文件已生成。

1. 确认MySQL或MariaDB版本(下面以MariaDB为例)

ssh连接服务器,用数据库root用户进入MariaDB查询版本号

mysql -u root -p

此时会看到MariaDB版本号

或者进入MariaDB后,输入status,可查看更详细的信息。

2. 修改MySQL或MariaDB数据库InnoDB设置

a. MySQL 8.0或更高版本:

修改MySQL配置文件(一般存放于/etc/mysql目录下),在 [mysqld]下添加如下配置项。

[mysqld] 
 innodb_file_per_table = 1

b. 低于MySQL 8.0版本:

修改MySQL配置文件,在 [mysqld]下添加如下配置项。

[mysqld] 
innodb_large_prefix = true 
innodb_file_format = barracuda 
innodb_file_per_table = 1

c. MariaDB 10.3或更高版本:

修改/etc/mysql/mariadb.conf.d/50-server.cnf配置文件, 在 [mysqld]下添加如下配置项。

[mysqld] 
innodb_file_per_table = 1

d. MariaDB 10.2或更早版:(本事例中,MariaDB版本为10.1.38)

修改/etc/mysql/mariadb.conf.d/50-server.cnf配置文件, 在 [mysqld]下添加如下配置项。

[mysqld] 
innodb_large_prefix = true 
innodb_file_format = barracuda 
innodb_file_per_table = 1
  • 重启数据库服务
service mysqld restart

3. 开启MySQL 4字节支持

a. MySQL:

  • 数据库root用户登入MySQL
mysql -u root -p
  • 更改数据库字符集和排序规则
ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 退出MySQL数据库
exit
  • 在Nextcloud的config.php中把mysql.utf8mb4设为true,进入Nextcloud网站目录,运行如下命令
sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
  • 通过运行修复步骤将Nextcloud所有表转换为新的排序规则
sudo -u www-data php occ maintenance:repair
  • 等待完成。

完成后,再次刷新管理后台的【概览】页,相关警告提示消失。

b. MariaDB

  • 数据库root用户登入MySQL
mysql -u root -p
  • 查看Nextcloud数据库文件格式是否已更改为Barracuda,命令中“数据库名称”更换为你的Nextcloud数据库名称,记得保留后面的“%”符号。
SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "数据库名称%";

由上图看出文件格式为Antelope,因些我们必须对数据库文件格式进行转换。

  • 创建批量转换SQL命令并执行转换

进入INFORMATION_SCHEMA数据库

USE INFORMATION_SCHEMA;   

生成Nextcloud数据库的批量转换SQL命令,命令中“数据库名称”更改为你的Nextcloud数据库名称。

SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ROW_FORMAT=DYNAMIC;") AS MySQLCMD FROM TABLES WHERE TABLE_SCHEMA = "数据库名称";

生成以下批量转换SQL命令,将其拷出,粘贴到记事本。

在复制时,会把命令前后的竖杠符号“|”也一并复制了,在记事本中用替换工具将其替换掉。

点击【全部替换】,所有竖杠将消失。

在记事本中全选并复制所有命令,并粘贴到ssh中,此时,数据库将逐一执行转换工作,如下图所示,静待完成。

  • 再次查看Nextcloud数据库文件格式是否已更改为Barracuda,命令中“数据库名称”更换为你的Nextcloud数据库名称,记得保留后面的“%”符号。
SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "数据库名称%";

此时,所有数据库文件格式已成功转换为Barracuda。

  • 在Nextcloud的config.php中把mysql.utf8mb4设为true,进入Nextcloud网站目录,运行如下命令。
sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
  • 通过运行修复步骤将Nextcloud所有表转换为新的排序规则 。
sudo -u www-data php occ maintenance:repair
  • 等待完成。

完成后,再次刷新管理后台的【概览】页,相关警告提示消失。