1. 程式人生 > >MySQL都有哪些日誌?分別都代表什麽?

MySQL都有哪些日誌?分別都代表什麽?

mysql日誌

MySQL日誌:主要包含:錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進制日誌、中繼日誌;

日誌是mysql數據庫的重要組成部分。日誌文件中記錄著mysql數據庫運行期間發生的變化;也就是說用來記錄mysql數據庫的客戶端連接狀況、SQL語句的執行情況和錯誤信息等。當數據庫遭到意外的損壞時,可以通過日誌查看文件出錯的原因,並且可以通過日誌文件進行數據恢復。

錯誤日誌

在mysql數據庫中,錯誤日誌功能是默認開啟的。並且,錯誤日誌無法被禁止。默認情況下,錯誤日誌存儲在mysql數據庫的數據文件中。錯誤日誌文件通常的名稱為hostname.err。其中,hostname表示服務器主機名。

默認情況下錯誤日誌大概記錄以下幾個方面的信息:服務器啟動和關閉過程中的信息(未必是錯誤信息,如mysql如何啟動InnoDB的表空間文件的、如何初始化自己的存儲引擎的等等)、服務器運行過程中的錯誤信息、事件調度器運行一個事件時產生的信息、在從服務器上啟動服務器進程時產生的信息。

記錄如下幾類信息:

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

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

(3) event scheduler運行時產生的信息;

(4) 主從復制架構中,從服務器復制線程啟動或關閉時產生的日誌;

日誌存儲位置:

log_error= /var/log/mariadb/mariadb.log | OFF 註:# 給出文件路徑,直接表示on。

log_warnings={ON|OFF} # 把警告的信息也記錄下來,記錄到同一個文件當中

mysql>show global variables like ‘log_error%‘;
mysql>show global variables like ‘log_warnings%‘;
+---------------+------------------------------+
| Variable_name| Value             |
+---------------+------------------------------+
| log_error  | /var/log/mariadb/mariadb.log|
| log_warnings|  1              |
+---------------+------------------------------+

查詢日誌

默認情況下查詢日誌是關閉的。由於查詢日誌會記錄用戶的所有操作,其中還包含增刪查改等信息,在並發操作大的環境下會產生大量的信息從而導致不必要的磁盤IO,會影響mysql的性能的。如若不是為了調試數據庫的目的建議不要開啟查詢日誌。

日誌存儲位置:

文件:file # 自己指定的文件日誌

表:table (mysql.general_log) # 數據庫當聽指定的數據日誌表

desc general_log; # 裏的各個字段的信息

general_log={ON|OFF} # 是否開啟,默認是沒有開啟的

general_log_file=HOSTNAME.log # 如果不手動指定文件路徑的話,會自動在當前的目錄下創建一個以

主機名為文件名的日誌文件 如: general_log_file centos7.log

log_output={FILE|TABLE|NONE} # 日誌是記錄到數據庫當中還是以文件的方式存儲

file: 文件有效,表無效

table: 表有效,文件無效

none: 兩者都無效,就算上面開啟了記錄日誌的功能,也是無效的

mysql>show global variables like ‘log_out%‘;
mysql>show global variables like ‘general%‘;
mysql>set @@global.general_log=on; # 修改全局變量值,也可以修改當前會話的值-->session
mysql>set @@global.log_output=‘table‘;
+------------------+-------------+
| Variable_name  | Value    |
+------------------+-------------+
| general_log   |  OFF    |
| general_log_file| centos7.log|
| log_output   | FILE    |
+------------------+-------------+

慢查詢日誌

慢查詢日誌是用來記錄執行時間超過指定時間的查詢語句。通過慢查詢日誌,可以查找出哪些查詢語句的執行效率很低,以便進行優化。一般建議開啟,它對服務器性能的影響微乎其微,但是可以記錄mysql服務器上執行了很長時間的查詢語句。可以幫助我們定位性能問題的。

慢查詢:運行時間超出指定時長的查詢; # 默認為10s

long_query_time

日誌存儲位置:

文件:FILE

表:TABLE - - > mysql.slog_log

log_slow_queries={ON|OFF} # 是否啟用

slow_query_log={ON|OFF} # 是否啟用,mariadb默認使用 註:會根據版本的不同來指定

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

註:定義過濾器的,如上面,基於管理的、排序、磁盤排序、全連接、查詢等等(默認值)

log_slow_rate_limit

log_slow_verbosity

+-----------------+-----------+
| Variable_name | Value   |
+-----------------+-----------+
| log_output   | FILE    |  
| long_query_time  | 10.000000   |  
| slow_query_log  | OFF     |
| slow_query_log_file  | centos7-slow.log |
| log_slow_queries   | OFF    |                                                                                                       |
| log_slow_rate_limit  | 1    |                                                                                                        |
| log_slow_verbosity  |    
| log_slow_filter    | admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |                                   |
+-----------------+-----------+

