问题描述:
在本地远程连接服务器中的数据库失败
解决方案:
1、 未开启mysql远程登录账号
(1)创建新用户时可以直接使用如下命令
create user 'your_name'@'%' identified by 'your_password';
Query OK, 1 rows affected (0.06 sec)
此时新用户创建成功,mysql的user表中会添加一条新的记录,查看user表中的user和host可用如下命令:
use mysql; --切换到mysql数据库
select host,user from user; --查看user表中的host和user
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | your_name |
| localhost | debian-sys-maint |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
7 rows in set (0.00 sec)
%表示所有IP均可访问,也可以将%换成指定IP,localhost表示只能本地访问。
(2)修改已存在用户
update user set host = '%' where user = 'root'; --可以将root换成任意想修改的用户
flush privileges; --刷新权限
select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | your_name |
| localhost | debian-sys-maint |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| % | root |
+-----------+------------------+
7 rows in set (0.00 sec)
此时就可以进行远程连接了;如果还是失败继续下面的操作。
2、未开启3306端口
如果没有开启3306端口,那么mysql只允许服务器本地访问,此时可以在你所购买服务器网站的控制台中打开相关服务器实例,在防火墙中添加规则,添加完成之后就可以远程连接了。若此时还不成功,继续之后的操作。
3、修改配置文件
若添加完3306端口后连接不成功,此时可以在服务器命令行输入 ss -tlnp
lighthouse@VM-16-2-ubuntu:~$ ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 70 127.0.0.1:33060 0.0.0.0:*
LISTEN 0 151 127.0.0.1:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
如果看到3306端口对应的local address是127.0.0.1,则表示只能本地访问,此时需要修改mysql配置文件,只需要找到配置文件后将其中的
bind-address = 127.0.0.1
或者
skip-networking
直接注释掉,然后重启mysql即可。
网上有的帖子说配置文件的路径为 /etc/mysql/my.cnf,但是我在其中没有找到上面的两句代码,之后我在 /etc/mysql/mysql.conf.d/mysqld.cnf 中找到了bind-address = 127.0.0.1,将其注释并重启mysql后成功实现远程连接。
配置文件的修改
cd /etc/mysql/mysql.conf.d # 切换到文件路径
sudo vi mysqld.cnf # 进入编辑
# 然后按一下i,进入insert模式,找到对应行将相关语句注释掉
# 完成后按一下 esc ,再输入 :wq ,进行保存并退出
最后
这个时候虽然远程连接成功了,但是新建的非root用户没有创建数据库等操作的权限,此时
show grants for your_name@%; -- 查看某个用户的权限
grant all on *.* to 'your_name'@'%' [with grant option]; -- 授予your_name用户全部权限
flush privileges; -- 刷新权限
其中,with grant option表示允许your_name向其他用户授予权限。