• TheOne
    2024-11-04 来自北京
    会把执行过程中标记为删除的记录都回滚,也就是回滚掉还没提交的事务

    作者回复: 对的,没有提交的事务会在InnoDB启动时回滚。 考虑到事务中修改的数据比较多,回滚可能会需要很长一段时间。回滚的过程中,还是会锁住这个表的记录。其他会话如果要修改这个表的记录,要等待锁。 在这个场景下,可能要将业务切换到备库,才能更快地恢复业务。

    
    
  • binzhang
    2024-11-02 来自美国
    在数据库启动时,MySQL 会怎么处理这个被中断的 delete 操作? assume it's INNODB. Mysql will start crash recovery processes, apply redo, do un-commit transaction rollback. Since this huge delete is not commit, mysql has to rollback it. Until all rollback finished, mysql can accept application traffic. so this guy might need to wait for long time while mysql is un-available. But i think in concept, once mysql finish redo apply in crash-recovery phase, it should be able to accept traffic while rollback un-commit transaction is still in-progress; application query can still wait for lock or do MVCC read. not sure if there're some internal parameter control it.
    展开

    作者回复: 数据库启动时,会使用一个后台线程回滚没有提交的事务。回滚的过程中,其他会话可以正常访问数据库,如果要访问正在回滚的这个表,可以使用MVCC或者要等待锁。 处理事务回滚的后台线程,在Processlist里看不到,不过可以在performance_schema.threads表里查到(name = 'thread/innodb/trx_recovery_rollback_thread'),或者用pstack查看。 参数innodb_force_recovery设置为3 (SRV_FORCE_NO_TRX_UNDO)或更大的值后,启动时不回滚事务。不过我没有测试过这种情况。

    
    