Mysql创建外部访问账号以及问题

说明

遇到需求是需要在服务器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有两个作用
    1. 如果被grant授权的用户已经存在,那么授予他该有的权限
      1. 如果该用户已有的权限,低于被赋予的权限的话,提示成功,低权限会覆盖高权限
      2. 如果该用户已有的权限,高于被赋予的权限的话,提示成功,已有的低权限被覆
    2. 如果被grant授权的用户不存在,那么创建该用户,并且赋予该用户权限
  • grant常用命令:
    1. 语法概述
      grant 权限 on 数据库.数据表 to 用户@host identified by 密码
    2. 给普通用户查询、插入、更新、删除db中所有表的权限
      grant select,insert,update,delete on db.* to user
    3. 创建一个可访问所有库所有表,拥有所有权限的外网可访问的账号(附带密码)
      grant all on *.* to user@'%' identified by 'password'
    4. 创建一个允许内网网段访问的账号
      grant all on db.table to user@192.168.137.%
    5. 查看当前登陆账号的权限
      show grants 最终展示结果
    6. 撤销已经赋予给的用户权限
      revoke all on *.* from user@host

遇到问题

满心欢喜的以为创建完用户之后,就可以直接在A服务器上直接使用了,然后用语句测试了一下:

提醒连接失败,一度认为自己是创建的mysql账号错误了,反复的自己创建账号,删除账号,最终的结果还是一样的报错。通过百度各种博客,最终得到方案,分析说有3中可能

  1. my.cnf配置文件中的skip-networking被配置

skip-networking被配置的话,会导致所有的TCP/IP端口没有被监听,也就是说,除了本机,其他客户端都无法使用网络连接到本Mysql服务器

  1. my.cnf配置文件中的bindaddress被配置

bindaddress,该参数可以配置指定哪些IP地址被配置,使得mysql服务器只回应哪些IP地址的请求,所以需要将该参数注释掉

  1. 防火墙的原因

有可能某个端口限制了外网访问情况

上面所说的可能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服务器,提示成功。

参考博客

非常感激下面几位博主分享的内容。