InnoDB Undo Log
- 簡介
Undo Log包含了一系列在一個單獨的事務中會產生的所有Undo Log記錄。每一個Undo Log記錄包含了如何undo事務對某一行修改的必要信息。InnoDB使用Undo Log來進行事務的回滾和MVCC機制。在邏輯存儲上,Undo Log位于Undo Log 段中,后者位于回滾段(roll back segments)中。在目前的最新版本中,會館段不僅僅可以位于系統表空間(例如data目錄下面的ibdata1文件就是一個系統表空間)、臨時表空間,也可以通過配置放置到undo 表空間中。InnoDB支持128個回滾段,其中32個用于臨時表的事務。剩下的96個,每一個支持1023個并發數據修改事務。
2. Undo Log物理結構
Undo Log的物理結構可以直接參照博文 :
http://insidemysql.blog.163.com/blog/static/2028340422013325115250722/
http://insidemysql.blog.163.com/blog/static/202834042201341011347494/
其中有兩個疑惑點:
一是第二篇博文中 UPDATE t SET c=2 WHERE a=1; 語句的說明中,寫道:列的值(a=1),我認為是作者的筆誤,應該是 c=1;
二是 80 00 01這是表示值為1,這里應該是InnoDB特殊處理了(猜測,可能是1開始表示為正數),作者說80 00 01表示為1是因為計算機中存儲的是有符號整數,但是1的有符號int表示形式應該是 00 00 01。
3.Undo Log邏輯內容
光看Undo Log的物理結構可能有點不好理解,這里講解一下自己的理解。考慮下面這樣的一些SQL。
CREATE TABLE my_tb(
id int auto_increment,
name varchar(255) not null,
sex varchar(255) not null,
primary key(id),
key(name)
) #事務一開始 插入一條數據 假設id=1 提交
BEGIN;
INSERT INTO my_tb(name,sex) values('a','boy');
COMMIT; #事務二開始 刪除操作 不提交
BEGIN;
DELETE FROM my_tb WHERE id=1;
#回滾不提交
ROLLBACK; #事務三開始 更新操作
BEGIN;
UPDATE my_tb set name='b' where id=1;
事務一在提交之前,會有一條這樣子的Undo Log:
插入了一條id=1的記錄 。
是的,插入語句中的undo log只會記錄 unique key(應該包括主鍵和所有的唯一鍵,猜測未證實,主鍵肯定是有的),而不包括其他字段的信息。
事務二提交之前,會有一條這樣子的Undo Log:
刪除了一條id=1的記錄,他的name為a,他的sex為boy。
這時候不僅僅會記錄主鍵,也會記錄所有字段的值。
事務三提交之前,會有一條這樣子的Undo Log:
更新了一條id=1的記錄,他的name為a。
注意這時候記錄的name不是b,而是a。
為什么Undo Log翻譯過來是這樣子的?其實思考一下Undo Log是用來做什么的就知道了。Undo Log被用于回滾和MVCC,兩者都需要恢復或者獲取到之前版本的信息。
如果你插入了一條數據,通過插入數據的Undo Log中唯一索引字段和值查找到對應的記錄,然后進行刪除(回滾時)或者忽略(MVCC);
如果你更新了了一條數據,找到對應的記錄之后,通過記錄的原始值(name='a')恢復成原來的記錄;
如果你刪除了一條數據,那么就需要完整的記錄信息,才能進行回滾和恢復。
當然,Undo Log中記錄的信息不像我說的這么簡單,具體的信息還是查看上面的兩篇博文,從物理結構中理解Undo Log。另外,Undo Log中提供的信息其實不是完整的,如果你的系統故障,導致已經提交的事務涉及的記錄沒有刷新到磁盤而丟失更新,這時候就需要redo log和 double write buffer一起配合進行恢復了。
總結
以上是生活随笔為你收集整理的InnoDB Undo Log的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高考征集志愿是什么意思(征集志愿的含义是
- 下一篇: 学习笔记::AC自动机