MySQL(MariaDB)复制从库报13 Permission denied但mysql命令可连接求助
解决MySQL主从复制IO线程连接失败(Permission Denied)的问题
从你的描述来看,手动通过SSH隧道的33061端口能正常连接主库,但从库的IO线程却一直报Permission denied,这个矛盾点其实指向了SELinux的进程上下文限制——普通用户(你手动执行mysql客户端的用户)和MySQL服务进程的SELinux权限是不一样的,下面是具体的排查和解决步骤:
1. 快速验证SELinux是否是问题根源
先临时关闭SELinux来测试:
setenforce 0
然后登录从库的MySQL,重启IO线程:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
等待10秒左右执行SHOW SLAVE STATUS\G,如果Slave_IO_Running变成Yes,那百分百是SELinux在搞鬼。
2. 永久修复SELinux限制
临时关闭只是验证,我们需要给MySQL服务进程添加合法的访问权限,有两种常用方式:
方式一:允许MySQL连接任意端口(简单粗暴)
执行这条命令(需要先安装policycoreutils-python-utils包,比如yum install policycoreutils-python-utils):
setsebool -P mysql_connect_any 1
这个mysql_connect_any布尔值就是用来控制MySQL进程是否能发起出站连接到任意端口的,开启后就不会阻止连接33061这类非标准端口了。
方式二:仅允许MySQL访问33061端口(更安全)
如果你不想开放所有端口,可以把33061添加到SELinux认可的MySQL端口列表里:
semanage port -a -t mysqld_port_t -p tcp 33061
执行完后重启MySQL服务:
systemctl restart mariadb
再启动从库的IO线程就应该能正常连接了。
3. 其他小众排查方向(如果SELinux不是问题)
- 检查MySQL的
systemd配置文件(通常在/usr/lib/systemd/system/mariadb.service或/etc/systemd/system/mariadb.service.d/下),看是否有PrivateNetwork=yes、RestrictNetworkInterfaces这类限制网络访问的参数,这些会阻止MySQL进程访问本地的SSH转发端口。 - 确认SSH隧道的运行用户:虽然你手动能连,但如果隧道是用特定用户启动的,MySQL进程的用户(通常是
mysql)可能没有权限访问?不过这个概率极低,你可以用ps aux | grep ssh查看隧道进程的所有者。
内容的提问来源于stack exchange,提问作者Pedram Behroozi
相关产品推荐
相关产品推荐

