MySQL默认权限用户可执行CREATE DATABASE问题及只读用户创建咨询
MySQL只读用户创建与权限问题排查
权限异常原因澄清
MySQL 8.0及后续版本中,CREATE USER语句仅完成用户创建操作,新用户默认无任何权限——既没有SELECT权限,也没有CREATE DATABASE权限。你遇到的异常情况,大概率是以下原因之一:
- 误操作给该用户授予了全局
CREATE权限(例如执行过GRANT CREATE ON *.* TO 'reader'@'%';) - 自定义了MySQL实例的权限配置模板(官方Docker镜像默认无此设置)
- 操作时混淆了root账号与新建用户的身份
创建仅读取information_schema/sys库的只读用户
按以下步骤操作,可创建严格只读的限定用户:
- 创建用户(若未创建):
CREATE USER 'reader'@'%' IDENTIFIED BY 'reader_password'; -- 如需限制登录IP,将'%'替换为具体IP,例如'192.168.1.100'
- 授予只读权限:
-- 授予information_schema所有表的SELECT权限 GRANT SELECT ON information_schema.* TO 'reader'@'%'; -- 授予sys库所有表的SELECT权限 GRANT SELECT ON sys.* TO 'reader'@'%';
- 刷新权限使配置生效:
FLUSH PRIVILEGES;
- 验证权限有效性:
切换至reader用户后执行以下语句:
-- 查看当前用户权限列表 SHOW GRANTS FOR CURRENT_USER; -- 尝试创建数据库,应返回权限错误 CREATE DATABASE test_db; -- 尝试读取目标库表,应正常返回结果 SELECT * FROM information_schema.tables LIMIT 10;
额外注意事项
- 优先限制用户登录IP,避免
@'%'的宽泛授权,提升安全性 - MySQL 8.0+版本无需使用
PASSWORD()函数,直接用IDENTIFIED BY设置密码即可 - 禁止给该用户授予任何全局权限(
ON *.*的授权),防止越权操作
内容的提问来源于stack exchange,提问作者michal.kyjovsky
相关产品推荐
相关产品推荐

