Joyce Babu Asked: 2021-11-12 21:57:05 +0800 CST2021-11-12 21:57:05 +0800 CST 2021-11-12 21:57:05 +0800 CST 如何查找正在回滚的事务 772 我的 MariaDB 服务器今天早些时候崩溃了,但仍在恢复中。错误日志显示 InnoDB:回滚:1 个事务,519345 行 从日志条目看来,回滚将需要大约 4 小时才能完成。而且我的网站几乎没有响应,因为服务器正忙于回滚。 根据正在回滚的事务影响的行数,我怀疑服务器正在尝试回滚涉及日志表的事务。如果是这样的话,我不介意丢失数据。 如何找到受回滚事务影响的表?如果确实是非关键表,我该如何跳过回滚? mariadb rollback 2 个回答 Voted Best Answer Phill W. 2021-11-13T06:10:13+08:002021-11-13T06:10:13+08:00 ...我的网站几乎没有响应,因为服务器正忙于回滚。 坦率地说,我很惊讶这个数据库除了执行回滚之外还能响应其他任何事情。 如果您有多个数据库,那么是的,它们都会受到严重影响。 一个影响519k记录的事务对我来说听起来不像是“日志表”问题,或者,如果是,那么它正在被一个看似从未发出提交的进程更新!(也许仅在进程关闭时?)。 事务,包括其日志记录,应尽可能短(即快)。 对我来说,这听起来更像是一个中断的批处理作业。 我怎样才能找到受影响的表... 我不确定你能不能。 如果确实是非关键表,我该如何跳过回滚? 简短的回答 - 你不能。 回滚是实例恢复的基本部分,您的数据库在发生故障后必须通过它才能使您的数据恢复到良好的“已知状态”。 您可能能够对“未记录”的特定表进行更改(我不记得 MariaDB 是否支持),但这样做可能会给您在数据库恢复领域带来其他“有趣”的问题。 mysql_user 2021-11-12T23:02:49+08:002021-11-12T23:02:49+08:00 我建议不要这样做,但在启动期间跳过回滚的唯一方法是强制 innodb 恢复。我们需要的选项是#3 ( SRV_FORCE_NO_TRX_UNDO)。 您必须将以下内容添加到 cnf 的[mysqld]部分并重新启动: innodb_force_recovery=3 参考:https ://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
坦率地说,我很惊讶这个数据库除了执行回滚之外还能响应其他任何事情。
如果您有多个数据库,那么是的,它们都会受到严重影响。
一个影响519k记录的事务对我来说听起来不像是“日志表”问题,或者,如果是,那么它正在被一个看似从未发出提交的进程更新!(也许仅在进程关闭时?)。
事务,包括其日志记录,应尽可能短(即快)。
对我来说,这听起来更像是一个中断的批处理作业。
我不确定你能不能。
简短的回答 - 你不能。
回滚是实例恢复的基本部分,您的数据库在发生故障后必须通过它才能使您的数据恢复到良好的“已知状态”。
您可能能够对“未记录”的特定表进行更改(我不记得 MariaDB 是否支持),但这样做可能会给您在数据库恢复领域带来其他“有趣”的问题。
我建议不要这样做,但在启动期间跳过回滚的唯一方法是强制 innodb 恢复。我们需要的选项是#3 (
SRV_FORCE_NO_TRX_UNDO
)。您必须将以下内容添加到 cnf 的
[mysqld]
部分并重新启动:参考:https ://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html