日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL日志详细说明

發布時間:2024/7/5 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL日志详细说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這片博文我們會詳細說明MySQL本身的日志,不包含重做日志和undo日志(這兩個日志是innodb存儲引擎的日志)。

MySQL本身的日志有以下幾種(MySQL5.7版本):

  • 錯誤日志
  • 慢查詢日志
  • 通用日志
  • 二進制日志

錯誤日志

默認情況下,錯誤日志是無法被禁止;錯誤日志的位置及日志名使用log_error參數指定,若是沒有指定,則默認錯誤日志名為hostname.err(錯誤日志是以.err為后綴的)。yum安裝的MySQL錯誤日志默認路徑是在/var/log/mysqld.log下的!

在MySQL的官方文檔中還介紹了可以把MySQL的錯誤日志寫入到系統日志中,但是如果這樣的話,查看會不太方便,不再細說給出官方鏈接: https://dev.mysql.com/doc/refman/5.7/en/error-log-syslog.html

log_error_verbosity:系統變量控制服務器記錄錯誤日志的詳細性,以便將錯誤,警告和注釋信息寫入錯誤日志。其有三個取值,1:僅限錯誤;2:錯誤和警告;3:錯誤,警告和注釋,默認數值是3。如果該值大于2,則服務器將記錄中止的連接以及新連接嘗試的拒絕訪問錯誤。

log_timestamps:系統變量控制寫入錯誤日志(以及常規查詢日志和慢速查詢日志文件)的消息中時間戳的時區。允許的值為UTC(默認值)和系統(本地系統時區)。

刷新錯誤日志和重命名:

如果使用flush error logs、flush logs或mysqladmin flush-logs刷新日志,服務器將關閉并重新打開它正在寫入的任何錯誤日志文件。要重命名錯誤日志文件,請在刷新之前手動執行此操作。刷新日志,然后打開一個具有原始文件名的新文件。

[root@mgt01 mysql]# ll -h mgt01.err #當前錯誤日志 -rw-r----- 1 mysql mysql 2.1M Jan 5 15:05 mgt01.err [root@mgt01 mysql]# mv mgt01.err mgt01.bak #更改當前錯誤日志的名字 [root@mgt01 mysql]# mysqladmin flush-logs #執行刷新日志操作,就會重新打開一個以原錯誤日志名命名的新文件。 [root@mgt01 mysql]# ll -h mgt01.err mgt01.bak -rw-r----- 1 mysql mysql 2.1M Jan 5 15:06 mgt01.bak -rw-r----- 1 mysql mysql 489 Jan 5 15:09 mgt01.err

?

慢查詢日志

慢查詢日志由執行時間超過long_query_time指定的秒數的SQL語句組成,并且要求至少檢查min_examined_row_limit行。慢速查詢日志可用于查找執行時間較長的查詢,因此是優化的候選查詢。

開啟慢查詢日志,可以把sql語句執行時間較長的語句寫入慢查詢日志中,以便查看。

慢查詢日志的參數

在MySQL默認情況下,禁用慢查詢日志。若開啟慢查詢日志可以使用slow_query_log參數,把其設置為1或on。

使用slow_query_log_file指定慢查詢日志的文件格式,文件名,文件位置。默認文件在數據庫目錄下面的,文件名為host-name-slow.log。

long_query_time: 設置慢查詢日志的時間限制,默認值是10s,最小值是0.該值可以指定為微妙的分辨率。(MySQL5.7版本)

默認情況下,不記錄管理語句,也不記錄不使用索引進行查找的語句。

要在慢查詢日志中記錄管理語句,則啟用log_slow_admin_statements系統變量。管理語句包含ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,和 REPAIR TABLE。

要在慢查詢日志的語句中包含不使用索引進行查詢的語句,則使用log_queries_not_using_indexes系統變量。(即使啟用了該變量,服務器也不會記錄由于表少于兩行而不使用索引的查詢);開啟這個參數后,慢查詢日志會比較快的增長,因此引入了log_throttle_queries_not_using_indexes參數,這個參數設定每分鐘記錄到日志的未使用索引的語句數目,超過這個數目后只記錄語句數量和花費的總時間。

log_slow_slave_statements:記錄從庫上的慢查詢語句。

log_output: 參數指定慢查詢日志輸出到文件或者記錄在數據庫的表中。

一個實例如下:

