日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

InnoDB Undo Log

發布時間:2024/8/24 编程问答 37 如意码农
生活随笔 收集整理的這篇文章主要介紹了 InnoDB Undo Log 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  1. 簡介

  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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。