事務日誌

事務型存儲引擎innodb用於保證事務特性的日誌文件,存儲引擎在修改表的數據時只需要修改其內存拷貝,再把改修改行為記錄到持久在硬盤上的事務日誌中,而不用每次都將修改的數據本身持久到磁盤。事務日誌采用追加的方式,因此寫日誌的操作是磁盤上一小塊區域內的順序I/O,而不像隨機I/O需要在磁盤的多個地方移動磁頭,所以采用事務日誌的方式相對來說要快得多。事務日誌持久以後,內存中被修改的數據在後臺可以慢慢的刷回到磁盤。目前大多數的存儲引擎都是這樣實現的,我們通常稱之為預寫式日誌,修改數據需要寫兩次磁盤。

如果數據的修改已經記錄到事務日誌並持久化,但數據本身還沒有寫回磁盤,此時系統崩潰,存儲引擎在重啟時能夠自動恢復這部分修改的數據。具有的恢復方式則視存儲引擎而定。

日誌存儲位置:

innodb_log_files_in_group # 至少要有2個

註:在數據庫目錄下 - -> ib_logfile0 、ib_logfile1

innodb_log_group_home_dir

innodb_log_file_size

innodb_mirrored_log_groups

註:能將信息存儲的隨機,變成順序存儲的一個過程(提升了讀寫性能),因為首先全部寫入的事務日誌,然後全部寫入,並不是執行一個事務寫入一次(數據存放的位置基於不固定)。

+---------------------------+---------+
| Variable_name         | Value  |
+---------------------------+---------+
| innodb_log_files_in_group | 2     |
| innodb_log_group_home_dir | ./    |
| innodb_mirrored_log_groups| 1     |
| innodb_log_file_size    | 5242880 |
+---------------------------+---------+

二進制日誌

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

功用:“重放” # 讀語句是不會記錄的

二進制日誌也叫作變更日誌,主要用於記錄修改數據或有可能引起數據改變的mysql語句,並且記錄了語句發生時間、執行時長、操作的數據等等。所以說通過二進制日誌可以查詢mysql數據庫中進行了哪些變化。

二進制日誌中常用的定義格式:

log_bin=/PATH/TO/BIN_LOG_FILE # 最好放在其它目錄、磁盤上,萬一數據庫崩了,還要依靠二進制日誌恢復

session.sql_log_bin={ON|OFF} # 是否開啟二進制日誌文件

max_binlog_size=1073741824 # 單位字節,單個文件最大值,超過自動滾動

sync_binlog={1|0} # 是否做同步(數據從內存同步到磁盤)


binlog_format={STATEMENT|ROW|MIXED}

1、語句(statement):默認的記錄格式;

2、行(row):定義的並非數據本身而是這一行的數據是什麽;

3、混合模式(mixed):交替使用行和語句、由mysql服務器自行判斷。

其中基於行的定義格式數據量會大一些但是可以保證數據的精確性。

示例格式:

# 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 # 默認的都是1

事件的結束位置:end_log_pos 624

事件的類型:Query

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

語句的時間戳與將其寫入二進制日誌文件中的時間差:exec_time=0 # 沒有1秒都為0

錯誤代碼:error_code=0

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

事件內容:BEGIN

mysql>SHOW MASTER|BINARY LOGS;  # 查看所有二進制日誌文件信息
mysql>SHOW MASTER STATUS;      # 查看當前的二進制日誌文件信息(文件、節點位置)
mysql>SHOW BINLOG EVENTS IN ‘bin-log.000002‘;  # 查看某個二進制日誌文件當中詳細信息
[root-xdg]# mysqlbinlog -j 223  bin-log.000002  # bash當中查看二進制日誌命令,文件路徑

中繼日誌

當要使用主-從復制的時候,就要使用到中繼日誌了,它是從主數據庫服務器上記錄下來二進制日誌文件,再同步到自己的數據庫服務器上的中繼日誌文件,然而讀取中繼日誌文當中的內容來進行同步的功能;

主數據庫服務器:會開啟一個dump-thread的進程來響應

從數據庫服務器:會開啟一個io-thread的進程來請求,通過SQL-thread來執行中繼日誌當中的信息同步到本地

日誌存儲位置:

relay_log = /path/filename # 在配置文件當中開啟記錄中繼日誌

server_id = 2 # 主-從配置的時候,分別指定不同的設備名

+-----------------------+----------------+
| Variable_name      | Value       |
+-----------------------+----------------+
| relay_log         | /app/relay-log |
| relay_log_index     |           |
| relay_log_info_file  | relay-log.info |
| relay_log_purge     | ON         |
| relay_log_recovery   | OFF        |
| relay_log_space_limit | 0          |
| server_id           | 2            |
+-----------------------+----------------+


MySQL都有哪些日誌?分別都代表什麽?