引言
MySQL 是一个流行的关系数据库管理系统,通常使用 3306 端口进行通信。但是,出于安全考虑,默认情况下,服务器的防火墙可能阻止外部访问此端口。本文将指导你在红帽系统上开放 3306 端口,以便远程访问 MySQL。
连接报错
环境准备
确保你拥有修改防火墙规则的权限。
确保你的 MySQL 服务已经安装并运行。
步骤一:检查当前防火墙状态
首先,检查 firewalld
服务是否正在运行:
sudo systemctl status firewalld
如果服务未运行,启动并设置为开机自启:
sudo systemctl start firewalld sudo systemctl enable firewalld
步骤二:添加端口到防火墙规则
使用 firewall-cmd
命令添加 3306 端口到防火墙规则中。这将允许 TCP 流量通过 3306 端口,并设置为永久生效:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
步骤三:重新加载防火墙规则
应用更改,无需重启服务器:
sudo firewall-cmd --reload
步骤四:验证端口开放
确认端口已经添加到防火墙规则并开放:
sudo firewall-cmd --zone=public --query-port=3306/tcp
如果返回结果为 yes
,则表示端口已经成功开放。
开放端口可能增加安全风险。以下是一些安全最佳实践:
限制访问:只允许特定的 IP 地址或网络访问 3306 端口。
使用 SSH 隧道:通过 SSH 创建一个安全隧道来访问 MySQL。
定期更新:保持系统和 MySQL 更新到最新版本。
连接后打不开库的问题解决
出现 "1044 - Access denied for user 'root'@'%' to database 'performance_schema'" 错误通常意味着MySQL数据库中的root用户没有足够的权限访问performance_schema
数据库。
-
确认当前用户: 首先,你需要确认你当前登录的用户是否具有足够的权限来执行
GRANT
命令。你可以通过以下命令查看当前用户:SELECT CURRENT_USER();
-
授予全局权限: 使用以下命令给
root
用户授予所有数据库的全局权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-
刷新权限: 执行以下命令以使权限更改立即生效:
FLUSH PRIVILEGES;
-
重新检查权限: 执行 SELECT User, Host FROM mysql.user WHERE User='root'
;
来确认权限已经更新。mysql> SELECT User, Host FROM mysql.user WHERE User='root'; +------+-----------+ | User | Host | +------+-----------+ | root | % | +------+-----------+ 1 rows in set (0.00 sec)
当权限变成%即可从任何主机进行访问该数据库
出现两个root用户时,也会出现此问题,导致冲突无法打开数据库,删除localhost的那个用户即可
mysql> SELECT User, Host FROM mysql.user WHERE User='root';
+------+-----------+
| User | Host |
+------+-----------+
| root | % |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)
-
删除多余的
root
用户条目: 删除root@localhost
的条目,只保留root@%
的条目。使用以下 SQL 命令:DELETE FROM mysql.user WHERE User='root' AND Host='localhost';
-
刷新权限: 删除条目后,刷新权限以使更改立即生效:
FLUSH PRIVILEGES;
-
重启 MySQL 服务: 在进行更改后,可能需要重启 MySQL 服务以确保所有更改生效:
sudo systemctl restart mysql