MySQL修改启动端口无效

今天遇到一个特别沙雕的问题:在安装MySQL的时候,指定了my.cnf文件,但是文件中指定的端口一直不生效,每次启动都是用的3306。对my.cnf内容进行了检查核对,发现配置文件并无问题,也就是在配置文件内容没有任何错误的情况下,配置并未生效,这就相当的奇怪了,排查了好久,最终在官网,找到了响应的解决方案,不过在讲解决方案之前,我们来说一下mysql配置文件的使用规则。

####my.cnf加载顺序

我们查看MySQL在启动的过程中,如果未指定--defaults-file,那么会加载哪里的my.cnf呢?我们查看一下mysql命令的帮助信息:mysql --help | grep 'my.cnf',控制台输出:

1
2
3
4
chuan@MacBook-Pro ~ % mysql --help | grep 'my.cnf' -C1 --color
--
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

原来mysql在启动的时候,如果未指定my.cnf的话,会依次去寻找/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/etc/my.cnf~/.my.cnf,只要找到

注意: 在$HOME目录下的文件是隐藏文件,所以前面有个.

自定义my.cnf

mysqld命令允许我们通过参数--defaults-file=./my.cnf的方式来指定实例启动时使用的配置文件,这时MySQL在启动时,会只读取指定的文件中的配置,若文件不存在或者配置内容错误,也不会去寻找下一顺位的文件,而是直接报错。

如何自定义不解释了

问题解决

配置文件核查了很多遍,发现是没有任何的问题,然后就开始翻官网,在官网文档中看到了这样一句话:

1
If you enable certain MySQL features, you might need to set the SELinux TCP port context for additional ports used by those features. If ports used by MySQL features do not have the correct SELinux context, the features might not function correctly.

大致意思就是如果启用了SELinux,需要把端口加入到mysqld_port_t中。具体的加入方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 检查SELinux是否开启
getenforce
> Disabled
# 说明:(详细可百度细看)
# disable - No SELinux policy is loaded.
# permissive - SELinux prints warnings instead of enforcing.
# enforcing - SELinux security policy is enforced.

# 1. 查看mysql当前开放的端口
semanage port -l | grep mysqld

# 2. 第二步添加需要使用的端口
semanage port -a -t mysqld_port_t -p tcp 3308

加上端口之后,再次启动MySQL服务,发现端口使用的还是3306,这就很奇怪了,明明按照官网要求设置好了,怎么还不行?然后再次尝试使用命令setenforce 0把SELinux关闭,发现仍然无济于事,但是启动日志中出现了这么一句话:

1
my_print_defaults: [Warning] World-writable config file '/usr/local/mysql3/config/my.cnf' is ignored.

哦吼?ignore???配置文件被忽略了,因为配置文件是World-writable权限,那我们来看下配置文件的权限:

image-20210206194846939

哟呵,权限是777,所有用户都可以修改,这就很危险了,谁都能改,这不扯淡么,并且在官网找到了这么一句话:

1
On Unix platforms, MySQL ignores configuration files that are world-writable. This is intentional as a security measure.

那么既然这样的话,我们就把配置文件修改为555,剥夺其写权限,然后再次启动MySQL服务,哦哟,搞定了。