專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)萊蕪免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
本文主要給大家簡單講講MySQL的主要日志有哪些,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望Mysql的主要日志有哪些這篇文章可以給大家?guī)硪恍嶋H幫助。
1 概述
本文將介紹如下Mysql的六種日志的相關(guān)概念
查詢?nèi)罩荆篻eneral_log
慢查詢?nèi)罩荆簂og_slow_queries
錯誤日志:log_error, log_warnings
二進制日志:binlog
中繼日志:relay_log
事務(wù)日志:innodb_log
2 查詢?nèi)罩?/p>
默認沒有開啟,考慮到數(shù)據(jù)庫云服務(wù)器本身占用存儲IO,所以一般不會使用查詢?nèi)罩镜墓δ?,防止給mysql造成性能降低
記錄查詢語句,日志存儲位置:
文件:file
表:table (mysql.general_log),在mysql庫里
general_log={ON|OFF}:一般日志,日志功能的開關(guān)
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,如果不記錄日志,就設(shè)定為none,即使是設(shè)定為on,也指定了log的路徑,也不會記錄日志,默認為file.
默認情況下,日志文件是當前主機名.log(注意,需要本機反向解析ip可以得到主機名才能為當前主機名,否則默認為localhost.log),沒有session級別的參數(shù),只有全局級別,查看如下
MariaDB [mysql]> show global variables like 'general%';
在global級別修改,但是該參數(shù)不支持session級別,所以參數(shù)也可以立即生效,設(shè)置如下
MariaDB [mysql]> set @@global.general_log=on;
開啟后,在數(shù)據(jù)庫中執(zhí)行相關(guān)操作后,日志文件在當前主機名.log下,如這里是CentOS7A.log,如果是日志文件是相對路徑,則默認該日志在數(shù)據(jù)目錄下,即/var/lib/mysql/下面,這里的文件是/var/lib/mysql/CentOS7A.log,該文件有數(shù)據(jù)庫操作的詳細記錄 ,查看如下
cat /var/lib/mysql/CentOS7A.log
改成TABLE類型,所有的日志都會被記錄在mysql.general_log這張表里,文件/var/lib/mysql/CentOS7A.log將不再記錄
MariaDB [mysql]> set @@global.log_output='table';
3 慢查詢?nèi)罩?/p>
慢查詢:運行時間超出指定時長的查詢,一般是指long_query_time指定的時長;
long_query_time:長時間的執(zhí)行時間,默認單位是秒,默認是10s
查看變量可以有以下兩種方法進行查看
MariaDB [mysql]> show global variables like 'long%';
MariaDB [mysql]> select @@global.long_query_time;
不是被其他語句阻塞或者是語句本身查詢時間很長,查詢很慢,需要啟用慢查詢來記錄,這個一般要啟用,用來分析系統(tǒng)的相關(guān)問題,如網(wǎng)頁打開慢的問題
存儲位置:
文件:FILE
表:TABLE,mysql.slog_log
log_slow_queries={ON|OFF}:啟用慢查詢,slow_query_log和是啟用慢查詢,不同mysql版本里啟用的參數(shù)可能不一樣,可能同時存在兩個參數(shù),如果要確??梢杂涗?建議這兩個參數(shù)都啟用
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才記錄到慢查詢?nèi)罩尽_@些一般是語句本身慢導(dǎo)致的
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
以上的定義是臨時有效的,全局的參數(shù)重啟mysql后失效,會話級別的關(guān)閉session就會失效,要長期有效,需要配置到配置文件里
4 錯誤日志
記錄如下四類信息:包括三種非錯誤的日志,如下
(1) mysqld啟動和關(guān)閉過程中輸出的信息;
(2) mysqld運行中產(chǎn)生的錯誤信息;
(3) event scheduler運行時產(chǎn)生的信息;#相當于是mysql內(nèi)部的周期計劃,和系統(tǒng)crontab一樣的效果的計劃
(4) 主從復(fù)制架構(gòu)中,從云服務(wù)器復(fù)制線程啟動時產(chǎn)生的日志;
log_error=
/var/log/mariadb/mariadb.log|OFF #指定文件路徑,即表示ON,如果不啟用log_error,就直接用OFF來設(shè)定
log_warnings={ON|OFF}:#ON表示是否將warning級別的日志記錄到log_error里面
通過rpm安裝的mysql,默認會啟用error日志,解壓的方式安裝可能沒有啟用,一般是要啟用錯誤日志功能。
MariaDB [mysql]> select @@global.log_error;
5 二進制日志
云服務(wù)器級別,跟引擎沒關(guān)系,只能改配置參數(shù)才能生效,但是支持在會話級別指定關(guān)閉或者生效,一般不關(guān)閉該功能,只有要使用重放的時候,即做恢復(fù)的時候,才關(guān)閉該功能。需要在配置文件中修改才會生效。但是可以在會話級控制是否要記錄對應(yīng)的會話的二進制文件log
mysql運行過程中的修改類操作(引起數(shù)據(jù)改變,或者可能會引起數(shù)據(jù)改變的操作),未保存前,會記錄到這里的二進制文件,云服務(wù)器級別,跟引擎無關(guān),二進制文件,不能使用cat等文本工具來查看,可能會導(dǎo)致文件被破壞,因為被保存未二進制格式,每一次的記錄被保存未event,event根據(jù)位置來記錄(根據(jù)偏移量決定 ,如第一個事件0--16,但是,最后的16是第一個事件的結(jié)束,沒有被第一個事件暫用,是第二個事件的開始,如第二個事件為 16--36,這里36是第三個事件開始),這里用二進制編碼來記錄,作用是可以精確到用字節(jié)來記錄來記錄每一個事件的起始和結(jié)束位置
作為記錄事件,要記錄事件發(fā)生的時間和操作
二進制日志文件,作用是用來重放,當系統(tǒng)崩潰的時候,可以用來恢復(fù)系統(tǒng)用,建議將該日志放在獨立的位置,用絕對日志,同時確保mysql用戶有讀寫權(quán)限。需要修改配置文件才生效
二進制日志記錄有三種格式
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句,即記錄操作命令
ROW:行;
MIXED:混編;
用于記錄引起數(shù)據(jù)改變或存在引起數(shù)據(jù)改變的潛在可能性的語句(STATEMENT)或改變后的結(jié)果(ROW),也可能是二者混合;
記錄行得到更精確的結(jié)果,但是量比較大,記錄“語句”相對輕量,如果定義問MIXED,則系統(tǒng)會自行決定用語句或者行的格式來記錄。 默認實時statement
注意,如執(zhí)行某個語句時,插入的字段是由函數(shù)執(zhí)行生成,如now()函數(shù),時間每次執(zhí)行都會不一樣,下次重新執(zhí)行,結(jié)果是不一樣的。所以記錄的是執(zhí)行結(jié)果,使得重新執(zhí)行時,結(jié)果一樣。這種記錄方式成為記錄row
查看當前的格式如下:
MariaDB [mysql]> show global variables like 'binlog_format';
云服務(wù)器變量:
log_bin=/PATH/TO/BIN_LOG_FILE
只讀變量;建議不使用數(shù)據(jù)目錄,即/var/lib/mysql,因為二進制日志是將來用來恢復(fù)數(shù)據(jù)的方法,很重要,如果二進制日志和數(shù)據(jù)目錄放在同一磁盤,將來一旦磁盤故障,所有的內(nèi)容都丟失就不能恢復(fù)了,因此建議另外設(shè)定路徑
例子:創(chuàng)建兩個目錄,將數(shù)據(jù)和log分開,分別掛載在不同的磁盤上,并更改數(shù)組和屬主,修改配置文件,指定路徑
[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服務(wù)
[root@CentOS7A mysql]#systemctl restart mariadb
在路徑 /mydata/log下會生成一個二進制的文件master-log.000001,該二進制文件會進行滾動,重啟服務(wù)或者用flush logs命令都會進行滾動,文件后綴名會自動變更。該路徑下還有一個文件master-log.index,該索引不是數(shù)據(jù)索引,而是日志文件索引,文本格式,如當master-log.000001這種文件很多時,mysql識別的文件是記錄在master-log.index這個里面的。
master-log.000001是二進制文件,不能用cat等文本查看工具直接查看,查看二進制文件master-log.000001的方法如下
到mysql里
查看有多少個二進制文件,如下,該命令和直接查看master-log.index內(nèi)容一樣
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指當前寫到哪個字節(jié)的位置,一般不是從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]
查看二進制文件記錄的內(nèi)容, Pos是開始位置,End_log_pos是結(jié)束位置, Event_type事件類型,Info 事件描述信息,信息中, xid=16是mysql記錄的標識符
,Server_id是記錄云服務(wù)器的唯一信息,如果不做協(xié)同工作,默認id是1,同一集群中id號不能相同,需要手動修改該參數(shù),
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,該位置值必須是起始位置,不能是中間的任意數(shù)
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}
控制某會話中的“寫”操作語句是否會被記錄于日志文件中;
關(guān)閉語句如下,之后該session的記錄將不會被記錄到二進制文件中,建議不要關(guān)閉,只在重放的時候才關(guān)閉該功能
MariaDB [sunny]> set @@session.sql_log_bin=off;
max_binlog_size=1073741824 #寫入配置文件,定義二進制文件的最大值,單位是字節(jié)byte,1073741824為1G,但是文件實際大小可能不精準,超過這個值就滾動,文件可能不會精準到這個值后滾動,大小會相差一點點。
sync_binlog={1|0} #把日志從內(nèi)存同步到硬盤,一般是緩存在內(nèi)存區(qū),一段時間后在同步到硬盤,這個好處是效率高,但是有可能會導(dǎo)致異常情況數(shù)據(jù)還在內(nèi)存中而丟失。這里有個極端的情況是,如果丟失的數(shù)據(jù)是commint,這樣數(shù)據(jù)就恢復(fù)不了,這里如果設(shè)置為1,就是當前操作是commit,就馬上記錄到磁盤里,數(shù)據(jù)重放更安全,但是性能會降低,需要根據(jù)實際情況而決定要不要開啟功能
mysqlbinlog:#這個命令行工具的主要作用就是用來查看日志的內(nèi)容,一般開始的245字節(jié)是文件的文件頭,信息都是在這文件頭之后,一般信息都有特定格式記錄,第一個# at開頭之前的為頭部信息,每一個事件的操作記錄以# at開頭 ,以 end_log_poss結(jié)束。一般增刪改查操作都是要先查詢,所以都是Query。小于1s的執(zhí)行時間exec_time都記錄為0.error_code如果沒有錯誤都是0。每一個連接就是一個線程thread_id。
相關(guān)選項:
--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=#到哪個位置結(jié)束
例子:從哪個位置開始查看
[root@CentOS7A log]#mysqlbinlog /mydata/log/master-log.000001 -j 314
--user, --host, --password
該命令是客戶端命令,可以被遠程執(zhí)行,注意文件不能加引號
,但是,測試時,提示文件不存在
[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
事件發(fā)生的日期時間:#160831 9:56:08
事件發(fā)生的云服務(wù)器id:server id 1
事件的結(jié)束位置:end_log_pos 624
事件的類型:Query
事件發(fā)生時所在云服務(wù)器執(zhí)行此事件的線程的ID: thread_id=2
語句的時間戳與將其寫入二進制日志文件中的時間差:exec_time=0
錯誤代碼:error_code=0
設(shè)定事件發(fā)生時的時間戳:SET TIMESTAMP=1472608568/*!*/;
事件內(nèi)容:BEGIN
6 中繼日志
從云服務(wù)器上記錄下來從主云服務(wù)器的二進制日志文件同步過來的事件;是mysql主從復(fù)制時,二進制是主云服務(wù)器上記錄的日志,從云服務(wù)器上通過中繼日志,從云服務(wù)器在本地進行重放,得到一樣的二進制文件。使得主從復(fù)制一樣。
二進制日志還有另一個作用是能做時間點還原,不一定要用于主從復(fù)制,這個恢復(fù)手段很有效,因為即使是備份操作,當備份沒有備份的時間開始到系統(tǒng)崩潰的時間段,可以用這個二進制日志基于時間來恢復(fù)沒有備份的時間段的數(shù)據(jù)的恢復(fù)。
7 事務(wù)日志
事務(wù)型存儲引擎innodb用于保證事務(wù)特性的日志文件:
redo log
undo log
Mysql的主要日志有哪些就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。