如何用Bash脚本为test_user授予test开头MySQL库的LOCK TABLES权限
问题根本原因
你的报错是Shell转义规则和MySQL语法转义规则两层冲突导致的:
- 双引号包裹的Shell参数中,反引号会被识别为「命令替换」标记,Shell会尝试执行反引号内的内容,而非直接传给MySQL
- 你额外加的反斜杠转义符会被Shell先解析吃掉一层,传到MySQL侧就变成了无效的转义语法,触发
Unknown command '\%'报错
正确可执行命令
优先用单引号包裹整个SQL语句,Shell不会解析单引号内的特殊字符,可直接把完整语法传给MySQL:
# 直接执行授权,不需要提前use mysql库 mysql -u$user -p$pass -S $SOCK -e 'GRANT LOCK TABLES ON `test%`.* TO "test_user"@"%";' # 授权完成后刷新权限使配置即时生效 mysql -u$user -p$pass -S $SOCK -e 'FLUSH PRIVILEGES;'
如果你的MySQL数据库名没有特殊字符,也可以省略标识符反引号,写法更简单:
mysql -u$user -p$pass -S $SOCK -e 'GRANT LOCK TABLES ON test%.* TO "test_user"@"%"; FLUSH PRIVILEGES;'
补充说明
- 如果你使用的是MySQL 8.0及以上版本,授权前需要先确认
test_user已存在,不存在的话先执行创建用户语句:CREATE USER 'test_user'@'%' IDENTIFIED BY '用户对应的密码';再执行授权操作,避免报错。 - 不需要给
%加额外的反斜杠转义,MySQL原生支持%作为通配符匹配数据库名。
内容的提问来源于stack exchange,提问作者Lenster
相关产品推荐
相关产品推荐

