MySQL 5.7+ MyIASM 表锁和数据恢复方法解析
本文分析了在 MySQL 5.7+ 版本,使用 MyIASM 引擎的数据库中,对两个表 TABLE-A 和 TABLE-B 进行锁操作时的行为,以及误删数据后如何进行恢复。
场景:
有两个会话 A 和 B,都连接了同一个数据库。
操作步骤:
- 会话 A 连接数据库,会话 B 连接数据库。
- 会话 A 执行命令:'lock table TABLE-A read;',对 TABLE-A 表添加读锁。
- 会话 A 执行命令:'select * from TABLE-A;',读取 TABLE-A 表数据。
- 会话 B 执行命令:'select * from TABLE-A;',尝试读取 TABLE-A 表数据。
- 会话 A 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
- 会话 B 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
- 会话 A 执行命令:'unlock tables;',释放 TABLE-A 表的锁。
- 会话 A 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
- 会话 B 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
结果分析:
- 第 3 步:返回 TABLE-A 表中的所有数据。
- 第 4 步:由于 TABLE-A 被会话 A 加了读锁,会话 B 无法访问 TABLE-A 表,返回错误信息。
- 第 5 步:返回 TABLE-B 表中的所有数据。
- 第 6 步:返回 TABLE-B 表中的所有数据。
- 第 8 步:返回 TABLE-B 表中的所有数据。
- 第 9 步:返回 TABLE-B 表中的所有数据。
原因解释:
在第 2 步,会话 A 使用了 'lock table TABLE-A read;' 命令,对 TABLE-A 表添加了读锁。这意味着其他会话无法对 TABLE-A 表进行写操作,但可以进行读操作。因此,在第 4 步,会话 B 无法读取 TABLE-A 表的数据,必须等待会话 A 释放锁才能读取。
在第 7 步,会话 A 使用了 'unlock tables;' 命令,释放了 TABLE-A 表的锁。因此,在第 8 步和第 9 步,会话 A 和会话 B 都可以读取 TABLE-B 表的数据。
误删数据恢复方法:
由于误操作删除了 TABLE-A 表中的数据,并且没有备份,可以尝试以下方法进行数据恢复:
-
使用 binlog 日志进行数据恢复:
- 检查是否开启了 binlog 日志,可以通过查看 'my.cnf' 配置文件或使用 'SHOW VARIABLES LIKE 'log_bin';' 命令来确认。
- 使用 'mysqlbinlog' 工具将 binlog 日志文件转换为 SQL 语句,例如:'mysqlbinlog binlog.000001 > restore.sql'。
- 在生成的 SQL 文件中找到删除 TABLE-A 表数据的语句,将其注释或删除。
- 执行恢复的 SQL 文件,将数据恢复到 TABLE-A 表中。
-
使用第三方备份工具进行恢复:
- 如果有使用第三方备份工具对数据库进行定期备份,可以从备份中恢复 TABLE-A 表的数据。
- 根据备份工具的使用方法,选择指定时间点的备份,并将备份数据恢复到 TABLE-A 表中。
-
使用数据恢复工具进行恢复:
- 如果没有备份或备份不可用,可以尝试使用数据恢复工具进行恢复。常用的数据恢复工具有 MySQL 的官方工具 'mysqlpump' 和第三方工具 'Percona Toolkit' 等。
- 根据具体工具的使用方法,选择适合的数据恢复方式,将数据恢复到 TABLE-A 表中。
重要提醒:
无论使用哪种方式进行数据恢复,建议在操作之前先备份数据库,以防止操作过程中出现意外情况导致数据丢失。
原文地址: https://www.cveoy.top/t/topic/pvhL 著作权归作者所有。请勿转载和采集!