dbeaver无法修改表数据_解决MDL锁导致无法操作数据库表的问题

本文围绕MySQL的MDL锁展开,介绍其用于保证DDL与DML操作一致性,但部分场景会阻塞。阐述了MDL锁出现场景、被锁原因,如长时间查询、事务未处理等。给出解决办法,如kill相关session或语句,还提供了维护建议,如低峰期操作、开启自动提交等。

bd540fd8d5ac42c708e17b498bb2c417.png

背景信息

MYSQL的MDL锁,用于解决或者保证DDL操作与DML操作之间的一致性,但是在部分场景下会出现阻塞,例如执行DML操作时执行ALTER操作、存在长时间查询时执行ALTER操作等等。

表象如下:

出现 Waiting for table metadata lock 且长时间处于等待状态,并阻塞所有后续对表的操作

mysql

MDL锁出现场景

  • 创建、删除索引。
  • 修改表结构。
  • 表维护操作(optimize table、repair table 等)。
  • 删除表。
  • 获取表级写锁 。

被锁原因

  • 当前有对表的长时间查询。
  • 显示或者隐式开启事务后未提交或回滚,比如查询完成后未提交或者回滚。
  • 表上有失败的查询事务。

解决办法

  • 找到魏师傅 MDL 锁的session,kill掉
  • 或 kill 掉DDL语句,等待下一次运维时间变更
select 

使用有权限的用户执行`kill`即可终端问题会话,解除DML锁。

维护建议

  • 在业务低峰期执行相关场景操作,例如创建索引、删除索引等。
  • 开启事务自动提交autocommit。
  • 设置参数lock_wait_timeout为较小值。
  • 考虑使用事件来终止长时间运行的事务,比如下面的例子中会终止执行时间超过60分钟的事务。
create 

示例

场景1-有对表的长时间查询

data_million_large 当前有 800万+的数据,对表进行一次全表查询肯定是条慢SQL

7395de24fbf0e928f0b36ff546349a2b.png
mysql

场景2-事务未提交或回滚

4bf2a2660e1afd5b6c205a58997ce867.png
mysql

场景3-有失败的查询事务

f8d60982a30f6b0ba85706027368d2b6.png
mysql

这个示例最难排查,咋一看没有任何阻塞的事务存在,持有MDL锁的session已处于 Sleep 状态了

查看session最后一次执行的语句

可查看session执行的最后一次语句的记录,包括错误的信息

# 
参考文档: https:// help.aliyun.com/knowled ge_detail/94566.html#concept-csn-5tt-4fb
《MySQL DBA甩锅技巧集锦-张沈波》
### 如何在DBeaver中备份数据库数据DBeaver中备份数据库数据是一项常见的任务,可以通过以下方法完成。以下是详细的步骤和注意事项: #### 1. 选择需要备份的数据库DBeaver中打开目标数据库连接后,导航到需要备份的数据库数据。右键点击目标数据库[^1]。 #### 2. 启动备份功能 从右键菜单中选择“工具”->“Dump Database”(转存数据库)或“Dump Table”(转存),这取决于你是要备份整个数据库还是单个[^2]。 #### 3. 配置导出选项 在弹出的窗口中,可以勾选需要导出的数据库。此外,还可以设置导出文件的路径、文件名以及格式(通常是SQL文件)。确保选择了正确的编码方式(如UTF-8),以避免后续导入时出现编码问题[^4]。 #### 4. 开始导出 确认所有设置无误后,点击“开始”按钮进行导出操作。导出完成后,系统会生成一个包含结构和数据的SQL文件[^1]。 ```sql -- 示例:SQL文件内容可能类似于以下格式 CREATE TABLE `example_table` ( `id` INT NOT NULL, `name` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `example_table` (`id`, `name`) VALUES (1, 'Alice'); INSERT INTO `example_table` (`id`, `name`) VALUES (2, 'Bob'); ``` #### 注意事项 - 如果在导入过程中遇到类似“ERROR at line 658: Unknown command '\'”的问题,可以在导入时添加命令参数`--default-character-set=utf8`以解决编码问题[^2]。 - 对于MySQL 5.7及以上版本,如果在恢复数据时遇到`ERROR 1840 (HY000)`错误,建议在导出时添加`--set-gtid-purged=off`参数,避免导出GTID信息。 ### 备份示例代码 以下是使用mysqldump命令行工具结合DBeaver导出数据的示例命令: ```bash mysqldump -u username -p --set-gtid-purged=off database_name table_name > /path/to/output.sql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值