1. 程式人生 > >MySQL技術內幕InnoDB儲存引擎-03檔案

MySQL技術內幕InnoDB儲存引擎-03檔案

1.引數檔案

當MySQL例項啟動時,MySQL會先去讀一個配置引數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化引數,這些引數通常定義了某種記憶體結構有多大等設定。

MySQL例項也可以不需要引數檔案,這時所有的引數值取決於編譯MySQL時指定的預設值和原始碼中指定引數的預設值。

引數的值可以在information_schema架構下的GLOBAL_VARIABLES檢視來進行查詢:
select * from GLOBAL_VARIABLES where like ‘innodb_buffer%’\G 或 show variables like ‘innodb_buffer%’\G

引數可以分為兩類:動態引數和靜態引數

動態引數意味著你可以在MySQL例項執行中進行修改;靜態引數說明在整個例項生命週期內都不得進行更改,就好像是隻讀的。可以通過set命令對動態的引數進行修改。
語法為:
set
| [global | session] system_var_name = expr
| [@@global. | @@session. |@@] system_var_name = expr
global和session表明該引數的修改是基於當前會話還是整個例項的生命週期。

set @@global.read_buffer_size = 1048576;
把read_buffer_size全域性值更改為1MB,而當前會話的read_buffer_size的值不會改變。需要注意的是,對變數的全域性值

進行了修改,在這次的例項生命週期內都有效,但MySQL例項本身並不會對引數檔案中的該值進行修改。也就是說下次啟動時,MySQL例項還是會讀取引數檔案。

2.日誌檔案

記錄了影響MySQL資料庫的各種型別活動。常見的日誌檔案有錯誤日誌,二進位制日誌,慢查詢日誌,查詢日誌。

2.1錯誤日誌

對MySQL的啟動,執行,關閉過程進行了記錄。MySQL DBA在遇到問題時首先檢視該檔案。該檔案不但記錄了出錯資訊,也記錄了一些警告或者正確的資訊。預設err結尾。
show variables like ‘log_error’;

2.2慢查詢日誌

可以通過錯誤日誌得到一些關於資料庫優化的資訊幫助,而慢查詢能為SQL語句的優化

帶來很好的幫助。可以設一個閥值,將執行時間超過該閥值的所有SQL語句記錄到慢查詢日誌檔案中。該閥值可以通過引數long_query_time來設定,預設值為10,代表10秒。

預設情況下,MySQL資料庫並不啟動慢查詢日誌,需要手工將這個引數設為ON,然後啟動。

另一個和慢查詢日誌有關的是log_queries_not_using_indexes,如果執行的SQL語句沒有使用索引,則MySQL資料庫同樣會將這條SQL語句記錄到慢查詢日誌檔案。首先確保打開了log_queries_not_using_indexes。
mysqldumpslow命令,用於分析慢查詢日誌的資料。

引數log_output指定了慢查詢輸出的格式,預設為FILE,你可以將它設為TABLE,然後就可以查詢mysql架構下的slow_log表了。檢視slow_log表的定義會發現,該表使用的是CSV引擎。

2.3查詢日誌

記錄了所有對MySQL資料庫請求的資訊,不論這些請求是否得到了正確的執行。預設檔名為:主機名.log

2.4二進位制檔案

記錄了對資料庫執行更改的所有操作,但是不包括select和show這類操作。因為這類操作對資料本身並沒有修改。

二進位制日誌的作用:
1.恢復:某些資料的恢復需要二進位制日誌。
2.複製:通過複製和執行二進位制日誌使得一臺遠端的MySQL資料庫與一臺MYSQL資料庫進行實時同步。
通過配置引數log-bin[=name]可以啟動二進位制日誌。
bin_log.index為二進位制的索引檔案,用來儲存過往產生的二進位制日誌序號。
二進位制日誌檔案預設情況下並沒有啟動,需要手動指定引數來啟動。
引數max_binlog_size指定了單個二進位制日誌檔案的最大值,如果超過該值,則產生新的二進位制日誌檔案,字尾名+1,並記錄到.index檔案。

