0

0

mysql权限与表加锁有什么关系_mysql锁与权限管理

P粉602998670

P粉602998670

发布时间:2026-02-16 08:18:40

|

404人浏览过

|

来源于php中文网

原创

权限不足时lock tables会报错,需显式授予lock tables全局权限;flush tables with read lock需reload权限且绕过read_only;行锁本身不校验权限,但执行前提受权限限制。

mysql权限与表加锁有什么关系_mysql锁与权限管理

权限不足时,LOCK TABLES 会直接报错

不是所有用户都能加表锁。MySQL 要求执行 LOCK TABLES 必须拥有 LOCK TABLES 权限(属于全局权限),且不能是只读账号(read_only=1 时 super 用户仍可锁,但普通用户会被拒绝)。常见错误:ERROR 1045 (28000): Access denied for user 'app'@'%' to database 'test' —— 实际不是库权限问题,而是缺少 LOCK TABLES 权限。

  • 检查权限:运行 SHOW GRANTS FOR CURRENT_USER;,确认输出中包含 LOCK TABLES
  • 授予权限(需 super 或 grant option):GRANT LOCK TABLES ON *.* TO 'app'@'%'; FLUSH PRIVILEGES;
  • 注意:MySQL 8.0+ 中,LOCK TABLES 权限不再隐含在 SELECTUPDATE 中,必须显式授予
  • 即使有 LOCK TABLES 权限,若当前连接处于事务中(AUTOCOMMIT=0),执行 LOCK TABLES 会自动触发隐式提交,导致事务中断——这是极易被忽略的副作用

FLUSH TABLES WITH READ LOCK 需要 RELOAD 权限,且绕过 read_only 限制

全局读锁命令 FLUSH TABLES WITH READ LOCK 不同于普通表锁,它要求 RELOAD 权限(而非 LOCK TABLES),并且能强制阻塞所有写入——哪怕你已设 read_only=1,这个命令仍会让 super 用户也无法写,因为它是物理级阻塞。

  • 验证权限:SELECT Reload_priv FROM mysql.user WHERE User='root' AND Host='%'; 返回 Y 才有效
  • 执行后,任何 DML(INSERT/UPDATE/DELETE)、DDL(CREATE/DROP)都会挂起等待,包括 root 用户
  • 解锁必须用 UNLOCK TABLES,且只能由同一连接执行;断开连接会自动释放锁,但可能导致备份不一致
  • 该命令会阻塞 mysqldump --single-transaction 的一致性快照起点,所以不要在备份脚本里混用

InnoDB 行锁不受用户权限控制,但权限影响能否触发行锁

行锁(如 SELECT ... FOR UPDATE)本身不校验权限——只要语句能执行成功,InnoDB 就加行锁。但“能否执行成功”取决于权限:比如没 SELECT 权限,连查询都失败,自然无法加锁;没 UPDATE 权限,SELECT ... FOR UPDATE 可以执行(因只读),但后续 UPDATE 会报错。

Synthesia
Synthesia

Synthesia是一个AI视频生成平台,可以让用户创建120种语言的视频。

下载
  • 典型陷阱:给应用账号只授 SELECT 权限,却让它执行 SELECT ... FOR UPDATE —— 看似能跑通,但实际锁住了行,而业务逻辑又没后续更新,导致锁长期滞留
  • 行锁是否生效,还依赖索引:若 WHERE 条件未命中索引,InnoDB 会升级为表锁(甚至全表扫描锁),此时又回到权限和锁粒度双重风险
  • 权限越精细,越容易误判锁行为:例如对某列有 SELECT 权限但无 UPDATE 权限,SELECT col1 FROM t WHERE id=1 FOR UPDATE 成功加锁,但 UPDATE t SET col2=1 WHERE id=1 直接报错 ERROR 1142 (42000): UPDATE command denied,锁却没释放

备份/维护场景下,权限与锁的组合最容易出事

线上做逻辑备份、主从切换或数据迁移时,常同时涉及权限变更和锁操作。这时权限配置稍有偏差,就会让锁失效或过度阻塞。

  • 例如用 mysqldump --lock-all-tables:它内部执行 FLUSH TABLES WITH READ LOCK,所以 dump 账号必须有 RELOAD 权限,否则报错退出,但 dump 进程可能已部分写入脏文件
  • 再如用 pt-online-schema-change:它依赖 SELECT/INSERT/UPDATE/DELETETRIGGER 权限,若漏授 TRIGGER,工具会退化为锁表方式,导致业务阻塞
  • 最隐蔽的是权限缓存:修改了 mysql.user 表但忘了 FLUSH PRIVILEGES,新权限不生效,锁命令看似执行成功,实则未真正加锁(尤其在 MySQL 5.7 及更早版本)

权限本身不控制锁的类型或范围,但它决定了你“有没有资格发起锁操作”。真正危险的不是锁不住,而是锁住了却没人意识到——比如一个只有 SELECT 权限的账号执行了 FOR UPDATE,锁持续到事务结束,而 DBA 查权限时只看 DML 权限,完全忽略这种“只读但带锁”的中间态。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

678

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

371

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

284

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

263

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

537

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

636

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 833人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号