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 数据库/表。但是,有问题的表是单独数据库中的唯一表。删除整个表或整个数据库不是问题,因为我可以在之后重新导入所有数据。
您实际上无能为力,因为回滚是通过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 在其中一种模式下完全启动
警告:确保备份所有内容!!!
我希望这有帮助 !!!
归档时间: |
|
查看次数: |
9206 次 |
最近记录: |