本文分析了在 MySQL 5.7+ 版本,使用 MyIASM 引擎的数据库中,对两个表 TABLE-A 和 TABLE-B 进行锁操作时的行为,以及误删数据后如何进行恢复。

场景:

有两个会话 A 和 B,都连接了同一个数据库。

操作步骤:

  1. 会话 A 连接数据库,会话 B 连接数据库。
  2. 会话 A 执行命令:'lock table TABLE-A read;',对 TABLE-A 表添加读锁。
  3. 会话 A 执行命令:'select * from TABLE-A;',读取 TABLE-A 表数据。
  4. 会话 B 执行命令:'select * from TABLE-A;',尝试读取 TABLE-A 表数据。
  5. 会话 A 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
  6. 会话 B 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
  7. 会话 A 执行命令:'unlock tables;',释放 TABLE-A 表的锁。
  8. 会话 A 执行命令:'select * from TABLE-B;',读取 TABLE-B 表数据。
  9. 会话 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 表中的数据,并且没有备份,可以尝试以下方法进行数据恢复:

  1. 使用 binlog 日志进行数据恢复:

    • 检查是否开启了 binlog 日志,可以通过查看 'my.cnf' 配置文件或使用 'SHOW VARIABLES LIKE 'log_bin';' 命令来确认。
    • 使用 'mysqlbinlog' 工具将 binlog 日志文件转换为 SQL 语句,例如:'mysqlbinlog binlog.000001 > restore.sql'。
    • 在生成的 SQL 文件中找到删除 TABLE-A 表数据的语句,将其注释或删除。
    • 执行恢复的 SQL 文件,将数据恢复到 TABLE-A 表中。
  2. 使用第三方备份工具进行恢复:

    • 如果有使用第三方备份工具对数据库进行定期备份,可以从备份中恢复 TABLE-A 表的数据。
    • 根据备份工具的使用方法,选择指定时间点的备份,并将备份数据恢复到 TABLE-A 表中。
  3. 使用数据恢复工具进行恢复:

    • 如果没有备份或备份不可用,可以尝试使用数据恢复工具进行恢复。常用的数据恢复工具有 MySQL 的官方工具 'mysqlpump' 和第三方工具 'Percona Toolkit' 等。
    • 根据具体工具的使用方法,选择适合的数据恢复方式,将数据恢复到 TABLE-A 表中。

重要提醒:

无论使用哪种方式进行数据恢复,建议在操作之前先备份数据库,以防止操作过程中出现意外情况导致数据丢失。


原文地址: https://www.cveoy.top/t/topic/pvhL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录