起因
我想要在Windows
下的DataGrip
远程连接到我服务器的MySQL
,但是总是连接被拒绝。之后突然想到我的MySQL
基本没有配置过,是不是不能远程连接。
然后查询下发现,出于安全的考虑,默认情况下MySQL
只允许本地连接,不允许从别的服务器远程连接。
后来主要参考卡拉云的方法,感谢这个文章
编辑 MySQL 配置文件
首先打开 mysqld.cnf
配置文件。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到 bind - address = 127.0.0.1
默认情况下, bind - address 的值为 127.0.0.1
,所以只能监听本地连接。我们需要将这个值改为远程连接 ip 可访问,可使用通配符 ip 地址 *
, ::
, 0.0.0.0
,当然也可以是单独的固定 ip,这样就仅允许指定 ip 连接,更加安全。
我是修改成了0.0.0.0
保存退出
- 按
Ctrl X
保存退出 - 提示:
save modified [buffer]...?
,选择 :yes
- 又提示:
file name to write :***.launch
,选择:Ctrl+T
- 在下一个界面用
上下左右
按键 选择要保存的文件名 - 然后直接点击
Enter
按键即可保存.
如果修改无法保存(该文件为只读文件)
- 切换到
mysqld.cnf
目录下 sudo [chmod] 777 mysqld.cnf
- 修改保存后需要继续把权限修改回来,否则配置文件不会生效
sudo chmod 644 mysqld.cnf
然后重启 MySQL 服务,使刚刚编辑的 mysqld.cnf
文件生效:
sudo systemctl restart mysql
之前是直接说拒绝连接,现在可以通过密码确认了。但是继续出现了问题,我输入了密码之后显示错误、
[HY000][1130] null, message from server: "Host '125.47.27.199' is not allowed to connect to this MySQL server".
创建远程登录用户
搜索问题发现,虽然我设置了可以从别的地方远程登录,但是还没有给账号远程登录的权限,我得说明能让哪些用户访问哪些特定得数据库和表。
将用做远程登录的账号 host 改为任意主机(%)或者是固定主机 ip 。可以使用 RENAME USER
命令来实现:
RENAME USER 'username'@'localhost' TO 'username'@'%';
还有第二种方法,专门创建一个新的账号用于远程登录,我这里参考的是别人的第二个方法,自己专门创建了一个用于远程登录的账号。这是创建账号的命令(password
输入你自己的密码)
CREATE USER 'syz-remote'@'%' IDENTIFIED BY 'password';
同时还要为这个账号授权
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'syz-remote'@'%' with grant option;
我之前没有授权,然后使用Golang
连接数据库报错,可以查看该文章
Error 1044: Access denied for user 'syz-remote'@'%' to database 'webapp'
最后,运行 FLUSH PRIVILEGES
命令,刷新 MySQL 的系统权限相关表,更新缓存。
FLUSH PRIVILEGES;
至此,我的DataGrip
也成功的连接上了我的服务器上的MySQL