背景
自己手上有一个项目服务用的是 AWS EC2, 最近从安全性和性能方面考虑, 最近打算把腾讯云的 MySQL 数据库迁移到 AWS RDS 上, 因为 AWS 的出口规则和安全组等问题, 我需要修改默认的 3306 端口和 Bind Address 限制特定的 IP 访问, 我在 Stack Overflow 上查询了如何修改, 但是网上的资料大多比较老旧, 不符合目前主流的 MySQL 版本 (使用的 MySQL 5.7.27, 操作系统使用 Ubuntu 18.04.1 LTS)
过程
在 Stack Overflow 上的高票回答很简单, 修改只需要三步就可以完成
- /etc/my.cnf // 找到配置文件
- port = 3306 // 修改内容
- sudo service MySQL restart // 重启 MySQL
但实时并没有那么简单, 以上答案可能对旧版本管用, 但是新版本你在 / etc/my.cnf 下根本找不到任何东西, 文件都不存在
然后我去查阅的官方文档, 找到的配置文件原来在目录:/etc/MySQL/my.cnf 下, 但是不要觉得找到配置文件就万事大吉, 当你打开文件你会看到画风变了, 因为配置文件里面没有内容, 而是引用了另外 2 个配置文件夹,/etc/MySQL/my.cnf 具体内容是这样的
- !includedir /etc/MySQL/conf.d/
- !includedir /etc/MySQL/MySQL.conf.d/
可以, 至少有线索了, 顺着路径去找, 在 2 个目录下每个文件都看了下, 最后看到 MySQL.conf.d/mysqld.cnf 似乎是我们要找的文件 (官方文档也验证了这一点), 打开可以看到我们需要修改的文件属性
- [mysqld]
- prot = 3306
- bind-address = 127.0.0.1 // 只允许本机访问
改成我需要的的配置参数后, 我以为事情到这里就结束了, 当我使用 sudo service MySQL restart 重启服务的时候, 我发现我的内网机器还是访问不了, 我使用 netstat -ntlp 查看 Local Address,Foregin Address, 发现我修改的配置后的配置没有生效, 我陷入的深深的自我怀疑当中, 仿佛线索在这里中断了
然后, 有网友说提到说有可能是文件权限问题, 如果文件权限过大 (全局可写),MySQL 会出现安全考虑不会读取该配置文件, 而且读取自身的配置副本文件, 我执行命令, 如看如下警告
- MySQL --help | grep my.cnf
- MySQL: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf'
- is ignored.
- order of preference, my.cnf, $MYSQL_TCP_PORT,
- /etc/my.cnf /etc/MySQL/my.cnf ~/.my.cnf
上面是指文件由于全局可写存在风险, 被 MySQL 忽略, 并且列出 MySQL 读取配置文件的顺序, 这里是可以看到 MySQL 是存在多个 my.cnf 配置文件, 有些是全局配置, 有些是局部配置, 找到线索后, 处理起来就简单很多了, 我们更改文件权限, 再看看 MySQL --help 就发现警告已经没有了, 具体命令如下:
- sudo chmod 644 /etc/MySQL/MySQL.conf.d/mysqld.cnf
- MySQL --help | grep my.cnf
- order of preference, my.cnf, $MYSQL_TCP_PORT,
- /etc/my.cnf /etc/MySQL/my.cnf ~/.my.cnf
然后再执行 sudo service MySQL restart, 然后再看看 Local Address 和 Foreign Address 已经变成我们在 my.cnf 配置的内容, 但是修改后的配置已经成功生效, 确认是文件全局可读的安全问题导致
总结
最后是关于 MySQL 的安全规则导致修改配置不生效, 当然这条规则, 大部分情况下我们是不知道的 (如果没有完整阅读官网文档的话), 在经过这次问题, 我大概有如下几点总结, 帮助大家在排查问题上少走弯路, 尽快找到真实的问题:
遇到问题首先应该看官网的最新文档
查看资料时间, 网上很多资料时间太长, 可能会误导你
认真查看警告信息, 熟练掌握排查工具和命令
基础知识很重要, 越是深的问题越考验程序员的内功
来源: https://www.cnblogs.com/xiao2shiqi/p/11376969.html