MySQL设置允许远程连接

数据库允许远程连接是不安全的。为什么要开放远程连接?因为为了方便协同开发,开发时小组成员连接同一个数据库,方便开发与测试,环境统一。

线上一般不允许远程连接数据库。如果应用服务器和数据库服务器所在主机不同,必须要远程连接数据库,那也要在数据库服务器上设置IP白名单,只允许指定的IP进行连接。

实验环境

  • Ubuntu 16.04.1

  • MySQL 5.7.19

开放服务器指定端口

修改防火墙规则,开放指定端口(MySQL的默认服务端口是3306)

腾讯云服务器的防火墙规则是在安全组里设置

授权非本机连接、登录

修改数据库配置文件

修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件,把bind-address = 127.0.0.1注释掉,此种类型的文件以#注释

修改mysql.user表

mysql这个库是MySQL数据库内置的库(系统库),它里面的user表,存储的是可以登录数据库的用户信息,包括用户名、密码(加密存储的)、有哪些权限等。这个user表只有root权限才可以访问。

进入MySQL,-p后面跟的参数是你的root账号的密码

1
2
3
4
ubuntu@VM-90-170-ubuntu:~$ mysql -u root -proot
# 直接在-p后面输入密码是不安全的。这些命令会被shell收集,更安全的做法是:
ubuntu@VM-90-170-ubuntu:~$ mysql -u root -p
# 然后终端会提示你输入密码

修改可以对 myusername 这个账号进行连接的主机

切换到mysql数据库

1
mysql> use mysql;

修改修改mysql库中user

1
2
3
4
mysql> update user set host = '%' where user = 'myusername';
# 如果是root用户,那么语句为:
mysql> update user set host = '%' where user = 'root';
# 其实就是常规的SQL修改语句

其中%代表任意主机或IP地址。 如果不允许root账户远程连接,可以新建其他用户后,对新建的用户授权,就是修改mysql库中user表指定user列的host%(所有IP)或者改为指定IP(IP白名单)

查看上一步的更改

1
mysql> select host, user from user;

上述操作正确,会有类似下面的结果:

1
2
3
4
5
6
7
8
9
10
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| cecurio | % |
| root | % |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+

授权

1
MySQL> GRANT ALL PRIVILEGES ON *.* TO 'myusername'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

给用户名为myusername,密码为mypassword的用户所有权限,他可以操作此数据库服务器上的任意库中的任意表,而且还可以给其他用户赋予权限。

分析如下:

  • GRANT ALL PRIVILEGESTO 'myusername'@'%' IDENTIFIED BY 'mypassword' 表示给用户名为myusername,密码为mypassword的用户所有权限
  • ON *.* 被授权用户可以操作此数据库服务器上的任意库中的任意表
  • WITH GRANT OPTION; 可以给其他用户赋予权限

更加细粒度的授权,请参照官方文档吧 ^_^

使修改生效

1
2
mysql> FLUSH PRIVILEGES;
# 执行此条语句,上述修改才能奏效

退出MySQL服务器

1
MySQL> EXIT;
  • 重启MySQL
1
ubuntu@VM-90-170-ubuntu:~$ /etc/init.d/mysql restart

注意

MySQL关键字不区分大小写

参考文档、链接

http://www.jb51.net/article/24508.htm

If you think the content is useful to you.