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 # 如果不手動指定文件路徑的話,會自動在當前的目錄下創建一個以
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都有哪些日誌?分別都代表什麽?