mysql檔案理解

2023-01-27 16:45:53 字數 2611 閱讀 8799

原創 2014年10月28日 11:26:34

眾所周知,mysql支援多種儲存引擎,現在常用的是myisam和innodb。myisam相對簡單,但不支援事務,而innodb是事務安全型的。而innodb的事務處理離不開undo_log和redo_log。

下面簡單的介紹一下innodb的儲存引擎

如果mysql不用記憶體緩衝池,每次讀寫資料時,都需要訪問磁碟,必定會大大增加i/o請求,導致效率低下。所以innodb引擎在讀寫資料時,把相應的資料和索引載入到記憶體中的緩衝池(buffer pool)中,一定程度的提高了資料讀寫的速度。

buffer pool:佔最大塊記憶體,用來存放各種資料的快取包括有索引頁、資料頁、undo頁、插入緩衝、自適應雜湊索引、innodb儲存的鎖資訊、資料字典資訊 等。工作方式總是將資料庫檔案按頁(每頁16k)讀取到緩衝池,然後按最近最少使用(lru)的演算法來保留在緩衝池中的快取資料。如果資料庫檔案需要修 改,總是首先修改在快取池中的頁(發生修改後即為髒頁dirty page),然後再按照一定的頻率將緩衝池的髒頁重新整理到檔案。

表空間可看做是innodb儲存引擎邏輯結構的最高層。 表空間檔案:innodb預設的表空間檔案為ibdata1。

redo log

redo log就是儲存執行的sql語句到一個指定的log檔案,當mysql執行資料恢復時,重新執行redo log記錄的sql操作即可。引入buffer pool會導致更新的資料不會實時持久化到磁碟,當系統崩潰時,雖然buffer pool中的資料丟失,資料沒有持久化,但是系統可以根據redo log的內容,將所有資料恢復到最新的狀態。redo log在磁碟上作為一個獨立的檔案存在。預設情況下會有兩個檔案,名稱分別為 ib_logfile0和ib_logfile1。

引數innodb_log_file_size指定了redo log的大小;innodb_log_file_in_group指定了redo log的數量,預設為2; innodb_log_group_home_dir指定了redo log所在路徑。

innodb_additional_mem_pool_size =100m

innodb_buffer_pool_size =128m

innodb_data_home_dir =/home/mysql/local/mysql/var

innodb_data_file_path =ibdata1:1g:autoextend

innodb_file_io_threads =4

innodb_thread_concurrency =16

innodb_flush_log_at_trx_commit =1

innodb_log_buffer_size =8m

innodb_log_file_size =128m

innodb_log_file_in_group =2

innodb_log_group_home_dir =/home/mysql/local/mysql/var

undo log

為了滿足事務的原子性,在操作任何資料之前,首先將資料備份到undo log,然後進行資料的修改。如果出現了錯誤或者使用者執行了rollback語句,系統可以利用undo log中的備份將資料恢復到事務開始之前的狀態。與redo log不同的是,磁碟上不存在單獨的undo log檔案,它存放在資料庫內部的一個特殊段(segment)中,這稱為undo段(undo segment),undo段位於共享表空間內。

innodb為每行記錄都實現了三個隱藏欄位:

redo log的記錄內容

undo log和 redo log本身是分開的。innodb的undo log是記錄在資料檔案(ibd)中的,而且innodb將undo log的內容看作是資料,因此對undo log本身的操作(如向undo log中插入一條undo記錄等),都會記錄redo log。undo log可以不必立即持久化到磁碟上。即便丟失了,也可以通過redo log將其恢復。因此當插入一條記錄時:

向undo log中插入一條undo log記錄。

向redo log中插入一條”插入undo log記錄“的redo log記錄。

插入資料。

向redo log中插入一條”insert”的redo log記錄。

redo log的io效能

為了保證redo log能夠有比較好的io效能,innodb 的 redo log的設計有以下幾個特點:

儘量保持redo log儲存在一段連續的空間上。因此在系統第一次啟動時就會將日誌檔案的空間完全分配。以順序追加的方式記錄redo log。

批量寫入日誌。日誌並不是直接寫入檔案,而是先寫入redo log buffer,然後每秒鐘將buffer中資料一併寫入磁碟

併發的事務共享redo log的儲存空間,它們的redo log按語句的執行順序,依次交替的記錄在一起,以減少日誌佔用的空間。

redo log上只進行順序追加的操作,當一個事務需要回滾時,它的redo log記錄也不會從redo log中刪除掉

redo & undo log的作用

4 4 1 理解配置檔案

windows 使用者從現在起就需要轉變觀念 linux 中並沒有類似於 登錄檔 這樣的二進位制表項,所有軟體的配置都是通過文字檔案實現的。這樣的安排看起來有點 原始 但讀者很快會發現設計者的良苦用心。不同的軟體會定義屬於自己的語法規則,這些配置語法間的區別總是讓人聯想到人類語言的豐富,而不是複雜或...

CMakeLists檔案理解

目錄 在一個cmake工程中,我們會用cmake 命令生成一個makefile 檔案,然後,用make命令根據這個makefile 檔案的內容編譯整個工程。其中cmakelists.txt 檔案用來告訴cmake命令我們要對這個目錄下的檔案做什麼事情。cmake lists.txt 檔案的內容需要遵...

aop配置檔案理解

ref指向check 表示在com.cn.jgweb.utils.在這個包下的所有類所有方法都有aop參與 指定前置方法 指定後置方法 我的理解是 先攔截住這個方法,然後呼叫切面before方法,然後在執行 add方法攔截規則 com.bjsxt.service 下的所有子類的 add 有引數方法 ...