InnoDB 中文參考手冊 --- 10 multiversioning 的實現 (轉)

amyz發表於2007-08-15
InnoDB 中文參考手冊 --- 10 multiversioning 的實現 (轉)[@more@] words" content="My,InnoDB,4.1.0,Shuixin13, 4.1.0,中文,中文參考手冊,犬犬(心帆)"> CSS rel=STYLESHEET>

因為 InnoDB 是一個 multiversioned ,它必須在表空間內儲存記錄行的先期版本資訊。這個資訊被在被稱為回滾段(rollback segment)的資料結構中,這與 相似。

InnoDB 在內部處理時在資料庫中為每行記錄新增兩個欄位。一個6-byte 欄位描述最後一個插入或該行的事務的識別符號。同樣被刪除記錄在內部處理上為更新該行的某一標誌位, 該標誌位用於記錄它已被刪除。每行記錄同樣包含著一個名為滾指標(roll pointer)的 7-byte 欄位。這個指標指向一個在回滾段中儲存的撤消日誌記錄(undo log record)。如果該行被更新過,那麼撤消日誌記錄中包含必要的資訊來重建它被更新前的內容。

InnoDB 需要透過一個事務的回滾來實現使用回滾段中的資訊撤銷操作。它也用於為一個 consistent read 來重建一個記錄行的早期版本。

在回滾段中的撤銷日誌被分為插入和更新撤銷日誌。插入撤銷日誌(Insert undo logs)僅僅只在事務回滾時需要,它可以在事務一提交就被拋棄。更新撤銷日誌(Update undo logs)同樣也在 consistent reads 中使用,它們將在當前沒有事務時被拋棄。InnoDB 指派了一個資料快照,而 consistent read 需要更新撤銷日誌中的資訊來重建一個資料庫行的早期版本。

必須記錄有規律地提交你的事務,同樣的這些事務只發出了consistent reads。否則 InnoDB 不能夠從更新撤銷日誌中拋棄資料,則回滾段可能會增加地太大而填滿了整個表空間。

回滾段中的撤銷日誌記錄的物理尺寸通常比它們相對應的插入或更新的記錄要小些。 你可以透過學習這些資訊估算出回滾段所需的空間。

在 multiversioning 的設計中,以一條 SQL 語句刪除一個記錄行時,該記錄並不會立即從資料庫中移除。只在當 InnoDB 拋棄刪除的更新撤銷日誌記錄時,它才會從資料庫中物理地移除相應的記錄行以及它的。 這個移除操作被稱為 purge,它是非常快的,通常以與執行刪除的 SQL 語句相同的時間順序執行。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-957798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章