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的远程连接访问就已经说完了。希望对你有帮助,有问题可以留言一起讨论

评论

  1. #1

    陈总 2022-01-04 18:24:24
    挺好