MySQL日誌體系介紹

2021-09-01 12:29:07 字數 3947 閱讀 2293

mysql提供了幾種日誌功能,如下:

日誌型別

作用error log

記錄mysqld在啟動、關閉、執行時出現的錯誤、告警等

general query log

記錄mysql執行的所有sql

binary log

資料庫變更記錄,類似乙個賬本,記著流水賬

relay log

只在從庫存在,內容就是主庫的binlog

slow query log

慢查詢日誌

ddl log

ddl操作日誌

預設情況下,

1.以上的日誌功能都是關閉的(ddl log除外,這種日誌是自動生成的,不能干預);

2.如果沒有特別指定,所有開啟的日誌功能,輸出資訊都寫在資料庫資料目錄下。

一、error log

錯誤日誌會在mysql啟動和關閉的時候記錄相關資訊。它包含如error,warnings,note等診斷資訊。例如當mysqld程序異常終止時,mysqld_safe會自動將其拉起,並在錯誤日誌裡記錄相關資訊。

linux下是用–log-error指定將資訊定向到標準輸出還是檔案中。

如果–log-error沒指定,mysqld會將錯誤資訊輸出到標準輸出;

除非–log-error指定絕對路徑和檔名,否則會將錯誤資訊輸出到資料目錄下的host_name.err檔案。

–log-error可以在啟動資料庫時命令列指定,也可以在my.cnf檔案中[mysqld],[server]或[mysqld_safe]中指定。

同時,可以通過sys_log選項,將錯誤日誌輸出到syslog中。

二、binary log

簡稱binlog,用事件(event)的方式來記錄資料庫的變更過程。binlog會記錄那些有可能會更改資料的sql,或者以資料行的方式去記錄,例如一條delete語句,雖然可能刪除了0行,但binlog中還是會有記錄。但select或show等不導致資料變更的操作不會記錄。開啟binlog會使得資料庫效能輕微地下降,但是其所帶來的功能,是絕對物超所值的。

binlog有兩個重要的作用:

1.在主從複製中,從庫通過應用主庫的binlog來達成同步;

2.在備份恢復中,通過binlog來完成指定時間點的不完整恢復。

binlog通過–log-bin引數開啟或指定具體路徑,預設名稱是pid-file選項內容,預設路徑是資料目錄。–log-bin引數如果指定了.xx之類的字尾,會被忽略,而在實際生成時,mysql會自動在–log-bin之後加上遞增的數字字尾。

在mysql重啟或執行flush logs時,會自動生產新的binlog,字尾加一。一般情況下,binlog檔案大小不會超過max_binlog_size,但如果有乙個大事務,在檔案達到max_binlog_size時還沒寫完,則檔案會擴充套件至能寫完這個事務為止。

跟binlog成雙成對的還有乙個檔案,名稱是binlog+.index字尾,裡面記錄這當前的所有binlog。

不要手動rm binlog,mysql有專門的語法去清理。如果想一次性清理全部binlog,可以使用reset master,但要注意檢查當前從庫是否已經抓取了所有binlog。也可以利用purge binary log to ''的方式,將binlog清理至指定的檔案或日誌。

binlog是二進位制格式的,可以利用mysqlbinlog工具檢視其內容。常用命令為

mysqlbinlog --no-defaults -v mysql-bin.00001

詳細用法可–help檢視幫助。

前面說到binlog可以用來進行時間點的不完整恢復,大致用法如下

mysqlbinlog mysql-bin.00001|mysql -u -p

binlog與事務:

在事務執行完成,鎖釋放或事務提交前,要先完成binlog的寫入。對於非事務性表的操作,執行完成後立即寫入binlog。所以在乙個事務中,如果混合了事務表和非事務表,在事務異常需要回滾時,由於非事務表不能回滾,會導致資料的不一致。

在乙個事務提交前,事務的binlog會先快取在binlog cache buffer裡,在完成提交前再將整個事務的binlog刷入檔案。

binlog不得不說的乙個關鍵點是binlog_format:

1.statement,語句格式,即binlog中直接記錄執行的sql語句;

2.row,行格式,binlog中記錄的是資料行所發生的變化,例如乙個update語句更新一百行資料,那麼binlog中將記錄那一百行資料的變化,而不是那條update語句;

