天天看點

mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點

mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點
mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點

   閱讀本文約需要7分鐘 

大家好,我是你們的導師,我每天都會在這裡給大家分享一些幹貨内容(當然了,周末也要允許老師休息一下哈)。上次老師跟大家分享了下基于Springboot + aop + Lua 的Redis 分布式限流器的相關知識,今天跟大家分享MySQL 日志檔案開發必備的知識點的知識。

1 MySQL 日志檔案開發必備的知識點

參考來源:juejin.im/post/5b7c0aabf265da438415b9eb
           

前言

日志檔案記錄了影響MySQL資料庫的各種類型活動,MySQL資料庫中常見的日志檔案有錯誤日志,二進制日志,慢查詢日志和查詢日志。下面分别對他們進行介紹。

錯誤日志

錯誤日志檔案對MySQL的啟動,運作,關閉過程進行了記錄。

'log_error';
           

可以看到錯誤日志的路徑和檔案名,預設情況下錯誤檔案的檔案名為伺服器的主機名,即:hostname.err。隻不過我這裡設定的是/var/log/mysqld.log,修改錯誤日志位址可以在/etc/my.cnf中添加

# Recommended in standard MySQL setup
           

當出現MySQL資料庫不能正常啟動時,第一個必須查找的檔案就是錯誤日志檔案,該檔案記錄了出錯資訊,能夠幫助我們找到問題。

慢查詢日志

慢查詢日志用來記錄響應時間超過門檻值的SQL語句,是以我們可以設定一個門檻值,将運作時間超過該值的所有SQL語句都記錄到慢查詢日志檔案中。該門檻值可以通過參數 long_query_time 來設定,預設為10秒。

啟動慢查詢日志

預設情況下,MySQL資料庫并不啟動慢查詢日志,需要手動将這個參數設為ON,然後啟動

"%slow%";
           

但是使用 set global slow_query_log='ON' 開啟慢查詢日志,隻是對目前資料庫有效,如果MySQL資料庫重新開機後就會失效。是以如果要永久生效,就要修改配置檔案 my.cnf (其他系統變量也是如此),如下:

[mysqld]
           

然後重新開機MySQL就可以讓慢查詢日志記錄開啟了,至于日志檔案的路徑就是上面slow_query_log_file對應的路徑。

設定門檻值

'long_query_time';
           

門檻值預設為10秒,我們可以修改門檻值大小,比如(當然這還是對目前資料庫有效):

set 
           

設定long_query_time這個門檻值之後,MySQL資料庫會記錄運作時間超過該值的所有SQL語句,但對于運作時間正好等于 long_query_time 的情況,并不會被記錄下。而設定 long_query_time為0來捕獲所有的查詢

參數log_queries_not_using_indexes

另一個和慢查詢日志有關的參數是 log_queries_not_using_indexes,

如果運作的SQL語句沒有使用索引,則MySQL資料庫同樣會将這條SQL語句記錄到慢查詢日志檔案。首先确認打開了log_queries_not_using_indexes;

'log_queries_not_using_indexes';
           

例子,沒有用到索引進行查詢:

323;
           

可以看到是進行了全表掃描;然後去log日志檔案中檢視這條SQL已經被标記為慢SQL,因為它沒有使用索引。

# Time: 180817 11:42:59
           

将日志記錄放入表中

MySQL5.1開始可以将慢查詢的日志記錄放入一張表中,在mysql資料庫下,名為slow_log

CREATE 
           

參數log_output指定了慢查詢輸出的格式,預設為file,可以将它設定成table,将變成了上面的slow_log中

"log_output";
           

但是多數情況下這樣做沒什麼必要,這不但對性能有較大影響,而且 MySQL 5.1 在将慢查詢記錄到檔案中時已經支援微秒級别的資訊,然而将慢查詢記錄到表中會導緻時間粒度退化為隻能到秒級,而秒級别的慢查詢日志沒有太大的意義

慢查詢日志分析工具

mysqldumpslow指令

當越來越多的SQL查詢被記錄到慢查詢日志檔案中,這時候直接看日志檔案就不容易了,MySQL提供了mysqldumpslow 指令解決:

# mysqldumpslow iz2zeaf3cg1099kiidi06mz-slow.log
           

更多關于 mysqldumpslow 指令的介紹,請參閱 :

mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點
https://github.com/luisedware/Archives/issues/7

pt-query-digest 工具

pt-query-digest 是分析MySQL查詢日志最有力的工具,該工具功能強大,它可以分析binlog,Generallog,slowlog,也可以通過show processlist或者通過 tcpdump 抓取的MySQL協定資料來進行分析,比 mysqldumpslow 更具體,更完善。以下是使用pt-query-digest的示例:

