说明
遇到需求是需要在服务器A上监控服务器B上的数据库的状态(数据库主从状态)。那么久需要在A上访问B府服务器上的mysql数据库。
mysql默认安装完成之后,在mysql.user表中,有默认的3个账号,他们的host分别是:localhost、127.0.0.1、::1,这3个账号,都只能本地访问,不能供其他服务器通过该账号访问mysql数据库。如果需要提供其他服务器访问的话,需要创建一个供外网访问的mysql账号。
原本以为很简单,只需要在B服务器上创建一个host=%的账号就可以了,没想到中间遇到了好多的问题。
创建mysql账号:grant
如果通过数据库工具(Navicat、PhpMyadmin)创建数据库账号的话,有可视化界面,创建起来也很方面。
如果需要提高B格,那就用命令:grant创建数据库账号
- grant 赋予用户权限grant有两个作用
- 如果被grant授权的用户已经存在,那么授予他该有的权限
- 如果该用户已有的权限,低于被赋予的权限的话,提示成功,低权限会覆盖高权限
- 如果该用户已有的权限,高于被赋予的权限的话,提示成功,已有的低权限被覆
- 如果被grant授权的用户不存在,那么创建该用户,并且赋予该用户权限
- 如果被grant授权的用户已经存在,那么授予他该有的权限
- grant常用命令:
- 语法概述
grant 权限 on 数据库.数据表 to 用户@host identified by 密码 - 给普通用户查询、插入、更新、删除db中所有表的权限
grant select,insert,update,delete on db.* to user - 创建一个可访问所有库所有表,拥有所有权限的外网可访问的账号(附带密码)
grant all on *.* to user@'%' identified by 'password' - 创建一个允许内网网段访问的账号
grant all on db.table to user@192.168.137.% - 查看当前登陆账号的权限
show grants最终展示结果

- 撤销已经赋予给的用户权限
revoke all on *.* from user@host
- 语法概述
遇到问题
满心欢喜的以为创建完用户之后,就可以直接在A服务器上直接使用了,然后用语句测试了一下:

提醒连接失败,一度认为自己是创建的mysql账号错误了,反复的自己创建账号,删除账号,最终的结果还是一样的报错。通过百度各种博客,最终得到方案,分析说有3中可能
- my.cnf配置文件中的skip-networking被配置
skip-networking被配置的话,会导致所有的TCP/IP端口没有被监听,也就是说,除了本机,其他客户端都无法使用网络连接到本Mysql服务器
- my.cnf配置文件中的bindaddress被配置
bindaddress,该参数可以配置指定哪些IP地址被配置,使得mysql服务器只回应哪些IP地址的请求,所以需要将该参数注释掉
- 防火墙的原因
有可能某个端口限制了外网访问情况
上面所说的可能1、2都可直接通过my.cnf文件直观看出,不是该原因导致的连接失败,那么很有可能是第三个情况。
为了验证该问题,直接关闭防火墙:/etc/init.d/iptables stop
再在B服务器上连接mysql,成功了。
最终得到结论是:mysql的端口,被防火墙拦截了,所以需要开放3306默认端口的外网访问
防火墙(附带)
由于涉及到防火墙的问题,顺带看了下防火墙相关的配置信息
-
防火墙基本命令
- 查看防火墙状态:
service iptables status - 停止防火墙:
service iptables stop - 启动防火墙:
service iptables start - 重启防火墙:
service iptables reload - 永久关闭防火墙:
chkconfig iptables off - 永久关闭防火墙之后-再次启动防火墙:
chkconfig iptables on
- 查看防火墙状态:
-
运行查看防火墙状态得到结果:

分析结果得知,3306端口被drop掉了,不被接受,所以需要将3306端口开放给外网可访问
-
编辑防火墙开放端口:
vim /etc/sysconfig/iptables

将3306端口的
DROP改为ACCEPT即可
再次在A服务器上连接B服务器上的MYSQL服务器,提示成功。
参考博客
非常感激下面几位博主分享的内容。