slow_query_log=ON long_query_time=3 slow_query_log_file= #不指定,默認是在當前數據庫目錄下面,以當前主機名命名的hostname-slow.log語句。 log_output=FILE log_queries_not_using_indexes mysql> select sleep(5); +----------+ | sleep(5) | +----------+ | 0 | +----------+ 1 row in set (5.00 sec)[root@mgt01 mysql]# mysqldumpslow mgt01-slow.log #查看慢查詢日志Reading mysql slow query log from mgt01-slow.log Count: 1 Time=5.00s (5s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhostselect sleep(N) Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]Parse and summarize the MySQL slow query log. Options are--verbose verbose--debug debug--help write this text to standard output-v verbose-d debug-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is defaultal: average lock timear: average rows sentat: average query timec: countl: lock timer: rows sentt: query time -r reverse the sort order (largest last instead of first)-t NUM just show the top n queries-a don't abstract all numbers to N and strings to 'S'-n NUM abstract numbers with at least n digits within names-g PATTERN grep: only consider stmts that include this string-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),default is '*', i.e. match all-i NAME name of server instance (if using mysql.server startup script)-l don't subtract lock time from total time mysqldumpslow的選項

上面的實例時把慢查詢日志寫入了文件,下面修改log_output值為table,把慢查詢日志寫入到表中。

log_output=TABLE#然后再mysql數據庫下面生成slow_log表。 mysql> desc slow_log; +----------------+---------------------+------+-----+----------------------+--------------------------------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------------------+------+-----+----------------------+--------------------------------+ | start_time | timestamp(6) | NO | | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP(6) | | user_host | mediumtext | NO | | NULL | | | query_time | time(6) | NO | | NULL | | | lock_time | time(6) | NO | | NULL | | | rows_sent | int(11) | NO | | NULL | | | rows_examined | int(11) | NO | | NULL | | | db | varchar(512) | NO | | NULL | | | last_insert_id | int(11) | NO | | NULL | | | insert_id | int(11) | NO | | NULL | | | server_id | int(10) unsigned | NO | | NULL | | | sql_text | mediumblob | NO | | NULL | | | thread_id | bigint(21) unsigned | NO | | NULL | | +----------------+---------------------+------+-----+----------------------+--------------------------------+ 12 rows in set (0.00 sec)mysql>

在查看慢查詢日志的時候,除了使用自帶的mysqldumpslow工具外,還可以使用percona的pt-query-digest工具。

常規查詢日志

The general query log is a general record of what mysqld is doing. The server writes information to this log when clients connect or disconnect,
and it logs each SQL statement received from clients. The general query log can be very useful when you suspect an error in a client and want
to know exactly what the client sent to mysqld. #常規查詢日志是mysqld所做工作的常規記錄。當客戶端連接或斷開連接時,服務器將信息寫入此日志,并記錄從客戶端接收的每個SQL語句。當您懷疑客戶機中存在錯誤并想確切知道客戶
#機發送給mysqld的內容時,常規查詢日志非常有用。

常規查詢日志記錄的內容比較詳細,并且會記錄執行的每條語句,因此常用于審計的時候使用。開啟常規查詢語句,對數據庫的性能會有一定的影響。默認是關閉的。

general_log: 用于開啟常規查詢日志,當為0時,關閉常規查詢日志。

general_log_file: 用于指定常規查詢日志的文件名,文件位置。默認文件名為hostname.log.

log_output: 指定日志輸出到文件或者表中。和上面的一樣。

mysql> set global general_log=ON; #開啟常規查詢日志(常規查詢日志可以動態修改) Query OK, 0 rows affected (0.01 sec)
mysql> show variables like "log_output"; #設置常規查詢日志輸出到表中
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output??? | TABLE |
+---------------+-------+
1 row in set (0.01 sec)
mysql
> use mysql; #會在mysql下面生成general_log表。 Database changed mysql> select * from general_log;

可以關閉當前會話的常規查詢日志如下:

mysql> set sql_log_off=ON; Query OK, 0 rows affected (0.01 sec)

二進制日志

