您好,登錄后才能下訂單哦!
本文主要給大家簡單講講Mysql的主要日志有哪些,相關專業術語大家可以上網查查或者找一些相關書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望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
Mysql的主要日志有哪些就先給大家講到這里,對于其它相關問題大家想要了解的可以持續關注我們的行業資訊。我們的板塊內容每天都會捕捉一些行業新聞及專業知識分享給大家的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。