我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

本文中,苏南大叔要解决的问题是:mysql的配置文件my.cnf不生效的问题。确定修改的文件没错,但怎么重启都不生效。该如何解决这样的问题呢?调试的龙套对象,依然还是docker版本的mysql:latest,实际的版本号是mysql@9.3.0

苏南大叔:mysql配置文件位置,如何解决配置文件不生效的问题? - mysql配置文件不生效
mysql配置文件位置,如何解决配置文件不生效的问题?(图5-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10docker@28.0.4mysql@5.7.44heidisql@12.10.0.7000。虽然是在windows系统下,但是因为使用了docker,所以配置文件是my.cnf,而不是my.ini

docker 安装 mysql:latest

因为通过docker安装mysql,会涉及到“目录映射”的问题,换句话说,就是会涉及到配置文件路径的问题。所以,这里提前贴出实验使用的mysql容器安装命令。

执行下面的命令之前,请保证d:/data/mysql/my.cnf文件存在,否则可能会错误的变成一个目录。

if not exist d:/data/mysql/my.cnf echo. > d:/data/mysql/my.cnf
docker run -d ^
  --name mysql-container ^
  --restart always ^
  -e MYSQL_ROOT_PASSWORD=root ^
  -e MYSQL_DATABASE=sunan_db ^
  -v d:/data/mysql/my.cnf:/etc/mysql/my.cnf ^
  -v d:/data/mysql/conf:/etc/mysql/conf.d ^
  -v d:/data/mysql/data:/var/lib/mysql ^
  -v d:/data/mysql/log:/var/log/mysql ^
  -p 3306:3306 ^
  mysql:5.7

这个my.cnf【注意:后缀不是.conf!】的路径在容器里面的路径是/etc/mysql/my.cnf。因为my.cnf的位置多样性,不排除有其他的映射方式,具体问题具体分析。

症状描述

实验的过程中,苏南大叔为了解决中文乱码的问题,修改了default-charset。但是,重启之后没生效。如下图所示:

苏南大叔:mysql配置文件位置,如何解决配置文件不生效的问题? - 没有生效
mysql配置文件位置,如何解决配置文件不生效的问题?(图5-2)

SHOW VARIABLES LIKE '%character%';
SHOW VARIABLES LIKE '%collation%';

查看配置文件文件位置

因为好多个位置的my.cnf文件,都可以生效。所以,进入mysql容器,进行检查。

docker exec -it <container_name> bash

使用如下命令,查看到底使用的是哪个配置文件。

mysql --help | grep "Default options" -A 1

通过这个命令,得到了默认文件位置有:

Default options are read from the following files in the given order:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf

World-writable

上述命令同时得到了这么一个警告信息:

mysql: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.

大意就是:
MySQL配置文件/etc/mysql/my.cnf的权限设置过于开放(world-writable),因此被MySQL忽略了。意味着所有用户都有写入该文件的权限,这样做会带来安全风险。

苏南大叔:mysql配置文件位置,如何解决配置文件不生效的问题? - world-wide-writable
mysql配置文件位置,如何解决配置文件不生效的问题?(图5-3)

对于数据库配置文件来说,在大多数情况下只需要数据库管理员或者root用户有读写权即可。如果所有人都可以修改这些配置信息,则可能会导致数据泄露或者其他安全问题。

解决方案

进入容器操作界面。然后使用ls -l命令查看/etc/mysql/my.cnf的当前权限:

ls -l /etc/mysql/my.cnf

如果是world-writable的,会看到下面的类似内容:

-rwxrwxrwx 1 root root /etc/mysql/my.cnf

否则会看到下面的类似内容:

-rw-r--r-- 1 root root /etc/mysql/my.cnf 

-rwxrwxrwx说明该配置文件确实是对所有人开放了读、写和执行权利。需要修改这个文件的权限,使其只有root用户有读写权,其他用户只有读的权限:

chmod 644 /etc/mysql/my.cnf

苏南大叔:mysql配置文件位置,如何解决配置文件不生效的问题? - chmod-644
mysql配置文件位置,如何解决配置文件不生效的问题?(图5-4)

重启容器,症状消失,mysql顺利读取到了配置文件。配置修改生效!

苏南大叔:mysql配置文件位置,如何解决配置文件不生效的问题? - 重启生效
mysql配置文件位置,如何解决配置文件不生效的问题?(图5-5)

结语

苏南大叔写的mysql相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql