删除带有待处理事务的 MySQL 表

das*_*sup 10 mysql innodb transaction rollback

有没有办法在 MySQL 中删除具有待处理事务的 InnoDB 表或数据库(最好在文件系统级别)?

发生了什么:

我使用 MySQL 5.5.28 并运行LOAD DATA INFILE…将一个巨大的数据集(300M 行)导入到 InnoDB 表中。我以前没用过set autocommit = 0;。不幸的是,mysqld在导入过程中被停止了。

当我重新启动时mysql,它会尝试使用如下消息回滚填充系统日志的事务:

mysqld_safe[4433]:121212 16:58:52 InnoDB:等待 1 个活动事务完成

问题是回滚现在运行了超过 25 小时,在此期间 mysqld不接受任何套接字连接。

我不能只是删除/var/lib/mysql/*并从头开始,因为这台机器上还有一些其他 InnoDB 数据库/表。但是,有问题的表是单独数据库中的唯一表。删除整个表或整个数据库不是问题,因为我可以在之后重新导入所有数据。

Rol*_*DBA 8

您实际上无能为力,因为回滚是通过ibdata1 中的 UNDO 表空间完成的,该表空间本大幅增长。

如果您终止 mysqld 进程并重新启动 mysql,它会在崩溃恢复周期中从停止的地方开始。

免责声明:不对数据丢失负责

您可以做的事情可能会导致其他表的数据丢失,但是您可以采取一些措施来规避 InnoDB 的正常崩溃恢复周期。

有一个名为innodb_force_recovery的启动选项,它允许您绕过 InnoDB 崩溃恢复的各个阶段。

根据强制 InnoDB 恢复的 MySQL 文档,这里是设置及其效果:

1 (SRV_FORCE_IGNORE_CORRUPT)

即使检测到损坏的页面,也让服务器运行。尝试让 SELECT * FROM tbl_name 跳过损坏的索引记录和页面,这有助于转储表。

2 (SRV_FORCE_NO_BACKGROUND)

防止主线程运行。如果在清除操作期间发生崩溃,此恢复值会阻止它。

3 (SRV_FORCE_NO_TRX_UNDO)

不要在崩溃恢复后运行事务回滚。

4 (SRV_FORCE_NO_IBUF_MERGE)

防止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表统计信息。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

启动数据库时不要查看撤消日志:InnoDB 甚至将不完整的事务视为已提交。

6 (SRV_FORCE_NO_LOG_REDO)

不要执行与恢复相关的重做日志前滚。

由于事务更改隐藏在 UNDO 和 REDO 日志中,您将面临以下风险

  • 丢失要写入的数据
  • 保留要删除的数据

如果您预计会有不良副作用,请备份整个 /var/lib/mysql 并将其放在某处,以防您想复制 ibdata1、ib_logfile0 和 ib_logfile1 并重试正常恢复。

如果 mysql 在其中一种模式下完全启动

  • mysqldump 除违规表外的所有数据
  • 关闭mysql
  • 删除 /var/lib/mysql 中除 /var/lib/mysql/mysql 之外的所有内容
  • 启动mysql
  • 重新加载mysqldump

警告:确保备份所有内容!!!

我希望这有帮助 !!!