MySQL设置远程连接(新手必看)
虽然在 Linux 本地可以登录 MySQL,但在日常使用中极不方便。接下来我们使用客户端工具 SQLyog 或 Navicat 远程连接 MySQL。
初次连接时可能会出现如下图所示的报错信息,这是因为 MySQL 不支持远程连接。

图 1 使用SQLyog初次连接MySQL时的报错信息
在 Windows 系统中开启 Telnet 功能的具体操作步骤如下:
1) 打开控制面板,选择“程序和功能”选项,如下图所示:

图 2 选择“程序和功能”选项
2) 选择“启用或关闭Windows功能”选项,如下图所示:

图 3 选择“启用或关闭Windows功能”选项
3) 在弹出的“Windows功能”对话框中勾选“Telnet客户端”复选框,单击“确定”按钮,即可开启 Telnet 功能,如下图所示:

图 4 开启 Telnet 功能
执行上述关闭防火墙的命令会直接关闭防火墙,但在企业中通常采用的做法是开放固定端口,常用命令如下所示:
另外,还允许 Host 列的值中包含通配符 “%”。如果设置为 “Host=192.168.1.%”,则表示 IP 地址前缀为 “192.168.1.” 的客户端都可以连接 MySQL。如果设置为 “Host=%”,则表示所有 IP 地址都有连接权限。需要注意的是,不能为了省事就将 Host 列的值直接设置为通配符 “%”,因为这样做会存在安全隐患。用户可以根据需要对 Host 列的值进行设置。
本节将 Host 列的值直接设置为通配符 “%” 是为了方便讲解,SQL 语句如下所示:
然后查看主机和用户信息,结果如下所示。可以看到,root 用户对应的 Host 列的值为 “%”,表示允许所有主机连接 MySQL:

图 5 测试远程连接MySQL报错“2058”
从图 5 中可以看到,报错信息的最后一部分是乱码,意思是“插件缓存_sha2_密码无法进行加载”。这是因为 MySQL 修改了密码安全策略,SQLyog 未能正确解析使用。
为此,可以先在服务器环境下执行“mysql-u root-p”命令登录MySQL,再执行如下 SQL 语句(语句最后的“password”输入的是用户自己设置的密码)。
初次连接时可能会出现如下图所示的报错信息,这是因为 MySQL 不支持远程连接。

图 1 使用SQLyog初次连接MySQL时的报错信息
确认网络是否畅通
针对上面的问题,我们首先要做的就是确认网络是否畅通,具体操作步骤为:- 第一步,在远程机器上执行“ping IP地址”命令查看网络是否畅通;
- 第二步,在远程机器上执行“telnet”命令保证端口号开放访问,命令格式如下所示:
telnet IP 地址 端口号
在 Windows 系统中开启 Telnet 功能的具体操作步骤如下:
1) 打开控制面板,选择“程序和功能”选项,如下图所示:

图 2 选择“程序和功能”选项
2) 选择“启用或关闭Windows功能”选项,如下图所示:

图 3 选择“启用或关闭Windows功能”选项
3) 在弹出的“Windows功能”对话框中勾选“Telnet客户端”复选框,单击“确定”按钮,即可开启 Telnet 功能,如下图所示:

图 4 开启 Telnet 功能
关闭防火墙或开放MySQL端口
检查服务器是否关闭了防火墙或开放了 MySQL 端口,默认开放的端口是 3306,也可以手动修改。CentOS 6 和 CentOS 7 下与防火墙有关的操作命令如下所示。// CentOS 6 下关闭防火墙的命令 service iptables stop // CentOS 7 下关闭防火墙的命令 systemctl stop firewalld.service // CentOS 7 下开启防火墙的命令 systemctl start firewalld.service // CentOS 7 下查看防火墙状态的命令 systemctl status firewalld.service // CentOS 7 下设置开机启用防火墙的命令 systemctl enable firewalld.service // CentOS 7 下设置开机禁用防火墙的命令 systemctl disable firewalld.service
执行上述关闭防火墙的命令会直接关闭防火墙,但在企业中通常采用的做法是开放固定端口,常用命令如下所示:
// 查看开放的端口的命令 firewall-cmd --list-all // 设置开放的端口的命令 firewall-cmd --add-service=http --permanent firewall-cmd --add-port=3306/tcp --permanent // 重启防火墙的命令 firewall-cmd --reload
在Linux平台下设置Host列的值
首先在 Linux 平台下查看当前 MySQL 允许哪些 IP 地址连接,如下所示。其中,Host 列指定了允许用户登录所使用的 IP 地址,可以看到 root 用户对应的 Host 列的值为 "localhost",表示只允许本机客户端连接 MySQL。mysql> USE mysql; Database changed mysql> SELECT Host, User FROM user; +-----------+------------------+ | Host | User | +-----------+------------------+ | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+------------------+ 4 rows in set (0.00 sec)如果设置为 “Host=192.168.1.1”,则表示只允许 IP 地址为 192.168.1.1 的客户端连接 MySQL。如果设置为 “Host=localhost”,则表示只允许本机客户端连接 MySQL。
另外,还允许 Host 列的值中包含通配符 “%”。如果设置为 “Host=192.168.1.%”,则表示 IP 地址前缀为 “192.168.1.” 的客户端都可以连接 MySQL。如果设置为 “Host=%”,则表示所有 IP 地址都有连接权限。需要注意的是,不能为了省事就将 Host 列的值直接设置为通配符 “%”,因为这样做会存在安全隐患。用户可以根据需要对 Host 列的值进行设置。
本节将 Host 列的值直接设置为通配符 “%” 是为了方便讲解,SQL 语句如下所示:
mysql> UPDATE user SET host='%' WHERE user='root'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
然后查看主机和用户信息,结果如下所示。可以看到,root 用户对应的 Host 列的值为 “%”,表示允许所有主机连接 MySQL:
mysql> SELECT Host, User FROM user; +-----------+------------------+ | Host | User | +-----------+------------------+ | % | root | | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | +-----------+------------------+ 4 rows in set (0.00 sec)Host 列的值设置完成后,执行“flush privileges”命令即可使该设置立即生效。
测试
如果用户使用的是 MySQL 5.7,接下来就可以使用客户端工具 SQLyog 或 Navicat 远程连接 MySQL。如果用户使用的是 MySQL 8.0,那么连接时还会出现如下图所示的报错信息。
图 5 测试远程连接MySQL报错“2058”
从图 5 中可以看到,报错信息的最后一部分是乱码,意思是“插件缓存_sha2_密码无法进行加载”。这是因为 MySQL 修改了密码安全策略,SQLyog 未能正确解析使用。
为此,可以先在服务器环境下执行“mysql-u root-p”命令登录MySQL,再执行如下 SQL 语句(语句最后的“password”输入的是用户自己设置的密码)。
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';之后重新配置 SQLyog 连接,就可以连接成功。