MySQL用户和授权

开放MySQL白名单

可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.17/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.9.16/32 -p tcp -m tcp --dport 3306 -j ACCEPT |

新增用户以及授权

创建只读用户,并授权特定的表:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -- 创建用户以及设置密码,其中%表示任意客户端 CREATE USER 'read_admin'@'%' IDENTIFIED BY 'Admin123!@#'; -- 授予特定表的SELECT权限 GRANT SELECT ON aa.t_terminal TO 'read_admin'@'%'; GRANT SELECT ON aa.t_assert TO 'read_admin'@'%'; GRANT SELECT ON bb.t_user TO 'read_admin'@'%'; GRANT SELECT ON bb.t_user_group TO 'read_admin'@'%'; -- 为了支持联表,建议始终授权临时表的权限 GRANT CREATE TEMPORARY TABLES ON *.* TO 'read_admin'@'%'; -- 刷新权限 FLUSH PRIVILEGES; |

在过程中主要遇到两个问题:

1、在服务器上已经增加了用户和授权,但是客户仍被拒绝

这是因为会话没有更新,最新的授权需要重新登录获取

2、所有表的授权已经增加,但是客户无法联表查询

这一点之前是没有想到的,后续增加了临时表权限解决。也很好理解,联表查询的实现是MySQL内部生成临时表处理,所以需要授权该权限。

另外,可以通过以下命令查询某个用户的权限,以下是没有授权临时表和授权了临时表的权限查询结果对比:

  • 未授权临时表权限

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| mysql> SHOW GRANTS FOR 'read_admin'@'%'; +----------------------------------------------------------------+ | Grants for read_admin@% | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'read_admin'@'%' | | GRANT SELECT ON `nm`.`t_assert` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user_group` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user` TO 'read_admin'@'%' | | GRANT SELECT ON `nm`.`t_terminal` TO 'read_admin'@'%' | +----------------------------------------------------------------+ |

  • 已授权临时表权限

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| mysql> SHOW GRANTS FOR 'read_admin'@'%'; +----------------------------------------------------------------+ | Grants for read_admin@% | +----------------------------------------------------------------+ | GRANT CREATE TEMPORARY TABLES ON *.* TO 'read_admin'@'%' | | GRANT SELECT ON `nm`.`t_assert` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user_group` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user` TO 'read_admin'@'%' | | GRANT SELECT ON `nm`.`t_terminal` TO 'read_admin'@'%' | +----------------------------------------------------------------+ |

测试联表查询:

SELECT * FROM aa.t_terminal t LEFT JOIN bb.t_user a ON t.account = a.account limit 1;

注意事项总结:

  1. 如果是HA环境,需要主备数据库上都执行,因为这类非业务数据是不会自动同步的!!!
  2. 在创建用户和授权时,需要使用root账户
  3. 客户端和服务端初次连接时,会将该用户的权限信息保存在会话中,如果后续权限发生变化不会更新当前会话中的权限,所以做以上操作后,相关客户端最好是重新登录以获取最新的权限。
  4. 建议始终授权临时表的权限,防止客户需要联表查询时候再次处理
相关推荐
Decay__10 小时前
VMware 安装 SQL Server 双节点 AlwaysOn 可用性组教程 —— WSFC、AG 与侦听器完整部署(系列核心篇)
运维·数据库·sql·mysql·架构
小此方16 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
csdn_aspnet17 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
王中阳Go18 小时前
100 件货卖出 116 件,库存停在 -16
后端·mysql·go
nice_lcj52020 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
xixingzhe221 小时前
mysql全量、增量备份
数据库·mysql
隔窗听雨眠1 天前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__1 天前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
星恒随风2 天前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
隔窗听雨眠2 天前
MySQL进程卡死的定位思路与恢复实践
mysql·故障排查·数据库运维