學習《mysql 技術內幕:InnoDB 存儲引擎》 第三章關於數據庫文件以及 innodb 存儲引擎相關文件介紹,學習心得總結以下:mysql
mysql 文件主要包括參數文件,日誌文件,socket 文件,pid文件,表結構文件,存儲引擎文件。sql
mysql 啓動時會讀取配置參數文件,若是找不到文件,會使用默認值和源代碼中指定參數的默認值。數據庫
查看參數的兩種方式:緩存
show varables like "%innodb_use_native_aio%";
複製代碼
select * from GLOBAL_VARIABLES where varable_name like "%innodb_use_native_aio%";
複製代碼
參數分類:bash
在實例運行中能夠修改,可是隻在當前生命週期中有效,若是 mysql 重啓,仍是會從新讀取參數文件。因此若是想要在全部生命週期中有效,必須修改參數文件。服務器
對參數的修改能夠分爲 global 和 session,表示影響的是整個生命週期仍是當前會話。有些參數只能在當前會話中修改,有的參數只能在整個生命週期中修改,有些參數既能夠在當前會話中修改也能夠在整個生命中期中修改。網絡
set @@global.read_buffer_size=104876;
set @@session.read_buffer_size=78929;
select @@session.read_buffer_size;
select @@global.read_buffer_size;
複製代碼
在整個生命中期中不能夠修改。session
記錄了 Mysql 數據庫各類類型的操做行爲,主要包括錯誤日誌,慢查詢日誌,查詢日誌,二進制日誌。架構
不只記錄了全部錯誤信息,還有一些告警和正確的提示信息,方便定位問題。能夠查看參數 log_error 來找到 mysql 錯誤日誌文件的位置異步
show variables like "%log_error%"
複製代碼
能夠經過參數 log_slow_queries 設置是否開啓慢查詢日誌。
主要能夠記錄三種慢查詢 SQL:
慢查詢日誌的輸出格式,由 log_output 格式指定,主要有兩種格式:
- 查詢執行時間最長的 10 條 SQL 語句
mysqldumpslow -s al -n 10 david.log
複製代碼
查詢日誌記錄了全部對 MYSQL 數據庫請求的信息,不管這些請求是否獲得正確的執行。經過 general_log 和 general_log_file 參數設置。
二進制日誌(binary log) 記錄了對 MYSQL 數據庫執行更改的全部操做,可是不包括 SELECT 和 SHOW 類型操做,經過參數 log-bin 參數來開啓,主要用途以下:
開啓 binary log 會對性能形成必定的影響,可是這個影響有限,差很少 1% 的降低。
一些關於二進制日誌的配置參數:
當使用事務時,二進制文件的記錄會被先放入緩存,當事務提交時後面再寫入二進制文件,該參數記錄二進制文件緩存的大小。當超過這個值可是事務沒有被提交,這個時候會把緩存中的值寫入臨時文件。
複製代碼
- STATEMENT
記錄日誌文件執行的邏輯 SQL 語句,可是若是在服務器上運行 rand,uuid 等函數或者使用觸發器,均可能致使主從服務器數據不一致,默認的日誌格式就是 STATEMENT。
- ROW
記錄表的行的更改狀況,不會出現數據不一致狀況,但因爲記錄的是行數據的更改,二進制文件有時候會很大,開啓該參數對於磁盤的開銷和複製的網絡開銷都有必定的成本
- MIXED
採用 STATEMENT 和 ROW 混合的方式記錄日誌,一般狀況下使用 STATEMENT 方式,一些特殊狀況下使用 ROW 方式:
1) 存儲引擎爲 NDB
2)使用 UUID,USER,CURRENT_USER,FOUND_ROWS,ROW_COUNT 等不肯定函數
3)使用了 INSERT DELAY 語句
4)使用了用戶定義的函數
5)使用了臨時表
複製代碼
binary log 文件格式二進制的,不能直接查看,必須用工具 mysqlbinlog 命令分析查看
mysqlbinlog --start-position=203 test.000004
複製代碼
在本地鏈接 MYSQL 時使用 UNIX 域套接字方式時會用到的鏈接文件,經過參數 socket 來設置套接字文件的存儲位置
存放 mysql 進程 ID,經過參數 pid_file 來設置 pid 文件存放位置
以 frm 爲後綴名的文件,記錄了相關表和視圖的結構定義。
上面介紹的查詢日誌,二進制日誌等都是 mysql 數據庫自己的問題,和存儲引擎無關,而每一個存儲引擎有本身獨立文件,其中InnoDB 存儲引擎文件包括重作日誌文件和表空間文件:
- Master Thread 會每一秒刷新一次
- 每一個事物提交時會將刷新,由 innodb_flush_log_at_trx_commit 參數控制:
0 表示事務提交時,不寫入重作日誌文件,而是等待 Master Thread 的定時刷新
1 表示每當事務提交時,就必須同步寫入重作日誌文件,爲了保證 ACID 中的持久性,事務必須設置爲 1。才能保證宕機時能夠恢復
2 表示重作日誌文件異步寫入磁盤
- 當重作日誌緩存池剩餘空間小於 1/2 時會刷新,重作日誌緩存不能設置過小,不然會致使頻繁的執行 checkpoint 操做,致使性能的抖動。
複製代碼
- innodb_log_file_size:指定每一個重作日誌文件的大小
- innodb_log_files_in_group:每一個日誌文件中重作日誌文件的數量
- innodb_mirrored_log_groups:日誌鏡像文件組的數量
- innodb_log_group_home_dir:日誌文件組所在路徑
複製代碼
- 二進制日誌文件記錄全部與 MYSQL 數據庫有關的記錄,而重作日誌文件只記錄了關於 InnoDB 的事務日誌
- 二進制日誌文件記錄的是關於一個事務的具體操做內容,而重作日誌文件記錄了 InnoDB 關於每一個頁的更改的物理狀況
- 二進制日誌文件僅在事務提交前進行提交,而重作日誌文件在事務進行的過程當中,卻有不斷重作日誌條目被寫入
複製代碼