3.mixed,混合格式,即以上兩種格式的混合,一般情況下是statement格式,在一定的條件下會自動轉變為row格式。

statement格式的優點是節省空間,缺點是存在不確定因素;row格式的優點是精準的記錄資料變化,缺點是耗費空間。例如一條update語句更新了一百萬行資料,那麼statement格式只需記錄一條sql,而row格式就要記錄一百萬行資料的變化。但考慮一種情況,sql是update tb set time=now() where id=10,那麼以statement格式記錄的binlog在一段時間之後用來搭建從庫或者做恢復,那麼now()就是當前的時間了,也就造成了資料的不可還原;而如果是row格式的binlog,由於記錄的是資料行的變化,所以不受時間函式的影響。

一般情況下都推薦使用row格式,極少數情況根據實際而定。

設定binlog格式語句如下:

set global binlog_format=『row|statement|mixed』;

三、general query log

全域性查詢日誌記錄所有mysql執行的命令,包括使用者連線/斷開在內的所有客戶端傳送過來的命令。

mysqld會按照接收命令的順序原樣記錄在全域性查詢日誌中,這個順序可能跟執行的順序不太一樣,所以跟binlog裡的sql順序也是有區別的。

需要注意的是,當binlog_format是row時,由於更新語句的記錄都是資料行的格式,所以這些更新操作是不會記錄到查詢日誌裡的。當binlog_format是mixed時同理。

開啟general log:

set global general_log=1;

set global general_log_file=file_path;

關閉general log:

set global general_log=0;

四、slow query log

慢查詢日誌,顧名思義就是記錄慢查詢的sql了。引數long_query_time設定慢查詢閾值,min_examined_row_limit設定檢索資料的條目,乙個sql兩個指標都超過了就會記錄在慢查詢日誌裡。

開啟/關閉慢查詢的方式:

–slow_query_log=0|1

–slow_query_log_file=file-name

general query log和slow query log都可以通過–log-output=table|file來指定日誌存放在庫表還是檔案中,可以用逗號隔開同時採用兩種方式。

慢查詢還可以監控沒使用到索引的sql,通過log_queries_not_using_indexes開啟。但可能這樣的sql會非常多,很容易就導致磁碟空間爆滿,那麼可以通過log_throttle_queries_not_using_indexes來設定一分鐘內記錄多少個沒使用索引的sql。

五、ddl log

ddl日誌,記錄由ddl操作產生的元資料操作,例如drop table和alter table,如果這些操作發生異常終端,mysql利用ddl 日誌來進行恢復。

ddl日誌記錄在資料目錄的ddl_log.log,內容是二進位制格式的,不要對其進行人工編輯。

ddl日誌在大部分正常執行的情況下是不會出現的,只有在需要用來記錄一些元資料操作的時候才會產生,而且在mysql啟動後,會自動清理ddl日誌。

需要注意的是,ddl日誌最大只能達到4gb,如果達到上限,需要將其清理後,才能繼續進行ddl操作。

mysql 的許可權體系介紹

全域性層級 全域性許可權適用於乙個給定伺服器中的所有資料庫。這些許可權儲存在mysql.user表中。grant all on 和revoke all on 只授予和撤銷全域性許可權。資料庫層級 資料庫許可權適用於乙個給定資料庫中的所有目標。這些許可權儲存在mysql.db和mysql.host表中...

Mysql 日誌檔案介紹

mysql提供了一下幾組日誌,用來幫助你找出mysqld 內部出現的原因 日誌檔案 計入日誌檔案中的內容 錯誤日誌 記錄啟動 執行或停止mysqld時出現的問題。查詢日誌 記錄建立的客戶端連線和執行的語句。二進位制日誌 記錄所有更改資料的語句。還用於複製。慢查詢日誌 記錄所有執行時間超過 long ...

MySQL相關日誌介紹

錯誤日誌 log error 查詢日誌 query log 二進位制日誌 binary log 2.相關日誌的作用 1 錯誤日誌 error log 記錄mysql服務程序mysql在啟動 關閉或者執行過程中遇到的錯誤訊息.是工作中排查錯誤的重要工具.2 查詢日誌 query log 1 普通查詢日...