Skip to content
New issue

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

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

Already on GitHub? Sign in 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”。

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

No branches or pull requests

3 participants