2012-03-30 109 views
5

我正在为我们需要在我们的DBMS(MySQL)中使用“事务日志”的项目工作。我们已经转向使用InnoDB,以便将事务用于其他需求。我想了解什么是事务日记。我一直在寻找一整天,包括阅读MySQL文档。也许我只是没有搜索正确的关键字,我不确定。或者,“交易日记”可能是不恰当的术语。MySQL事务日志

据我所知,数据库事务日志类似于日志文件系统,因为日志文件在提交到文件系统之前会对其进行更改。从我读到的内容来看,这听起来像InnoDB引擎在将某些日记交给磁盘之前将其存储在某种日记中。这听起来准确吗?如果是这样,交易日志在哪里?它是ib_logfile0和ib_logfile1吗?

回答

9

你绝对是在这里正确的轨道上。

每当InnoDB执行一个必须提交的事务时,它将作为一个两阶段提交完成。事务首先被写入这些日志中。然后,他们从那里承诺。

这有助于MySQL事故或服务器崩溃事件。

当你重启MySQL,在ib_logfile0所有未提交的条目和ib_logfile1重播作为的InnoDB的崩溃恢复带来的InnoDB的和谐状态的一部分(这是一贯和ACID Compliance耐用的零件)

如果删除ib_logfile0和ib_logfile1并启动mysql,这些文件包含的任何未提交的事务都将丢失。在崩溃恢复周期中,如果日志文件丢失,则基于innodb_log_file_size设置重新生成日志文件。请参阅MySQL Documentation for a detailed explanation of InnoDB

@karatedog InnoDB的MVCC部分发生在系统表空间中,更好地称为ibdata1。无论在事务开始之前显示的数据是否被记录,以允许其他访问所需行的人在施加任何更新之前都有数据的视图。这是允许所谓的可重复阅读。这属于ACID合规性的I,我的意思是隔离。我在DBA StackExchange中针对事务隔离是好的,坏的或丑陋的各种场景写了关于这方面的文章。

作为对MyISAM,crash recovery is not automatic. It crashes rather easily。这就是SQL命令REPAIR TABLE存在的原因。这也是为什么MySQL实用程序myisamchk具有-r选项可以为不在线的MyISAM表执行REPAIR TABLE

MariaDB and Aria已经尝试使用安全防撞存储引擎来替代MyISAM。

+0

我知道这些日志文件是用于崩溃恢复的,但不是在发生崩溃时负责“事务”正确发生的MVCC机制? MyISAM有一定程度的崩溃恢复,但根本没有交易。 – karatedog 2012-03-30 22:11:34

+0

感谢您的详细和及时的回复。我对重播日志中的条目有点困惑。如果在交易中间发生故障,在提交之前,我认为你不想重放这些条目,因为交易全是或全无(你不希望交易的一部分做出承诺)。还是你说他们只有在提交时才会重播,但是失败发生在事务提交到数据库之前,但在将它保存到日志文件之后? – alfredough 2012-04-02 22:57:02