MySQL日誌文件

MySQL日誌文件能夠幫助咱們程序員對MySQL數據庫的運行狀態進行診斷,從而更好的進行數據庫層面及代碼層面的優化,我說說我所瞭解的一些MySQL日誌文件。mysql

1.錯誤日誌

錯誤日誌文件對MySQL的啓動、運行、關閉過程都進行了記錄,它不只記錄了全部的錯誤信息,也記錄了一些警告信息和正確的信息。它能過很好的幫助咱們定位問題。程序員

咱們經過命令SHOW VARIABLES LIKE 'log_error'命令找到該文件的路徑和文件名(如下所有使用個人本機MySQL爲例)面試

在默認狀況下錯誤文件的文件名爲服務器的主機名。這是我本身的筆記本上面的MySQL。sql

2.慢查詢日誌

在面試的常常被問到sql優化,能夠聊聊慢查詢日誌。(在默認狀況下不會開啓慢查詢日誌)開啓慢查詢日誌後,MySQL會將運行時間超過long_query_time所設置的參數(默認爲10)的全部sql語句都記錄到慢查詢日誌文件中去。數據庫

(1)使用set global slow_query_log=1開啓了慢查詢日誌只對當前數據庫生效,若是MySQL重啓後則會失效。若是要永久生效,就必須修改配置文件。緩存

(2)能夠經過命令SHOW VARIABLES LIKE 'slow_query_log'來查看是否開啓,個人已經開啓了。(以下圖)服務器

(3)能夠經過命令SHOW VARIABLES LIKE 'long_query_time'來查看這個時間閾值(以下圖)。set global long_query_time=1命令設置閾值爲1s。併發

(4)能夠經過命令SHOW VARIABLES LIKE 'slow_query_log_file'來查看慢查詢日誌位置。測試

(5)用本機測試:首先將閾值設置爲1,執行sql語句SELECT * FROM test;用了1s多,而後查詢慢查詢文件已經產生了該條記錄(以下圖) 優化

(6)還有兩個和慢查詢日誌有關的比較重要的參數。一個是log_queries_not_using_indexes,意爲若是運行的sql語句沒有使用索引,則數據庫一樣會將這條sql記錄到慢查詢日誌裏面去;另外一個是log_throttle_queries_not_using_indexes,意爲每分鐘運行記錄到slow log的且未使用索引的sql語句的次數。具體用法和上面相似,首先要開啓相關功能,具體再也不贅述。

後面隨着sql的增多,不可能慢慢查看日誌,而這時MySQL提供了mysqldumpslow命令,能夠很好的幫助咱們解決問題,具體的用法請問度娘。

注意:MySQL數據庫會記錄運行時間超過閾值的全部sql語句,可是運行時間正好等於long_query_time的狀況是不會被記錄下。

3.查詢日誌

查詢日誌記錄了全部對MySQL數據庫的請求信息,無論這些請求是否獲得了正確的執行。默認狀況下,通用查詢日誌不會被啓用,須要本身在配置文件設置,我如今經過命令set global general_log=on;進行啓用查詢日誌(以下圖)。

用本機測試:首先使用了一些查詢語句,發現這些正常的請求,是能夠看到日誌的。又故意輸入錯誤密碼鏈接MySQL,發現查詢日誌甚至記錄了對Access denied的請求(以下圖)。

4.二進制日誌

二進制文件記錄了對MySQL數據庫執行更改的全部操做,可是不包括對數據自己沒有進行修改的操做,如select和show這類操做。雖然如此,可是二進制文件仍是有許多其餘重要的做用。 恢復:某些數據的恢復須要二進制文件; 複製:其原理相似於恢復,經過複製和執行二進制日誌使一臺遠程的MySQL數據庫與另外一臺MySQL數據庫進行實時同步(MySQL主從同步); 審計:用戶能夠經過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。

二進制日誌文件在默認狀況下並無啓動,須要咱們本身配置,經過配置參數log-bin[=name]能夠啓動二進制日誌。(下面所有以個人線上應用爲例,線上爲mysql主從配置)輸入show slave status命令能夠看到以下信息(以下圖)mysql-bin.000001即爲二進制日誌文件。

一些重要的配置文件的參數: (1)max_binlog_size:單個二進制日誌文件的最大值,若是超過了該值,則生成一個新的二進制日誌文件。輸入show VARIABLES like 'max_binlog_size'命令,能夠看出個人配置爲默認1G(以下圖)

(2)binlog_cache_size:當使用事務的表存儲引擎時,全部未提交的二進制日誌會被記錄到一個緩存中去,等該事務提交時纔將緩存中的二進制日誌寫入二進制日誌文件中,而該緩存的大小則由該參數決定。輸入show VARIABLES like 'binlog_cache_size'命令,能夠看出個人配置爲默認32k(以下圖)。那有人會問爲何只有這麼小呢?那是由於該參數是基於會話的,當一個線程開啓一個事務的時候,MySQL會自動分配該參數大小的緩存,若是設置過大,你懂的!

(3)sync_binlog:表示每寫緩存多少次就同步到磁盤裏面去。輸入show VARIABLES like 'sync_binlog'命令,能夠看出個人是採用同步寫磁盤的方式來寫二進制日誌(以下圖)

(4)binlog-do-db、binlog-ignore-db:分別表示須要寫入或者忽略寫入哪些庫的日誌,默認是空的,表示須要同步全部庫的日誌到二進制日誌中去,個人默認也是空的。

(5)log-slave-update:若是當前數據庫是複製中的slave角色,它是不會從master取得並去執行二進制日誌寫入到本身的二進制文件中去。若是要寫,則須要設置log-slave-update,由於我本身的應用配置是採用一主一從的,因此執行show VARIABLES like 'log-slave-update'命令後,是沒有值的(以下圖)

(6)binlog_format:該參數影響了記錄二進制日誌的格式。其有三值,分別爲STATEMENT、ROW、MIXED。 STATEMENT:記錄的是日誌的邏輯sql語句。 ROW:記錄表的行更改狀況。 MIXED:會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也就是在STATEMENT和ROW之間選擇一種。個人配置就採用這個。

注意:①若是設置了ROW,能夠將InnoDB的事務隔離級別設置爲Read-Committed,以得到更好的併發行;②bing_format參數是有存儲引擎的限制,具體的請問度娘;③ROW所產生的二進制文件會比STATEMENT大。


若有描述不對的地方,望指正!

相關文章
相關標籤/搜索