當使用事務的表儲存引擎時(如InnoDB),所有未提交的二進位制日誌都會被記錄到一個快取中,等該事務提交時直接將緩衝中的二進位制日誌寫入二進位制檔案,而該緩衝的大小由binlog_cache_size決定。binlog_cache_size是基於會話(session)的,也就是說,當一個執行緒開始一個事務時,MySQL會自動分配一個大小為binlog_cache_size的快取。

當一個事務的記錄大於設定的binlog_cache_size時,MySQL會把緩衝中的日誌寫入一個臨時檔案中。

預設情況下,二進位制日誌並不是每次寫的時候同步到磁碟。引數sync_binlog=[N]表示每寫緩衝多少次就同步到磁碟。

當使用sync_binlog為1時,在一個事務發出commit動作之前,由於sync_binlog為1,因此會將二進位制日誌寫入磁碟。如果這時已經寫入了二進位制日誌,但提交還沒有發生,並在此時發生了宕機,可使用innodb_support_xa設為1來解決。

binlog_format影響了二進位制日誌的格式。InnoDB儲存引擎的預設事務隔離級別是REPEATABLE READ.該引數可設的值有STATEMENT, ROW和MIXED。

1.STATEMENT,二進位制日誌檔案記錄的是日誌的邏輯SQL語句。

2.在ROW格式下,二進位制日誌記錄的不是簡單的SQL語句,而是記錄表的行更改情況。基於ROW格式的複製可以解決在statement格式下複製的問題。這種情況下,可以將InnoDB的事務隔離基本設為READ COMMITED。

3.MIXED格式下,MySQL預設採用STATEMENT格式進行二進位制日誌檔案的記錄,但在一些情況下會使用row格式,可能的情況:
(1)表的儲存引擎為NDB,這時對錶的DML操作都會以Row格式記錄。
(2)使用了uuid(),user(),current_user(),found_rows(),row_count()等不確定函式。
(3)使用了insert delay語句。
(4)使用了使用者定義函式UDF。
(5)使用了臨時表。

將引數binlog_format設定為ROW,這可以為資料庫的恢復和複製帶來更好的可靠性。但這會帶來二進位制檔案的增加,有些語句下ROW格式下可能需要更大的容量。這是因為,這時MySQL資料庫不再將邏輯的SQL操作記錄到二進位制日誌中,而是記錄對於每行的更改記錄資訊。

3.pid檔案

當MySQL例項啟動時,會將自己的程序ID寫入一個檔案中——該檔案即為pid檔案。該檔案可由引數pid_file控制。

4.表結構定義檔案

MySQL對於資料的儲存是按照表的,所以每個表都會有與之對應的檔案。不論採用何種儲存引擎,MySQL都有一個以frm為字尾名的檔案,這個檔案記錄了該表的表結構定義
frm還用來存放試圖的定義,如v_a檢視,那麼會產生一個v_a.frm用來記錄檢視的定義。

5.InnoDB儲存引擎檔案

5.1表空間檔案

InnoDB將儲存的資料按表空間進行存放。預設配置下,會有一個名為ibdata1的檔案。設定innodb_data_file_path引數後,之後對於所有基於InnoDB儲存引擎的表的資料都會記錄到該檔案內。而通過設定innodb_file_per_table,我們可以將每個基於InnoDB儲存引擎的表單獨產生一個表空間,檔名為.ibd.這樣不用將所有資料都存放於預設的表空間中。這些單獨的表空間檔案僅儲存該表的資料,索引和插入緩衝等資訊,其餘資訊還是存放在預設的表空間中。

5.2重做日誌檔案

當例項或介質失敗時,重做日誌檔案就能派上用場。如資料庫由於所在主機斷電導致例項失敗,InnoDB儲存引擎會使用重做日誌恢復到斷電前的時刻,以此來保證資料的完整性。