//直接分析慢查詢檔案
           

該工具可以将查詢的剖析報告列印出來,可以分析結果輸出到檔案中,分析過程是先對查詢語句的條件進行參數化,然後對參數化以後的查詢進行分組統計,統計出各查詢的執行時間,次數,占比等,可以借助分析結果找出問題進行優化。

更多關于pt-query-digest的安裝與使用,請參閱 :

www.ywnds.com/?p=8179

查詢日志

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

"general_log%";
           

預設情況下不啟動查詢日志,必須要先開啟。

set 
           

二進制日志

二進制日志記錄了對資料庫執行更改的所有操作,但是不包括select和show這類操作,因為這類操作對資料本身并沒有修改,如果你還想記錄select和show操作,那隻能使用查詢日志了,而不是二進制日志。

此外,二進制還包括了執行資料庫更改操作的時間和執行時間等資訊。二進制日志主要有以下幾種作用:

  • 恢複(recovery):某些資料的恢複需要二進制日志,如當一個資料庫全備檔案恢複後,我們可以通過二進制的日志進行 point-in-time的恢複
  • 複制(replication) : 通過複制和執行二進制日志使得一台遠端的 MySQL 資料庫(一般是slave 或者 standby) 與一台MySQL資料庫(一般為master或者primary) 進行實時同步
  • 審計(audit):使用者可以通過二進制日志中的資訊來進行審計,判斷是否有對資料庫進行注入攻擊

開啟二進制日志

通過配置參數 log-bin[=name] 可以啟動二進制日志。如果不指定name,則預設二進制日志檔案名為主機名,字尾名為二進制日志的序列号

'datadir';
           

mysqld-bin.000001即為二進制日志檔案,而mysqld-bin.index為二進制的索引檔案,為了管理所有的binlog檔案,MySQL額外建立了一個index檔案,它按順序記錄了MySQL使用的所有binlog檔案。如果你想自定義index檔案的名稱,可以設定 log_bin_index=file參數。

-rw-rw---- 1 
           

檢視二進制日志檔案

對于二進制日志檔案來說,不像錯誤日志檔案,慢查詢日志檔案那樣用cat,head, tail等指令可以檢視,它需要通過 MySQL 提供的工具 mysqlbinlog。如:

# mysqlbinlog mysqld-bin.000001
           

二進制日志檔案配置參數

下面比較簡要介紹下二進制日志檔案幾個重要的配置參數

max_binlog_size

可以通過max_binlog_size參數來限定單個binlog檔案的大小(預設1G)

binlog_cache_size

當使用事務的表存儲引擎(如InnoDB存儲引擎)時,所有未送出(uncommitted)的二進制日志會被記錄到一個緩沖中去,等該事務送出(committed)時,直接将緩存中的二進制日志寫入二進制日志檔案中,而該緩沖的大小由binlog_cache_size決定,預設大小為32K。

此外,binlog_cache_size 是基于會話(session)的,當每一個線程開啟一個事務時,MySQL會自動配置設定一個大小為 binlog_cache_size 的緩存

'binlog_cache_size';
           

sync_binlog

在預設情況下,二進制日志并不是在每次寫的時候同步到磁盤。參數 sync_binlog = [N] 表示每寫緩沖多少次就同步到磁盤。如果将N設定為1,即 sync_binlog = 1表示采用同步寫磁盤的方式來寫二進制日志,這時寫操作就不用向上面所說的使用作業系統的緩沖來寫二進制日志

binlog_format

binlog_format 參數十分重要,它影響了記錄二進制日志的格式,分為三種格式:

1、statement : 記錄的是日志的邏輯SQL語句

2、row: 記錄表的行更改情況

3、mixed: 在此格式下,mysql預設采用statement格式進行二進制日志檔案的記錄,但是有些情況下使用ROW格式,有以下幾種情況:

  • 表的存儲引擎為NDB,這時對表的DML操作都會以ROW格式記錄。
  • 使用了UUID()、USER()、CURRENT_USER()、FOUND_ROW()、ROW_COUNT()等不确定函數。
  • 使用了INSERT DELAY語句。
  • 使用了使用者定義函數(UDF)。
  • 使用了臨時表(temporary table)。
參考https://book.douban.com/subject/24708143/http://search.dangdang.com/?key=%E9%AB%98%E6%80%A7%E8%83%BDMySQL
           

今天就分享這麼多,關于MySQL 日志檔案開發必備的知識點,你學會了多少?歡迎在留言區評論,對于有價值的留言,我們都會一一回複的。如果覺得文章對你有一丢丢幫助,請點右下角【在看】,讓更多人看到該文章。

mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點
mysql 建立表格time類型_MySQL 日志檔案開發必備的知識點