数据库名含减号需用反引号包裹库名;授权时指定`库名`.*,用户须拥有WITHGRANTOPTION才能转授权限,最后执行FLUSHPRIVILEGES强制重载权限表。
MySQL 5.7中带减号数据库名无法授权解决方法
时间:2026-07-05
浏览:472
文章目录
数据库名含减号的授权问题
首先,数据库名里带减号这事儿,真是让人又爱又恨。减号本身在SQL里就是运算符,你想,MySQL解析器一见到`my-db`,第一反应是“my减去db”,然后就报语法错误——ERROR 1064 (42000)就来了。所以,解决办法其实就一句话:用反引号把整个库名包起来。减号和反引号之间,藏着无数MySQL DBA的血泪史。比如,你直接写GRANT ALL ON my-db.* TO 'user'@'localhost',那是肯定通不过的。必须写成`my-db`.*,而且注意,反引号得把整个库名抱起来,不能只包一部分,比如my-`db`.*就不行。还有,别一着急用成单引号或双引号——那会被当成字符串字面量,权限根本不会生效。
不光是授权,以后所有跟这个库打交道的操作,比如USE、SHOW TABLES IN、DROP DATABASE,都得用反引号包着。反引号不是可选装饰,是必须语法。
带特殊字符的数据库授权:必须显式指定对象类型
再说一个常见误区:即使只是想授库级权限,也得写成GRANT ... ON `my-db`.* TO ...,.*不能省略。MySQL 5.7有个硬性要求——它不支持裸库名授权,比如直接写ON `my-db`,马上给你报ERROR 1144 (42000):Illegal GRANT/REVOKE command。
GRANT SELECT ON `my-db`.t1 TO ...—— 表级授权,合法。GRANT EXECUTE ON PROCEDURE `my-db`.p1 TO ...—— 存储过程授权,注意必须带上PROCEDURE关键字和完整库名。写GRANT EXECUTE ON p1或GRANT EXECUTE ON my-db.p1,都失败。GRANT ALL ON `my-db`.* TO ...—— 这才是唯一能覆盖整个库的授权方式。
用户本身没有WITH GRANT OPTION,无法转授权限
这是个容易忽略的权限层级问题。很多场景是:你用普通账号admin去给my-db授权,但admin当初是被root用GRANT ... TO 'admin'@'%'创建的,没加WITH GRANT OPTION。结果admin去执行GRANT,立刻报ERROR 1045 (28000):Access denied。
- 检查方法很简单:
SHOW GRANTS FOR 'admin'@'%',看输出里有没有WITH GRANT OPTION。 - 如果缺少,得由更高权限账号(通常是root)来补:
GRANT ALL ON *.* TO 'admin'@'%' WITH GRANT OPTION。 - 特别注意:即使
admin对`my-db`.*有ALL PRIVILEGES,这不等于它能转授权限——这两个是独立维度。
授权后不生效?别忘了FLUSH PRIVILEGES
MySQL 5.7的权限缓存机制很实在:GRANT命令写入的是内存中的权限结构,但部分客户端(Na vicat、DBea ver这类工具)可能还在用旧缓存。结果就是:明明刚授了权,连USE `my-db`都被拒绝。
- 解决方案:执行
FLUSH PRIVILEGES强制重载权限表,这是最直接有效的同步手段。 - 注意:如果你用的是低权限账号执行
FLUSH PRIVILEGES,会报错——只有RELOAD权限才能执行它。root默认有,普通管理账号需额外授予:GRANT RELOAD ON *.* TO 'admin'@'%'。 - 验证是否生效的方式:
SHOW GRANTS FOR 'target_user'@'host',而不是只靠客户端界面刷新。
简单总结一下:反引号不是可选项,是强制语法;.*不是习惯写法,是MySQL 5.7的硬性要求;WITH GRANT OPTION和FLUSH PRIVILEGES更不是“试试看”的附加动作——漏掉任意一个,授权链就断在某个环节。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。