二進制日志包含描述數據庫更改(如表創建操作或表數據更改)的“事件”。二進制日志主要有兩個功能:

  • 復制。(不再說明,可以查看 https://www.cnblogs.com/wxzhe/p/10051114.html)
  • 基于備份文件做基于時間點恢復。(https://www.cnblogs.com/wxzhe/p/10033983.html 文章的末尾有使用二進制日志進行恢復)

對于select語句,和show語句,因為不修改數據庫中的數據,因此不會記錄到二進制日志中;若是想要記錄這種不修改數據的語句,可以使用常規查詢日志。

與二進制日志有關的參數:

log-bin=
#MySQL默認不起用二進制日志,這個參數指定二進制的位置,文件名。默認是以主機名命名的(強烈不推薦使用)。使用主機名命名的二進制日志,在遷移到別的主機時會報錯。
#二進制文件名以filename.number的形式存在,number的格式是從00001開始的6位數,依次遞增。還會生成一個filename.index文件,這個文件存儲所有二進制日志文件名的清單。

log_bin_index= #指定上面提到的二進制日志索引文件名。這個文件不需要手動編輯,可以直接默認即可!

max_binlog_size: 設置二進制的最大大小,超出這個值時,二進制日志會自動輪換下一個。默認是1G。

binlog_cache_szie:  在事務沒有提交的時候使用的緩沖大小(基于會話的),如果緩存大于這個數值則會使用臨時文件。可以使用show global status來查看使用臨時文件的次數。
             默認是32KB。

mysql> show global status like 'binlog_cache_%';
+-----------------------+-------+
| Variable_name???????? | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0???? | #使用臨時文件的次數
| Binlog_cache_use????? | 0???? | #緩沖使用的次數。
+-----------------------+-------+
2 rows in set (0.02 sec)

mysql>

max_binlog_cache_size: (默認為4GB,也是最大值)可用于限制用于緩存多語句事務的總大小。如果事務大于這個字節數,它將失敗并回滾。最小值為4096。

binlog_error_action:如果服務器無法寫入二進制日志、刷新二進制日志文件或將二進制日志同步到磁盤,則復制主服務器上的二進制日志可能會不一致,復制從服務器可能會失去與
            主服務器的同步。binlog_error_action系統變量控制在二進制日志遇到此類錯誤時采取的操作。
   默認設置是abort_server: ABORT_SERVER使服務器暫停二進制日志記錄并關閉。此時,您可以識別并更正錯誤原因。重新啟動時,恢復將按意外服務器暫停的情況繼續進行.
ignore_error:提供與舊版本MySQL向后兼容。使用此設置,服務器繼續正在進行的事務并記錄錯誤,然后暫停二進制日志記錄,但繼續執行更新。要恢復二進制日志記錄,必須重啟服務器。
binlog_format:指定二進制日志的格式,有三種選擇:
  STATEMENT: 基于語句,把數據庫執行的每條語句記錄下來。
ROW:   基于行的,主服務器把事件寫入二進制日志,以指示各個表行的影響方式。線上標配一般是RC+ROW.
  mixed: 混合日志記錄,對于混合日志記錄。默認情況下使用基于語句的日志記錄,但在某些情況下,日志記錄模式會自動切換到基于行的記錄。使用混合記錄時,
        服務器會在以下條件時,使用基于行的記錄。https://dev.mysql.com/doc/refman/5.7/en/binary-log-mixed.html
binlog-row-event-max-size: 在使用基于行的格式時,二進制日志文件中記錄的是事件,這個參數表示事件的最大大小。這個value必須是256的倍數,默認是8192.

expire_logs_days: 表示二進制的保留時間,超過這個時間的二進制會被自動刪除。單位是天,數值類型為整型。 MySQL提供一個sync_binlog參數來控制數據庫的binlog刷到磁盤上去。默認,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系統自己控制它的緩存的刷新。這時候的性能是最好的,但是風險也是最大的。因為一旦系統Crash,在binlog_cache中的所有binlog信息都會被丟失。如果sync_binlog>0,表示每sync_binlog次事務提交,MySQL調用文件系統的刷新操作將緩存刷下去。最安全的就是sync_binlog=1了,表示每次事務提交,MySQL都會把binlog刷下去,是最安全但是性能損耗最大的設置。這樣的話,在數據庫所在的主機操作系統損壞或者突然掉電的情況下,系統才有可能丟失1個事務的數據。但是binlog雖然是順序IO,但是設置sync_binlog=1,多個事務同時提交,同樣很大的影響MySQL和IO性能。雖然可以通過group commit的補丁緩解,但是刷新的頻率過高對IO的影響也非常大。對于高并發事務的系統來說,“sync_binlog”設置為0和設置為1的系統寫入性能差距可能高達5倍甚至更多。所以很多MySQL DBA設置的sync_binlog并不是最安全的1,而是100或者是0。這樣犧牲一定的一致性,可以獲得更高的并發和性能。 sync_binlog參數設置

上面說明了與二進制有關的一些參數,下面我們來說明二進制的一些管理以及二進制內容的格式。

?首先開啟二進制日志,如下:

log-bin=/data/mysql/test-bin binlog_format=ROW

然后查看二進制日志文件

[root@mgt02 mysql]# ll test-bin.* -rw-r----- 1 mysql mysql 154 Dec 9 21:56 test-bin.000001 #二進制日志文件 -rw-r----- 1 mysql mysql 28 Dec 9 21:56 test-bin.index #二進制日志索引文件 [root@mgt02 mysql]# cat test-bin.index #目前索引文件中,只有一個當前的日志文件
/data/mysql/test-bin.000001
[root@mgt02 mysql]# mysqlbinlog test-bin.000001 #查看二進制日志文件可以使用mysqlbinlog命令,因為這里不是介紹這個命令,就不說明這個命令的具體用法
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#181209 21:56:11 server id 15? end_log_pos 123 CRC32 0x1a2a822b ?? ?Start: binlog v 4, server v 5.7.23-log created 181209 21:56:11 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
+x4NXA8PAAAAdwAAAHsAAAABAAQANS43LjIzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD7Hg1cEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASuCKho=
'/*!*/;
# at 123
#181209 21:56:11 server id 15? end_log_pos 154 CRC32 0x44f5bfa4 ?? ?Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

?二進制日志的結構和內容

前面我們提到過二進制中存儲的是事件,那么這些事件該如何查看呢?

mysql> show binlog events; #查看當前活躍的二進制日志中的事件。 +-----------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +-----------------+-----+----------------+-----------+-------------+---------------------------------------+ | test-bin.000001 | 4 | Format_desc | 15 | 123 | Server ver: 5.7.23-log, Binlog ver: 4 | | test-bin.000001 | 123 | Previous_gtids | 15 | 154 | | +-----------------+-----+----------------+-----------+-------------+---------------------------------------+ 2 rows in set (0.00 sec)

#Log_name: 表示的是當前查看的二進制日志的名字,注意若想查看指定的二進制日志文件大小,則在后面加上in "binlog-filename"即可!
#Pos: 表示當前事件在二進制日志中的位置點,與后面的End_log_pos對應。
#Event_type:表示事件類型,上面的兩個分別表示格式描述事件和前面的表示的gtid號。
#Server_id: 表示的是當前服務器的server_id.
#info: 表示事件信息的可讀文本。

前面說過,二進制日志并不是一個單獨的文件,而是由一系列易于管理的文件組成的,二進制日志包括一組存儲實際內容的二進制日志文件和一個用來跟蹤二進制日志文件存儲位置的二進制日志索引文件。

有一個二進制日志文件是活動二進制日志文件,即當前正在被寫入的文件。

每個二進制日志文件都是以格式描述事件開始,以日志輪換事件結束。格式描述事件包括產生該文件的服務器版本號,服務器以及二進制日志信息等。日志輪換事件包含下一個二進制日志文件的名稱,告知二進制日志繼續寫入哪個文件。

每個二進制日志文件中有多個二進制日志事件,各個事件之間相互獨立。同時也是構成二進制日志的基本單位。格式描述符事件還有一個標記,標記二進制日志文件是否正常關閉,如果正在寫入二進制日志文件,則設置該標記;如果文件關閉,則清除標記。若服務器非正常關機,則二進制日志不是以日志輪換事件結束。

二進制日志文件管理

在主從結構中:

reset? master: 刪除了所有二進制日志文件并清空了二進制日志索引文件。

reset slave: 刪除了復制用的所有文件,重新開始;使用之前需要先stop slave!

在服務器上若想刪除二進制日志可以執行如下命令:

purge binary logs to "binlog-filename": 刪除給定文件之前的所有文件

purge binary logs before “datetime”:刪除給定時間之前的所有文件。

?

轉載于:https://www.cnblogs.com/wxzhe/p/10225475.html

總結

以上是生活随笔為你收集整理的MySQL日志详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。