栏目:数据库
2077
唐小碎发布于:2021-12-21 10:45:02
标签:
Mysql
开发中我们常需要开启远程连接,比如开发环境中,我想在公司的时候用公司的电脑,在家的时候用自己的电脑,但是如果各用本地的数据,那么,每次下班都要同步一下数据库,非常不方便。这时,我们可以把开发数据库放在测试机上,公司电脑和家里的电脑都可以连上去,实现数据同步。这样,我们就可以方便的在家加班了。
但是mysql默认是只允许本机访问的,所以,我们需要开启远程连接。
### 一,修改my.cnf 文件
修改配置文件:/etc/my.cnf,在[mysqld]行下,修改配置:
````shell
[mysqld]
port = 3306
socket = /tmp/mysql.sock
datadir = /usr/local/mysql/var
skip-external-locking
key_buffer_size = 32M
max_allowed_packet = 1M
table_open_cache = 128
sort_buffer_size = 768K
net_buffer_length = 8K
read_buffer_size = 768K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
thread_cache_size = 16
query_cache_size = 16M
tmp_table_size = 32M
performance_schema_max_table_instances = 1000
bind-address = 127.0.0.1 <================ 修改为: bind-address = 0.0.0.0
````
然后重启:
````shell
[root@node-07 ~]# service mysql restart
````
我的是没有这个配置的,也可以连接,所以默认应该也是 0.0.0.0,但是如果你的同事配置过这个配置项是其他值,就会导致不能访问。
### 二,直接修改root用户允许远程登录访问
此处使用改表法:
修改mysql自带的数据库:mysql 中的user表的中的记录,把host字段的值改为:% 表示允许所有主机连接。也可以改为:192.168.\*.\*或者你指定的IP。具体操作:
````shell
mysql> use mysql
Database changed
mysql> select host,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
3 rows in set (0.00 sec)
mysql> update user set host = '%' where user = 'root'; <======= 更新表
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select host,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+---------------+
3 rows in set (0.00 sec)
mysql> flush privileges; <=======重新加载权限数据
Query OK, 0 rows affected (0.01 sec)
````
### 三,存在的其他问题
按照上面的步骤操作,我依然没有办法在我的本地连接上我测试机(192.168.249.130)的mysql。只能一步一步调试了。
首先,我在我的测试服务器上面使用telnet 127.0.0.1 3306 ,测试mysql是否能连通:
````
[root@node-08 ~]# telnet 127.0.0.1 3306
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
````
发现是可以连通的。
然后,我在我的本地通过telnet 192.168.249.130 3306 ,测试是否能连通测试机的3306端口
````
$ telnet 192.168.249.130 3306
Trying 192.168.249.130...
````
发现是没有办法连通的。
于是,我猜测是防火墙的原因。我查看firewalld防火墙状态,发现防火墙是关闭着的。
````shell
[root@node-08 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
````
相关firewalld其他命令:
````
1,查看状态: systemctl status firewalld 查看已经开放的端口:firewall-cmd --list-ports
2,开启Firewalls: systemctl start firewalld 开机启动:systemctl enable firewalld
3,关闭Firewalls: systemctl stop firewalld 取消开机启动:systemctl disable firewalld
4,重启:systemctl restart firewalld
5,添加端口:firewall-cmd --permanent --zone=public --add-port=21/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --permanent --zone=public --add-service=ftp
````
可以看到并不是firewalld防火墙拦截的。
继续查看iptable防火墙状态,发现,iptable的状态是开启的,那么我们可以判定是iptable拦截了外界访问测试机的3306端口了。于是我们关闭iptable防火墙。相关命令:
````
iptables 所在目录 :/etc/sysconfig/iptables
service iptables status #查看iptables状态
service iptables restart #iptables服务重启
service iptables stop #iptables服务禁用
````
关闭防火墙,我们发现就可以使用root用户远程访问mysql了。或者可以为防火墙添加相应的规则。
注意,此处如果是云上的服务器,比如阿里云服务器,还需要在阿里云控制台查看相应的端口(3306)有没有允许远程访问。
### 四,添加新用户,并授权该用户远程访问
直接授权root用户远程访问,存在安全隐患,使得其他不法分子连接上我们的数据库的可能性。于是,我们可以创建一个新的用户,这个用户拥有的权限比较少,比如该用户只能操作指定的某个库可操作。
与上面的该表法不同,此处使用授权法
##### 1,创建一个新用户
````
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
其中:
username :你将创建的用户名,比如abc
host :指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主- 机登陆,可以使用通配符%
password :该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
举例:
CREATE USER 'abc'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'abc'@'192.168.1.108' IDENDIFIED BY '123456';
CREATE USER 'abc'@'%' IDENTIFIED BY '123456';
````
##### 2,授权
为刚刚创建的新用户授权,指定该用户能访问的库,表,以及他拥有的权限(增删改查)
````
GRANT privileges ON databasename.tablename TO 'username'@'host'
其中:
privileges :用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename :数据库名
tablename :表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*
举例:
GRANT SELECT, INSERT ON test.user 'abc'@'%';
GRANT ALL ON *.* TO 'abc'@'%';
GRANT ALL ON shop.* TO 'abc'@'%';
````
##### 3,刷新
上述两步做完后,需要进行刷新,才能生效
````
flush privileges
````
至此,mysql的远程连接访问就已经说完了。希望对你有帮助,有问题可以留言一起讨论
评论
陈总 2022-01-04 18:24:24
挺好