Navicat连接虚拟机mysql常见错误问题及解决方法
通过Navicat连接虚拟机中的MySQL数据库时,可能会遇到一些常见的错误问题,今天这一节,我们将介绍这些问题以及如何解决它们.本文以Ubuntu作为虚拟机系统.
在Navicat连接虚拟机MySQL时,需要保证MySQL服务已经成功启动.我们可以通过以下命令进行确认:
sudo service mysql status
如果MySQL服务已经成功启动,则会返回如下信息:
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-12-20 10:43:47 CST; 1 day ago
Main PID: 1257 (mysqld)
Status: "Server is operational"
└─1257 /usr/sbin/mysqld
如果MySQL服务未启动,则需要先启动MySQL服务:
sudo service mysql start
在Ubuntu中,MySQL默认只监听localhost地址,如果需要从其他网络中访问MySQL,则需要进行配置.我们可以通过以下命令查看MySQL监听的地址:
sudo netstat -lnp | grep mysql
如果MySQL只监听了localhost地址,则返回的信息应该如下所示:
tcp 0 0 12⑦0.0.1:3306 0.0.0.0:* LISTEN 1257/mysqld
需要修改MySQL配置文件,将绑定的IP地址由localhost改为服务器IP地址.打开MySQL配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到以下行:
bind-address = 12⑦0.0.1
将其改为:
bind-address = 0.0.0.0
保存文件并退出.然后重启MySQL服务:
sudo service mysql restart
再次运行:
sudo netstat -lnp | grep mysql
应该会显示MySQL监听了服务器IP地址和localhost地址:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1257/mysqld
在Navicat中连接MySQL时,需要提供正确的用户名和密码.我们可以通过以下命令查看MySQL中已经创建的用户和其对应的权限:
SELECT user,authentication_string,plugin,host FROM mysql.user;
如果你需要从其他网络连接MySQL,则需要确认有哪些用户有远程访问MySQL的权限.例如,如果我们想要使用root用户从其他网络连接MySQL,则需要确认root用户是否有远程访问MySQL的权限.我们可以通过以下命令查看root用户的权限:
SELECT user,host,authentication_string,plugin,ssl_cipher, x509_issuer, x509_subject, Ifnull(ssl_type, '') as ssl_type FROM mysql.user WHERE user = 'root';
如果root用户的host值为localhost,则无法从其他网络连接MySQL.我们需要修改root用户的host值.让它匹配我们的远程IP地址.我们可以通过以下命令进行修改:
UPDATE mysql.user SET Host='你的远程IP地址' WHERE User='root';
然后执行以下命令刷新权限:
FLUSH PRIVILEGES;
如果你的虚拟机上开启了防火墙,则需要确认防火墙是否阻止了MySQL服务的连接.我们可以通过以下命令查看防火墙规则:
sudo ufw status
如果MySQL服务被防火墙拦截,则需要添加一条防火墙规则:
sudo ufw allow mysql
综合上面所讲的,我们可以通过几个步骤来解决Navicat连接虚拟机MySQL的常见问题.我们需要保证MySQL服务已经启动,确认MySQL监听地址,确认用户权限和防火墙设置.只有在以上步骤均正确无误的情况下,Navicat才能够成功连接MySQL服务器.
sudo netstat -lnp | grep mysql
返回的结果如下:
tcp 0 0 12⑦0.0.1:3306 0.0.0.0:* LISTEN 1257/mysqld
我们发现,MySQL只监听了localhost地址,没有监听服务器的IP地址.于是,我们打开MySQL配置文件(sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address改为0.0.0.0,重启MySQL服务(sudo service mysql restart),再次运行命令(sudo netstat -lnp | grep mysql),返回的结果应该如下所示:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1257/mysqld
此时,MySQL会监听服务器的IP地址和localhost地址,并且可以从其他网络访问MySQL数据库.
在确认用户权限环节中,假设我们想要从其他网络中连接MySQL,但是我们发现root用户的host值为localhost.于是,我们运行以下命令:
SELECT user,host,authentication_string,plugin,ssl_cipher, x509_issuer, x509_subject, Ifnull(ssl_type, '') as ssl_type FROM mysql.user WHERE user = 'root';
+------+-----------+-------------------------------------------+--------+------------+-------------+---------------+----------+
| user | host | authentication_string | plugin | ssl_cipher | x509_issuer | x509_subject | ssl_type |
+------+-----------+-------------------------------------------+--------+------------+-------------+---------------+----------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | auth_socket | | | | |
+------+-----------+-------------------------------------------+--------+------------+-------------+---------------+----------+
我们发现,root用户的host值为localhost,无法从其他网络连接MySQL.于是,我们修改root用户的host值,使用以下命令:
UPDATE mysql.user SET Host='你的远程IP地址' WHERE User='root';
FLUSH PRIVILEGES;
此时,root用户就可以从其他网络连接MySQL,Navicat也可以成功连接MySQL服务器.