Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

关于Mysql三大日志详解--undo-log描述不够具体 #2352

Open
MuXiaoFengGit opened this issue Apr 2, 2024 · 2 comments
Open

关于Mysql三大日志详解--undo-log描述不够具体 #2352

MuXiaoFengGit opened this issue Apr 2, 2024 · 2 comments
Labels
help wanted Extra attention is needed

Comments

@MuXiaoFengGit
Copy link

undo log

undo-log本身是写的sql执行结果的类似取反,insert记录会记录delete记录,并且undo-log本身也是需要保护回复的日志,记录undo-log的行为本身也会被记录到redo-log中,并且,undo-log本身是会删除清理的,例如delete的undo-log在事务提交之后就会直接删除。

@Snailclimb
Copy link
Owner

Snailclimb commented Apr 2, 2024

并且,undo-log本身是会删除清理的,例如delete的undo-log在事务提交之后就会直接删除。

感谢指出,这是我补充完善之后的:

每一个事务对数据的修改都会被记录到 undo log ,当执行事务过程中出现错误或者需要执行回滚操作的话,MySQL 可以利用 undo log 将数据恢复到事务开始之前的状态。

undo log 属于逻辑日志,记录的是 SQL 语句,比如说事务执行一条 DELETE 语句,那 undo log 就会记录一条相对应的 INSERT 语句。同时,undo log 的信息也会被记录到 redo log 中,因为 undo log 也要实现持久性保护。并且,undo-log 本身是会被删除清理的,例如 INSERT 操作,在事务提交之后就可以清除掉了;UPDATE/DELETE 操作在事务提交不会立即删除,会加入 history list,由后台线程 purge 进行清理。

undo log 是采用 segment(段)的方式来记录的,每个 undo 操作在记录的时候占用一个 undo log segment(undo 日志段),undo log segment 包含在 rollback segment(回滚段)中。事务开始时,需要为其分配一个 rollback segment。每个 rollback segment 有 1024 个 undo log segment,这有助于管理多个并发事务的回滚需求。

通常情况下, rollback segment header(通常在回滚段的第一个页)负责管理 rollback segment。rollback segment header 是 rollback segment 的一部分,通常在回滚段的第一个页。history list 是 rollback segment header 的一部分,它的主要作用是记录所有已经提交但还没有被清理(purge)的事务的 undo log。这个列表使得 purge 线程能够找到并清理那些不再需要的 undo log 记录。

@Snailclimb Snailclimb added the help wanted Extra attention is needed label Apr 3, 2024
@JasonTodd83
Copy link

undo log是不是保证事务的隔离性,它主要应用在MVCC中,实现不同隔离级别,而MysSQL恢复依靠redolog和binlog。
这是我从书里摘的:redolog有crash-safe,“有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe”,以及“redo log 和 binlog它们有一个共同的数据字段,叫XID。崩溃恢复的时候,会按顺序扫描redo log”。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants