數據庫 之 Mysql日誌介紹

1  概述

本文將介紹如下Mysql的六種日誌的相關概念

查詢日誌:general_log

慢查詢日誌:log_slow_queries

錯誤日誌:log_error, log_warnings

二進制日誌:binlog

中繼日誌:relay_log

事務日誌:innodb_log

2  查詢日誌

默認沒有開啓,考慮到數據庫服務器本身佔用存儲IO,所以一般不會使用查詢日誌的功能,防止給mysql造成性能降低

記錄查詢語句,日誌存儲位置:

文件:file

表:table (mysql.general_log),在mysql庫裏

general_log={ON|OFF}:一般日誌,日誌功能的開關

general_log_file=HOSTNAME.log :日誌輸出的位置,有兩個地方,如general_log_file指定的文件,還有下面的TABLE,

log_output={FILE|TABLE|NONE},啓動general_log的時候,還要指定log_output爲file或者table,如果定義爲file,則general_log這張表就沒用了,如果要兩者都記錄,就定義爲file,table,如果不記錄日誌,就設定爲none,即使是設定爲on,也指定了log的路徑,也不會記錄日誌,默認爲file.

默認情況下,日誌文件是當前主機名.log(注意,需要本機反向解析ip可以得到主機名才能爲當前主機名,否則默認爲localhost.log),沒有session級別的參數,只有全局級別,查看如下

MariaDB [mysql]> show global variables like 'general%';

在global級別修改,但是該參數不支持session級別,所以參數也可以立即生效,設置如下

MariaDB [mysql]> set @@global.general_log=on;

開啓後,在數據庫中執行相關操作後,日誌文件在當前主機名.log下,如這裏是CentOS7A.log,如果是日誌文件是相對路徑,則默認該日誌在數據目錄下,即/var/lib/mysql/下面,這裏的文件是/var/lib/mysql/CentOS7A.log,該文件有數據庫操作的詳細記錄 ,查看如下

cat  /var/lib/mysql/CentOS7A.log

改成TABLE類型,所有的日誌都會被記錄在mysql.general_log這張表裏,文件/var/lib/mysql/CentOS7A.log將不再記錄

MariaDB [mysql]> set @@global.log_output='table';

3  慢查詢日誌

慢查詢:運行時間超出指定時長的查詢,一般是指long_query_time指定的時長;

long_query_time:長時間的執行時間,默認單位是秒,默認是10s

查看變量可以有以下兩種方法進行查看

MariaDB [mysql]> show global variables like 'long%';

MariaDB [mysql]> select @@global.long_query_time;

不是被其他語句阻塞或者是語句本身查詢時間很長,查詢很慢,需要啓用慢查詢來記錄,這個一般要啓用,用來分析系統的相關問題,如網頁打開慢的問題

存儲位置:

文件:FILE

表:TABLE,mysql.slog_log

log_slow_queries={ON|OFF}:啓用慢查詢,slow_query_log和是啓用慢查詢,不同mysql版本里啓用的參數可能不一樣,可能同時存在兩個參數,如果要確保可以記錄,建議這兩個參數都啓用

slow_query_log={ON|OFF}

slow_query_log_file=

log_output={FILE|TABLE|NONE}

log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk:這裏定義的條件的查詢超過10s才記錄到慢查詢日誌。這些一般是語句本身慢導致的

log_slow_rate_limit

log_slow_verbosity

慢查詢的啓用,注意,該log不會記錄所有的操作,只記錄log_slow_filter字段定義的條件,記錄的日誌在/var/lib/mysql/CentOS7A-slow.log

MariaDB [mysql]> set @@global.slow_query_log=ON;

啓用 slow_query_log    bool型值不需要加引號,如ON或off

以上的定義是臨時有效的,全局的參數重啓mysql後失效,會話級別的關閉session就會失效,要長期有效,需要配置到配置文件裏

4  錯誤日誌

記錄如下四類信息:包括三種非錯誤的日誌,如下

(1) mysqld啓動和關閉過程中輸出的信息; 

(2) mysqld運行中產生的錯誤信息; 

(3) event scheduler運行時產生的信息;#相當於是mysql內部的週期計劃,和系統crontab一樣的效果的計劃

(4) 主從複製架構中,從服務器複製線程啓動時產生的日誌;

log_error=

/var/log/mariadb/mariadb.log|OFF #指定文件路徑,即表示ON,如果不啓用log_error,就直接用OFF來設定

log_warnings={ON|OFF}:#ON表示是否將warning級別的日誌記錄到log_error裏面

通過rpm安裝的mysql,默認會啓用error日誌,解壓的方式安裝可能沒有啓用,一般是要啓用錯誤日誌功能。

MariaDB [mysql]> select @@global.log_error;

5  二進制日誌

服務器級別,跟引擎沒關係,只能改配置參數才能生效,但是支持在會話級別指定關閉或者生效,一般不關閉該功能,只有要使用重放的時候,即做恢復的時候,才關閉該功能。需要在配置文件中修改纔會生效。但是可以在會話級控制是否要記錄對應的會話的二進制文件log

mysql運行過程中的修改類操作(引起數據改變,或者可能會引起數據改變的操作),未保存前,會記錄到這裏的二進制文件,服務器級別,跟引擎無關,二進制文件,不能使用cat等文本工具來查看,可能會導致文件被破壞,因爲被保存未二進制格式,每一次的記錄被保存未event,event根據位置來記錄(根據偏移量決定 ,如第一個事件0--16,但是,最後的16是第一個事件的結束,沒有被第一個事件暫用,是第二個事件的開始,如第二個事件爲 16--36,這裏36是第三個事件開始),這裏用二進制編碼來記錄,作用是可以精確到用字節來記錄來記錄每一個事件的起始和結束位置

作爲記錄事件,要記錄事件發生的時間和操作

二進制日誌文件,作用是用來重放,當系統崩潰的時候,可以用來恢復系統用,建議將該日誌放在獨立的位置,用絕對日誌,同時確保mysql用戶有讀寫權限。需要修改配置文件才生效

二進制日誌記錄有三種格式

binlog_format={STATEMENT|ROW|MIXED}

STATEMENT:語句,即記錄操作命令

ROW:行;

MIXED:混編;

用於記錄引起數據改變或存在引起數據改變的潛在可能性的語句(STATEMENT)或改變後的結果(ROW),也可能是二者混合;

記錄行得到更精確的結果,但是量比較大,記錄“語句”相對輕量,如果定義問MIXED,則系統會自行決定用語句或者行的格式來記錄。 默認實時statement

注意,如執行某個語句時,插入的字段是由函數執行生成,如now()函數,時間每次執行都會不一樣,下次重新執行,結果是不一樣的。所以記錄的是執行結果,使得重新執行時,結果一樣。這種記錄方式成爲記錄row

查看當前的格式如下:

MariaDB [mysql]> show global variables like 'binlog_format';

服務器變量:

log_bin=/PATH/TO/BIN_LOG_FILE

只讀變量;建議不使用數據目錄,即/var/lib/mysql,因爲二進制日誌是將來用來恢復數據的方法,很重要,如果二進制日誌和數據目錄放在同一磁盤,將來一旦磁盤故障,所有的內容都丟失就不能恢復了,因此建議另外設定路徑

例子:創建兩個目錄,將數據和log分開,分別掛載在不同的磁盤上,並更改數組和屬主,修改配置文件,指定路徑

[root@CentOS7A mysql]#mkdir -pv /mydata/{data,log}

[root@CentOS7A mysql]#chown -R mysql.mysql /mydata/*

[root@CentOS7A mysql]#vim /etc/my.cnf.d/server.cnf 

log_bin = /mydata/log/master-log#定義日誌文件不能加後綴

保存退出後重啓mysql服務

[root@CentOS7A mysql]#systemctl restart mariadb

在路徑 /mydata/log下會生成一個二進制的文件master-log.000001,該二進制文件會進行滾動,重啓服務或者用flush logs命令都會進行滾動,文件後綴名會自動變更。該路徑下還有一個文件master-log.index,該索引不是數據索引,而是日誌文件索引,文本格式,如當master-log.000001這種文件很多時,mysql識別的文件是記錄在master-log.index這個裏面的。

master-log.000001是二進制文件,不能用cat等文本查看工具直接查看,查看二進制文件master-log.000001的方法如下

到mysql裏

查看有多少個二進制文件,如下,該命令和直接查看master-log.index內容一樣

MariaDB [sunny]> show binary logs;

+-------------------+-----------+

| Log_name          | File_size |

+-------------------+-----------+

| master-log.000001 |       245 |

+-------------------+-----------+

1 row in set (0.00 sec)

手動滾動日誌,可以用如下命令

MariaDB [sunny]> flush logs;

查看二進制日誌文件列表:

SHOW MASTER|BINARY LOGS;

MariaDB [sunny]> show master logs;

MariaDB [sunny]> show binary logs;

查看當前正在使用的二進制日誌文件:

SHOW MASTER STATUS;

查看當前正在使用的二進制文件,Position指當前寫到哪個字節的位置,一般不是從0開始,因爲該日誌有自我描述信息,即文件頭,記錄當然日誌文件是哪個版本,兼容哪些版本等等,默認是從245的位置開始

MariaDB [sunny]> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-log.000003 |      245 |              |                  |

+-------------------+----------+--------------+------------------+

查看二進制 日誌文件中的事件:

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

查看二進制文件記錄的內容, Pos是開始位置,End_log_pos是結束位置, Event_type事件類型,Info 事件描述信息,信息中, xid=16是mysql記錄的標識符

,Server_id是記錄服務器的唯一信息,如果不做協同工作,默認id是1,同一集羣中id號不能相同,需要手動修改該參數,

MariaDB [sunny]> show binlog events in 'master-log.000003';

+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------+

| Log_name          | Pos | Event_type  | Server_id | End_log_pos | Info                                            |

+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------+

| master-log.000003 |   4 | Format_desc |         1 |         245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4       |

| master-log.000003 | 245 | Query       |         1 |         314 | BEGIN                                           |

| master-log.000003 | 314 | Query       |         1 |         412 | use `sunny`; delete from students where id=1001 |

| master-log.000003 | 412 | Xid         |         1 |         439 | COMMIT /* xid=15 */                             |

+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------+

4 rows in set (0.00 sec)

從指定的位置開始查看log,該位置值必須是起始位置,不能是中間的任意數

MariaDB [sunny]> show binlog events in 'master-log.000003' from 314;

從指定的位置開始查看log,偏移2行

MariaDB [sunny]> show binlog events in 'master-log.000003' from 245 limit 2;

session.sql_log_bin={ON|OFF}

控制某會話中的“寫”操作語句是否會被記錄於日誌文件中;

關閉語句如下,之後該session的記錄將不會被記錄到二進制文件中,建議不要關閉,只在重放的時候才關閉該功能

MariaDB [sunny]> set @@session.sql_log_bin=off;

max_binlog_size=1073741824 #寫入配置文件,定義二進制文件的最大值,單位是字節byte,1073741824爲1G,但是文件實際大小可能不精準,超過這個值就滾動,文件可能不會精準到這個值後滾動,大小會相差一點點。

sync_binlog={1|0} #把日誌從內存同步到硬盤,一般是緩存在內存區,一段時間後在同步到硬盤,這個好處是效率高,但是有可能會導致異常情況數據還在內存中而丟失。這裏有個極端的情況是,如果丟失的數據是commint,這樣數據就恢復不了,這裏如果設置爲1,就是當前操作是commit,就馬上記錄到磁盤裏,數據重放更安全,但是性能會降低,需要根據實際情況而決定要不要開啓功能

mysqlbinlog:#這個命令行工具的主要作用就是用來查看日誌的內容,一般開始的245字節是文件的文件頭,信息都是在這文件頭之後,一般信息都有特定格式記錄,第一個# at開頭之前的爲頭部信息,每一個事件的操作記錄以# at開頭 ,以 end_log_poss結束。一般增刪改查操作都是要先查詢,所以都是Query。小於1s的執行時間exec_time都記錄爲0.error_code如果沒有錯誤都是0。每一個連接就是一個線程thread_id。

相關選項:

--start-datetime=

 --stop-datetime=

注意這裏時間格式是:YYYY-MM-DD hh:mm:ss

例子:

[root@CentOS7A log]#mysqlbinlog /mydata/log/master-log.000003 --start-datetime="2018-01-14 11:27:41"

 -j, --start-position=#表示從哪個位置開始

  --stop-position=#到哪個位置結束

例子:從哪個位置開始查看

[root@CentOS7A log]#mysqlbinlog /mydata/log/master-log.000001 -j 314

 --user, --host, --password

該命令是客戶端命令,可以被遠程執行,注意文件不能加引號

,但是,測試時,提示文件不存在

[root@CentOS7E ~]#mysqlbinlog -uroot -pPass123456 -h 192.168.1.71 /mydata/log/master-log.000001

例子:不加選項

[root@CentOS7A log]#mysqlbinlog /mydata/log/master-log.000001

附上二進制日誌事件格式:

# at 553

#160831  9:56:08 server id 1  end_log_pos 624   Query   thread_id=2     exec_time=0     error_code=0

SET TIMESTAMP=1472608568/*!*/;

BEGIN

/*!*/;

事件的起始位置:# at 553

事件發生的日期時間:#160831  9:56:08

事件發生的服務器id:server id 1

事件的結束位置:end_log_pos 624

事件的類型:Query

事件發生時所在服務器執行此事件的線程的ID: thread_id=2 

語句的時間戳與將其寫入二進制日誌文件中的時間差:exec_time=0

錯誤代碼:error_code=0

設定事件發生時的時間戳:SET TIMESTAMP=1472608568/*!*/;

事件內容:BEGIN

6  中繼日誌

從服務器上記錄下來從主服務器的二進制日誌文件同步過來的事件;是mysql主從複製時,二進制是主服務器上記錄的日誌,從服務器上通過中繼日誌,從服務器在本地進行重放,得到一樣的二進制文件。使得主從複製一樣。

二進制日誌還有另一個作用是能做時間點還原,不一定要用於主從複製,這個恢復手段很有效,因爲即使是備份操作,當備份沒有備份的時間開始到系統崩潰的時間段,可以用這個二進制日誌基於時間來恢復沒有備份的時間段的數據的恢復。

7  事務日誌

事務型存儲引擎innodb用於保證事務特性的日誌文件:

redo log 

undo log


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章