前言

因个人需求,我在自己的电脑上通过 Docker 安装 Mysql5.7,安装好之后,需要通过 my.cnf 的配置修改,若使用 SET GLOABL 的命令重启会导致配置还原,尤其是部分配置无法通过上述命令实现,可修改后发现无论如何都不能成功。最后发现是因为权限问题,因此记录该问题,方便自己和有遇到该问题的友人可以定位。

场景复现

  1. 安装 Mysql
    Tips: 若是线上服务则千万不要使用 docker 创建任何数据库 😃
docker run -p 4406:4406 --name "test-mysql" -e MYSQL_ROOT_PASSWORD=123456 -d mysql
:5.7
  1. 进入容器
docker exec -it test-mysql bash
  1. 定位 mysql 相关配置文件,输入如下命令
## 定位 mysqld 服务的绝对路径
which mysqld
## 输出 /usr/sbin/mysqld

## 根据绝对路径定位对应配置文件
/usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"
## 输出如下
## Default options are read from the following files in the given order:
## /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

# 经过确认, 目录为 /etc/mysql/my.cnf, 其他目录不存在,若有时候是配置文件找不到可以参照上述命令
  1. 通过 my.cnf 确认最终引入的目录为 /etc/mysql/mysql.conf.d//etc/mysql/conf.d/, 进入 mysql.conf.d 目录修改 mysqld.cnf 文件 ,添加配置如下所示
# 修改事务隔离级别
transaction-isolation=READ-COMMITTED
# 设定 innodb 日志文件大小
innodb_log_file_size = 268435456
# 设定服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小
max_allowed_packet=35651584
# 设定数据库默认排序
collation_server=utf8_unicode_ci
# 设定字符集
character_set_server=utf8
# 让客户端始终跟服务端保持一致的配置,例如字符编码
skip-character-set-client-handshake
# 是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启
symbolic-links=0
  1. 在 windows 上进行修改, 然后使用 docker cp 复制过去, 重启mysql 服务,通过客户端查看对应系统变量修改的结果发现修改不成功,后面发现对应权限变成 777 导致的
ls -l  /etc/mysql/mysql.conf.d/
# total 4
# -rwxrwxrwx 1 1000 1000 1852 Aug 15 17:36 mysqld.cnf

# 此时输入 
/usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"
# 提示 mysqld: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored.
# 若不知道这个命令,你就是陷入似死胡同,这个是 mysqld 的一个权限要求。


# 修改权限
chomd 655 /etc/mysql/mysql.conf.d/mysqld.cnf

  1. 重试后,输入对应命令发现修改成功
SHOW VARIABLES LIKE '%tx_isolation%';
SHOW VARIABLES LIKE "%max_allowed_packet%";
SHOW VARIABLES LIKE "%innodb_log_file_size%";

总结

导致该问题的原因是 777权限导致的,而之前不知道存在权限问题,也不知道在哪能看到配置文件被忽略的错误,只是一味的反复修改配置,怀疑配置错误、配置的地方错误,逐渐怀疑人生。后面拨开云雾见明月,而导致权限变成 777 的原因是我操作 docker cp 进行文件复制导致的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