一、概述
在這篇博客中我要整理MySQL數據庫和InnoDB存儲引擎的各種類型文件。
- 參數文件:數據庫啓動時的數據文件位置、初始化參數、各種內存大小設置
- 日誌文件:錯誤日誌、二進制日誌、慢查詢日誌、查詢日誌
- socket文件:套接字方式連接數據庫時的文件
- pid文件:數據庫實例進程ID文件
- MySQL表結構文件:存放MySQL表結構定義文件。
- 存儲引擎文件:存儲了記錄和索引等數據的文件。
二、參數文件
簡單來看,可以把數據庫參數看做是一個鍵值對(key/value),比如說innodb_buffer_pool_size=1G,這裏的鍵是innodb_buffer_pool_size,值是1G。
- Mysql啓動時,讀一個參數去定位數據庫的文件
- 某些初始化參數,定義了某個內存結構的大小
參數分爲兩種類型:
- 動態參數:MySQL實例運行時可以修改
- 靜態參數:不可以修改,只讀。
注意一下global和session關鍵字。
他們表明動態參數的修改是基於當前的會話還是整個實例的生命週期。
三、日誌文件
3.1 錯誤日誌
錯誤日誌對MySQL的啓動、運行、關閉過程進行了記錄,所以如果我們在實踐中發現數據庫無法正常啓動,就去查看錯誤日誌文件。
3.2 慢查詢日誌
慢查詢日誌,顧名思義,就是查詢比較慢的日誌,就是SQL語句執行比較慢的語句,會被記錄到該日誌中,那麼DBA可以通過慢查詢日誌可以得到一些關於數據庫優化的信息,從而進行SQL語句層面的優化。我們可以設置一個閾值long_query_time,默認爲10,代表10秒。那麼運行時間超過這個閾值的SQL語句都會被記錄到慢查詢日誌中。
3.3 二進制日誌
二進制日誌記錄了對MySQL數據庫執行更改的所有操作。Select和Show這類SQL不會被記錄到二進制日誌中,但如果是update,就算沒有修改任何記錄,也會被記錄到二進制日誌中。
二進制日誌的三個作用:
- 恢復:point-in-time恢復
- 複製:主從數據庫進行同步,複製二進制文件並執行
- 審計:可以分析是否有數據庫注入攻擊的發生
實現機制:當使用事物的表存儲引擎時,所有未提交的二進制日誌會記錄到一個緩存中去,等該事物提交的時候直接將緩存中的二進制日誌刷到磁盤上,該緩衝的大小由binlog_cache_size決定,默認爲32K。
參數sync_binlog=[N]表示每寫緩存多少次就刷一次磁盤。sync_log=1表示每寫一次緩存直接把緩存裏的刷到磁盤。
特殊情況:當使用InnoDB存儲引擎的時候,在一個事物Commit之前,由於sync_binlog爲1,因此會將二進制日誌立即寫入磁盤。如果這時已經寫入了二進制文件,Commit還沒有發生,然後宕機了,那麼下次MySQL啓動時,事物會被回滾掉,但是二進制文件已經記錄了數據,不能回滾。這個問題可以通過設置參數innodb_support_xa爲1來解決。
參數binlog_format影響二進制文件日誌的格式
- STATEMENT:記錄邏輯SQL語句
- ROW:記錄表的行更改情況(爲數據庫的恢復、主從複製提供可靠性,但磁盤開銷會增大)
- MIXED:前兩者混合
四、套接字文件、pid文件、表結構定義文件
Unix系統下本地連接MySQL可以採用Unix域套接字方式,這種方式需要一個套接字文件。套接字文件由參數socket控制,一般在/tmp目錄下。
MySQL實例啓動時,會把自己的進程id寫到一個pid文件中。
frm文件記錄表、視圖的表結構定義。
五、 InnoDB存儲引擎文件
5.1 表空間文件
數據存儲到表空間。
用戶可以通過多個文件組成一個共享表空間。
所有基於InnoDB存儲引擎的表的數據都會記錄到該共享表空間。
當然,可以通過參數innodb_file_per_table=ON設置獨立的表空間,這些單獨的表空間僅存放表的數據、索引和插入緩衝BITMAP。
5.2 重做日誌文件(redo log)
記錄了所有的事物。如果數據庫所在主機掉電宕機,InnoDB存儲引擎會通過重做日誌恢復到掉電前的時刻,保證數據的完整性。
redo log和二進制文件的不同:
- 層次不同
- 二進制文件 記錄所有與MySQL有關的日誌記錄,包括InnoDB、MyISAM、Heap等其他存儲引擎的日誌。
- 重做日誌文件 只記錄與InnoDB有關的事物日誌。
- 內容不同
- 二進制文件 記錄的是事物的具體操作內容,該日誌是邏輯日誌
- 重做日誌文件 記錄的是每個頁的更改的物理情況(如偏移量800,寫’aaa’)
- 寫入時機不同
- 二進制文件 只在事物Commit前寫一次磁盤
- 重做日誌文件 在事物進行過程中也是不斷刷到磁盤的,由Master Thread執行。
通過設置innodb_flush_log_at_trx_commit參數(0、1、2),來控制事物Commit時是否需要把緩衝中的日誌刷到磁盤。
- 0表示不將緩衝中事物的重做日誌刷到磁盤,而是等Master Thread每秒刷新
- 1表示要刷,也就是會伴有fsync的調用
- 2表示異步寫到磁盤,就是寫到文件系統的緩衝中。
所以如果這個參數設置爲0或者2,宕機時可能會導致部分事物的丟失。
但設置爲2的時候,如果只是數據庫崩了,操作系統沒崩,恢復時同樣保證數據不丟失。