mysql的grant语句不支持on子句中用逗号分隔多个数据库,如on db1., db2.语法错误;必须对每个库单独执行grant语句,且主机名必须精确匹配连接来源。

直接给多个数据库授权,不能靠“一次写全”,必须对每个库单独执行 GRANT;否则权限不会生效,应用连上也会报 Access denied。
为什么不能用 GRANT ... ON db1.*, db2.* 一次性授权
MySQL 的 GRANT 语句不支持在 ON 子句里用逗号分隔多个数据库。像 ON db1.*, db2.* 这种写法语法错误,MySQL 会直接报错 ERROR 1064。
-
GRANT SELECT ON db1.*, db2.* TO 'user'@'localhost'→ ❌ 无效语法 - 正确做法是拆成两条独立语句,分别授权
- 即使两个库权限完全一样,也得重复写两次
GRANT
如何正确授予跨库权限(以 SELECT 为例)
假设你要让 reporter 用户能查 sales 和 inventory 两个库的所有表,就得这样操作:
GRANT SELECT ON sales.* TO 'reporter'@'192.168.5.%'; GRANT SELECT ON inventory.* TO 'reporter'@'192.168.5.%';
- 每条
GRANT必须指定完整的目标:数据库名 +.*(注意点不能省略) - 用户账号
'reporter'@'192.168.5.%'要前后一致,主机部分必须精确匹配实际连接来源 - 如果用户还不存在,MySQL 5.7 默认会在首次
GRANT时自动创建(但不设密码),建议先用CREATE USER显式建好再授权
常见权限失效原因:主机名不匹配
最常被忽略的是 host 匹配问题——'user'@'localhost' 和 'user'@'127.0.0.1' 是两个完全不同的账号,权限互不影响。
- 应用用
mysql -h 127.0.0.1连接,但你只给了'user'@'localhost'→ 权限不生效 - 应用从
192.168.5.100连,你却授权了'user'@'%',但 MySQL 实际匹配到的是'user'@'192.168.5.100'(如果该账号存在且没授权)→ 同样失败 - 登录后立刻执行
SELECT CURRENT_USER();,看它返回什么,才是 MySQL 真正认的账号
授权后必须执行 FLUSH PRIVILEGES 吗?
在 MySQL 5.7 中,GRANT 本身会自动更新内存中的权限缓存,一般不需要手动 FLUSH PRIVILEGES。但它不是“有害”的操作,习惯性加上也无妨。
- 真正需要
FLUSH PRIVILEGES的场景,是绕过GRANT直接改mysql.db表(不推荐) - 如果你刚用
CREATE USER建完用户,又马上GRANT,不用刷新也能生效 - 验证权限是否到位,优先用
SHOW GRANTS FOR 'user'@'host';,比查系统表更直观
跨库权限本质就是“多个单库权限的叠加”,没有捷径可走。最容易出问题的地方,从来不是语法写错,而是 host 不匹配、用户不存在却误以为已创建、或者漏掉某个库的 GRANT 语句。











