分析mysql系統(tǒng)庫(kù)日志信息記錄表

這篇文章主要介紹“分析MySQL系統(tǒng)庫(kù)日志信息記錄表”,在日常操作中,相信很多人在分析mysql系統(tǒng)庫(kù)日志信息記錄表問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”分析mysql系統(tǒng)庫(kù)日志信息記錄表”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、微信小程序定制開發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10年以來(lái),已經(jīng)為上千工商代辦各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的上千客戶與我們一路同行,見(jiàn)證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。

一、日志信息記錄表

    1.1. 日志信息概述
MySQL的日志系統(tǒng)包含:general query log、slow query log、error log(記錄MySQL Server啟動(dòng)時(shí)、運(yùn)行中、停止時(shí)的錯(cuò)誤信息)、binary log(記錄MySQL Server運(yùn)行過(guò)程中的數(shù)據(jù)變更的邏輯日志)、relay log(記錄從庫(kù)IO線程從主庫(kù)獲取的主庫(kù)數(shù)據(jù)變更日志)、DDL log(記錄DDL語(yǔ)句執(zhí)行時(shí)的元數(shù)據(jù)變更信息。5.7中只支持寫入到文件,8.0中支持寫入到innodb_ddl_log表中,注意,ddl log與online ddl的alter log不同,不要搞混了),其中,在MySQL 5.7中,只有g(shù)eneral query log、slow query log支持寫入到表中(也支持寫入到文件中),其他日志類型在MySQL 5.7版本中只支持寫入到文件中,所以,下文中對(duì)于日志系統(tǒng)表主要介紹 general query log、slow query log表。
默認(rèn)情況下,除Windows上的錯(cuò)誤日志之外,其他平臺(tái)的所有日志默認(rèn)情況下不啟用 (DDL日志只在需要時(shí)創(chuàng)建,并且無(wú)用戶可配置選項(xiàng))。
默認(rèn)情況下,所有日志均寫在datadir目錄下,但可以使用每種日志對(duì)應(yīng)的路徑參數(shù)自行更改路徑。
  • general query log:general_log_file=/home/mysql/data/mysqldata1/mydata/localhost.log
  • error log:log_error=/home/mysql/data/mysqldata1/log/error.log
  • slow query log:slow_query_log_file=/home/mysql/data/mysqldata1/slowlog/slow-query.log
  • binary log:log_bin_basename=/home/mysql/data/mysqldata1/binlog/mysql-bin、log_bin_index=/home/mysql/data/mysqldata1/binlog/mysql-bin.index
  • relay log:relay_log_basename=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin、relay_log_index=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin.index
默認(rèn)情況下,所有的日志都寫入到磁盤文件,但general query log和slow query log可以通過(guò)log_output=TABLE設(shè)置保存到表mysql.general_log和mysql.slow_log表中(DDL log在8.0中可以配置,可打印到錯(cuò)誤日志中,也可以保存在表innodb_ddl_log中)。

默認(rèn)情況下,binary log根據(jù)max_binlog_size參數(shù)設(shè)置的大小自動(dòng)滾動(dòng)、relay log根據(jù)max_relay_log_size或者max_binlog_size自動(dòng)滾動(dòng)(如果max_relay_log_size沒(méi)設(shè)置就按照max_binlog_size大小滾動(dòng)),其他的日志類型不會(huì)滾動(dòng),總是使用同一個(gè)文件,所以其他日志類型增長(zhǎng)過(guò)大之后,需要自行做切割。

  • 一般使用mv file file.bak;然后執(zhí)行刷新命令,刷新命令可以登錄實(shí)例使用flush logs命令刷新重新產(chǎn)生新的日志文件,但是該命令是刷新所有的日志類型,要針對(duì)具體的日志類型,可以使用:flush binary logs;刷新二進(jìn)制日志、flush error logs;刷新錯(cuò)誤日志、flush general logs;刷新普通查詢?nèi)罩?、flush slow logs;刷新慢查詢?nèi)罩尽lush relay logs;刷新中繼日志、flush engine logs;刷新存儲(chǔ)引擎相關(guān)的任何可刷新的日志。

  • 也可以使用Server的flush tables;語(yǔ)句或者flush table with read lock;語(yǔ)句。

  • 刷新操作也可以使用一些命令行工具的選項(xiàng)實(shí)現(xiàn),例如:使用mysqladmin命令的flush-logs選項(xiàng),或者mysqldump的flush-logs選項(xiàng)與--master-data選項(xiàng)。
日志表實(shí)現(xiàn)具有以下特征:
通常,日志表的主要目的是為程序提供一個(gè)訪問(wèn)接口,以便查看Server內(nèi)的SQL運(yùn)行情況,所以,日志記錄存放在表中比存放在磁盤文件中會(huì)更加方便,因?yàn)榇鎯?chǔ)在表中可以遠(yuǎn)程訪問(wèn)這些日志記錄,而不需要登錄操作系統(tǒng)去訪問(wèn)磁盤文件。
日志表可以使用CREATE TABLE,ALTER TABLE和DROP TABLE語(yǔ)句,但前提是需要先使用對(duì)應(yīng)的開關(guān)關(guān)閉掉表,不能在使用期間操作(例如:set global general_log=0,然后操作general_log表)。
general_log和slow_log表默認(rèn)是CSV引擎,使用逗號(hào)分割的格式來(lái)存放日志記錄,CSV數(shù)據(jù)文件可以很方便地導(dǎo)入其他程序進(jìn)行處理,例如:excel電子表格。
日志表可以修改引擎為MyISAM,但修改之前必須先停止表的使用。合法的引擎為CSV和MyISAM,其他引擎不支持。

要禁用日志記錄表以便進(jìn)行相應(yīng)的DDL語(yǔ)句操作,可以使用以下步驟(以慢查詢表為例進(jìn)行說(shuō)明,slow_log和general_log表操作方式類似)。

SET @old_log_state = @@ global.general_log;
SET GLOBAL general_log ='OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
SET GLOBAL general_log = @old_log_state;

可以使用TRUNCATE TABLE來(lái)清空日志記錄。

可以使用RENAME TABLE來(lái)實(shí)現(xiàn)日志表的歸檔,新舊表做一個(gè)原子的名稱互換操作,如下:

use mysql;
DROP TABLE IF EXISTS general_log2;
CREATE TABLE general_log2 LIKE general_log;
RENAME TABLE general_log TO general_log_backup,general_log2 TO general_log;

注意事項(xiàng)

  • 可以使用CHECK TABLE語(yǔ)句。

  • 不能使用LOCK TABLE語(yǔ)句。

  • 不能使用INSERT,DELETE和UPDATE語(yǔ)句,日志表的記錄變更由Server內(nèi)部維護(hù),不能手動(dòng)操作。

  • FLUSH TABLES WITH READ LOCK和read_only系統(tǒng)變量的設(shè)置對(duì)日志表沒(méi)有影響。Server內(nèi)部始終可以寫日志表。

  • 日志表的數(shù)據(jù)變更操作不會(huì)記錄到binlog,因此不會(huì)被復(fù)制到從庫(kù)。

  • 可以使用FLUSH TABLES或FLUSH LOGS語(yǔ)句來(lái)刷新日志表或日志文件。

  • 日志表不支持分區(qū)表。

mysqldump轉(zhuǎn)儲(chǔ)包含了重新創(chuàng)建這些表的語(yǔ)句,以便在重新加載轉(zhuǎn)儲(chǔ)文件后恢復(fù)日志表結(jié)構(gòu),但是日志表中的記錄內(nèi)容不會(huì)被轉(zhuǎn)儲(chǔ)。

PS:MySQL的查詢?nèi)罩尽㈠e(cuò)誤日志等是使用明文記錄的,所以,這些日志中有可能會(huì)記錄用戶的明文密碼信息,可以使用rewrite插件來(lái)使用原始格式記錄,詳見(jiàn)鏈接:

  • https://dev.mysql.com/doc/refman/5.7/en/plugin-types.html#query-rewrite-plugin-type

  • https://dev.mysql.com/doc/refman/5.7/en/rewriter-query-rewrite-plugin.html

    1.2. 日志表詳解

1.2.1. general_log

該表提供查詢普通SQL語(yǔ)句的執(zhí)行記錄信息,用于查找客戶端到底在服務(wù)端上執(zhí)行了什么SQL(當(dāng)然,還可以使用企業(yè)版的audit log審計(jì)插件記錄,本文不做贅述,有興趣的童鞋自行研究)。
該表中的信息在SQL開始執(zhí)行時(shí)就會(huì)進(jìn)行記錄,而不是等待SQL執(zhí)行結(jié)束才記錄。

下面是該表中存儲(chǔ)的信息內(nèi)容。

root@localhost : (none) 07:25:50> set global log_output='TABLE';
Query OK, 0 rows affected (0.00 sec)
root@localhost : (none) 07:26:20> set global general_log=1;
Query OK, 0 rows affected (0.01 sec)
root@localhost : (none) 07:26:32> select * from mysql.general_log;
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
| event_time | user_host | thread_id | server_id | command_type | argument |
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
| 2018-06-19 19:26:32.891371 | root[root] @ localhost [] | 3 | 3306102 | Query | show databases |
| 2018-06-19 19:26:42.012064 | root[root] @ localhost [] | 3 | 3306102 | Query | select * from mysql.general_log |
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
2 rows in set (0.00 sec)
root@localhost : (none) 07:26:42> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)

表字段含義。

  • event_time:查詢?nèi)罩居涗浀奖淼哪且豢痰膌og_timestamps系統(tǒng)變量值,用于標(biāo)記查詢?nèi)罩居涗浐螘r(shí)入庫(kù)。

  • user_host:表示該查詢?nèi)罩居涗浀膩?lái)源,其中有用戶名和主機(jī)名信息。

  • thread_id:表示該查詢?nèi)罩居涗泩?zhí)行時(shí)的process_id。

  • server_id:表示執(zhí)行該查詢的數(shù)據(jù)庫(kù)實(shí)例ID。

  • command_type:表示該查詢的command類型,通常都為query。

  • argument:表示執(zhí)行查詢的SQL語(yǔ)句文本。

mysqld按照接收請(qǐng)求的順序?qū)⒄Z(yǔ)句寫入查詢?nèi)罩局?這可能與它們的執(zhí)行順序不同)。

在主從復(fù)制架構(gòu)中。

  • 主庫(kù)上在使用基于語(yǔ)句的日志格式時(shí),從庫(kù)在在重放這些語(yǔ)句之后,會(huì)把這些語(yǔ)句記錄自己的查詢?nèi)罩局校ㄐ枰獜膸?kù)啟用了查詢?nèi)罩居涗浌δ埽褂谜Z(yǔ)句格式記錄的binlog在使用mysqlbinlog命令解析之后導(dǎo)入數(shù)據(jù)庫(kù)中時(shí),如果實(shí)例開啟了查詢?nèi)罩居涗浌δ埽瑒t這些解析語(yǔ)句也會(huì)被記錄到查詢?nèi)罩局小?/p>

  • 主庫(kù)上使用基于row日志格式時(shí),從庫(kù)重放這些數(shù)據(jù)變更之后,這些語(yǔ)句不會(huì)被計(jì)入從庫(kù)的查詢?nèi)罩局小?/p>

  • 在主庫(kù)上使用基于mixed日志格式時(shí),如果主庫(kù)是以語(yǔ)句格式記錄的,則從庫(kù)重放這些數(shù)據(jù)變更之后會(huì)把語(yǔ)句記錄到自己的查詢?nèi)罩局校ㄐ枰獜膸?kù)啟用了查詢?nèi)罩居涗浌δ埽?,如果主?kù)在記錄binlog時(shí)被轉(zhuǎn)換為了row格式,則也跟row格式復(fù)制一樣,從庫(kù)重放這些數(shù)據(jù)變更之后不會(huì)把這些語(yǔ)句記錄到自己的查詢?nèi)罩局小?/p>

查詢?nèi)罩究梢允褂孟到y(tǒng)變量sql_log_off變量動(dòng)態(tài)關(guān)閉當(dāng)前會(huì)話或者所有會(huì)話的查詢?nèi)罩居涗浌δ埽ㄅcsql_log_bin系統(tǒng)變量的作用類似)。
查詢?nèi)罩鹃_關(guān)general_log變量和查詢磁盤日志文件路徑general_log_file變量都可以動(dòng)態(tài)修改(如果已經(jīng)有查詢?nèi)罩咎幱诖蜷_狀態(tài),則使用general_log_file變量修改查詢?nèi)罩韭窂綍r(shí)關(guān)閉舊的查詢?nèi)罩荆蜷_新的查詢?nèi)罩荆?,?dāng)啟用查詢?nèi)罩緯r(shí),查詢?nèi)罩緦⒈3值较到y(tǒng)變量log_output指定的目的地。

如果啟用了查詢?nèi)罩?,則Server重新啟動(dòng)的時(shí)候會(huì)重新打開查詢?nèi)罩疚募?,如果查詢?nèi)罩敬嬖冢瑒t直接重新打開,如果查詢?nèi)罩静淮嬖?,則重新創(chuàng)建,如果需要再Server運(yùn)行時(shí)動(dòng)態(tài)歸檔查詢?nèi)罩荆瑒t可以按照如下命令操作(linux或者unix平臺(tái))。

shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> mv host_name-old.log backup-directory
# 在Windows上,請(qǐng)直接使用重命名,而不是mv命令

也可以在Server運(yùn)行時(shí)通過(guò)語(yǔ)句先關(guān)閉查詢?nèi)罩竟δ?,然后使用外部命令?lái)歸檔,然后再重新啟用查詢?nèi)罩?,這樣就不需要使用flush-logs命令來(lái)刷新日志文件了,此方法適用于任何平臺(tái),命令如下:

SET GLOBAL general_log ='OFF';
# 在禁用日志的情況下,從外部重命名日志文件;例如,從命令行。然后再次啟用日志:SET GLOBAL general_log ='ON';# 此方法適用于任何平臺(tái),不需要重新啟動(dòng)服務(wù)器。

默認(rèn)情況下,在Server中執(zhí)行的語(yǔ)句如果帶了用戶密碼,會(huì)被Server重寫該語(yǔ)句之后再寫入到查詢?nèi)罩局?,如果需要記錄明文密碼,則需要使用--low-raw選項(xiàng)啟動(dòng)Server(使用該選項(xiàng)會(huì)繞過(guò)密碼重寫功能),通常不建議記錄密碼明文信息到查詢?nèi)罩局?,因?yàn)椴话踩?,但如果有必要,自行判斷(例如:需要查詢?cè)嫉恼Z(yǔ)句信息來(lái)排查問(wèn)題時(shí))。

  • 如果帶密碼的語(yǔ)句中,指定了密碼是一個(gè)hash值時(shí),則密碼字符串不會(huì)被重寫,例如:CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';就會(huì)被原本原因地記錄下來(lái),但是如果去掉PASSWORD關(guān)鍵字CREATE USER 'user1'@'localhost' IDENTIFIED BY 'not-so-secret';,則在查詢?nèi)罩局芯蜁?huì)被重寫為:CREATE USER 'user1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS ''。

一些語(yǔ)法錯(cuò)誤的SQL默認(rèn)情況下也不會(huì)被記錄到查詢?nèi)罩局?,使?-low-raw選項(xiàng)啟動(dòng)Server會(huì)記錄所有的原始SQL語(yǔ)句。

查詢?nèi)罩颈碇械臅r(shí)間戳信息來(lái)源于系統(tǒng)變量log_timestamps(包括慢查詢?nèi)罩疚募湾e(cuò)誤日志文件中的時(shí)間戳都來(lái)自此系統(tǒng)變量的值),該時(shí)間戳值在查詢時(shí)可以使用CONVERT_TZ()函數(shù)或通過(guò)設(shè)置會(huì)話將從這些表中的時(shí)間戳信息從本地系統(tǒng)時(shí)區(qū)轉(zhuǎn)換為任何所需時(shí)區(qū)(修改會(huì)話級(jí)別的time_zone變量值)。

1.2.2. slow_log

該表提供查詢執(zhí)行時(shí)間超過(guò)long_query_time設(shè)置值的SQL,或者未使用索引的(需要開啟參數(shù)log_queries_not_using_indexes=ON)或者管理語(yǔ)句(需要開啟參數(shù)log_slow_admin_statements=ON)。

下面是該表中存儲(chǔ)的信息內(nèi)容。

root@localhost : test 08:46:04> set global long_query_time=0;
Query OK, 0 rows affected (0.01 sec)
root@localhost : test 08:55:14> set global slow_query_log=1;
Query OK, 0 rows affected (0.01 sec)
# 斷開會(huì)話重新連接
root@localhost : (none) 08:56:12> use test
Database changed
root@localhost : test 08:56:13> show tables;
+----------------+
| Tables_in_test |
+----------------+
| customer |
| product |
| shares |
| test |
| transreq |
+----------------+
5 rows in set (0.01 sec)
root@localhost : test 08:56:16> select * from test;
+---+---+------+------+------+------+
| a | b | c | d | e | f |
+---+---+------+------+------+------+
| 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 | 4 | 4 |
| 5 | 5 | 4 | 4 | 5 | 5 |
+---+---+------+------+------+------+
5 rows in set (0.01 sec)
root@localhost : test 08:56:18> select * from mysql.slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
| start_time | user_host | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text | thread_id |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
| 2018-06-19 20:56:12.254716 | root[root] @ localhost [] | 00:00:00.000286 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | select @@version_comment limit 1 | 4 |
| 2018-06-19 20:56:12.258551 | root[root] @ localhost [] | 00:00:00.000153 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | select USER() | 4 |
| 2018-06-19 20:56:13.975382 | root[root] @ localhost [] | 00:00:00.000247 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | SELECT DATABASE() | 4 |
| 2018-06-19 20:56:13.975627 | root[root] @ localhost [] | 00:00:00.000095 | 00:00:00.000000 | 1 | 0 | test | 0 | 0 | 3306102 | Init DB | 4 |
| 2018-06-19 20:56:16.277207 | root[root] @ localhost [] | 00:00:00.000490 | 00:00:00.000264 | 5 | 5 | test | 0 | 0 | 3306102 | show tables | 4 |
| 2018-06-19 20:56:18.936831 | root[root] @ localhost [] | 00:00:00.000694 | 00:00:00.000400 | 5 | 5 | test | 0 | 0 | 3306102 | select * from test | 4 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
6 rows in set (0.00 sec)

表字段含義。

  • start_time:慢查詢?nèi)罩居涗浀奖頃r(shí)的log_timestamps系統(tǒng)變量值。

  • user_host:帶用戶名和主機(jī)名(IP)格式的值,用于標(biāo)記訪問(wèn)來(lái)源。

  • query_time:慢查詢語(yǔ)句總的執(zhí)行時(shí)間。

  • lock_time:慢查詢語(yǔ)句持有鎖的時(shí)間。

  • rows_sent:慢查詢語(yǔ)句最終返回給客戶端的數(shù)據(jù)記錄數(shù)。

  • rows_examined:慢查詢語(yǔ)句在存儲(chǔ)引擎中的檢查記錄數(shù)。

  • db:慢查詢語(yǔ)句執(zhí)行時(shí)的默認(rèn)庫(kù)名。

  • last_insert_id:通常為0。

  • insert_id:通常為0。

  • server_id:產(chǎn)生慢查詢語(yǔ)句的server id。

  • sql_text:慢查詢?nèi)罩镜恼Z(yǔ)句文本。

  • thread_id:產(chǎn)生慢查詢?nèi)罩镜木€程process_id。

慢查詢?nèi)罩景藞?zhí)行時(shí)間超過(guò)long_query_time系統(tǒng)變量設(shè)置的秒數(shù)的SQL語(yǔ)句,并且包含了需要檢查行數(shù)超過(guò)min_examined_row_limit系統(tǒng)變量設(shè)置的值的SQL語(yǔ)句(默認(rèn)情況下該變量為0,表示不限制檢查行數(shù))。long_query_time的最小值和默認(rèn)值分別為0和10(單位秒)。該值可以指定為微秒(使用小數(shù)),但微秒單位只對(duì)記錄到文件有效。對(duì)于記錄到表中的慢查詢語(yǔ)句,不支持微秒,微秒部分被忽略。

默認(rèn)情況下,慢查詢?nèi)罩静粫?huì)記錄管理語(yǔ)句,也不會(huì)記錄未使用索引的語(yǔ)句,但可以使用log_slow_admin_statements和log_queries_not_using_indexes系統(tǒng)變量更改默認(rèn)行為,使MySQL Server把管理語(yǔ)句和未使用索引的語(yǔ)句也一并計(jì)入慢查詢?nèi)罩尽?/p>

慢查詢?nèi)罩局姓Z(yǔ)句獲取初始鎖的時(shí)間不計(jì)入執(zhí)行時(shí)間,包含時(shí)間范圍為:獲取鎖之后,并在語(yǔ)句執(zhí)行完成之后,將鎖釋放之前。然后將慢查詢語(yǔ)句寫入慢查詢?nèi)罩局?。所以,在慢查詢?nèi)罩局杏涗浀捻樞蚩赡芘cMySQL Server接收到的語(yǔ)句順序(執(zhí)行順序)并不相同,因?yàn)榭赡苡械南葓?zhí)行的語(yǔ)句最后才釋放完所有的鎖,有的后執(zhí)行的語(yǔ)句先釋放完所有的鎖。

默認(rèn)情況下,慢查詢?nèi)罩静粏⒂谩R獑⒂每梢允褂?-slow_query_log =1進(jìn)行設(shè)置,要指定慢查詢?nèi)罩疚募Q,可以使用--slow_query_log_file = file_name進(jìn)行設(shè)置,要指定慢查詢?nèi)罩据敵瞿繕?biāo),可以使用--log-output=FILE|TABLE|NONE 進(jìn)行設(shè)置。

  • 如果啟用了慢查詢?nèi)罩居涗浌δ埽俏粗付Q,則默認(rèn)在datadir下命名為host_name-slow.log,如果使用--log-output=TABLE 設(shè)置了報(bào)錯(cuò)在表中,則slow_query_log_file = file_name 設(shè)置的路徑無(wú)效。

  • 要?jiǎng)討B(tài)修改慢查詢?nèi)罩疚募Q,可以使用slow_query_log=0先關(guān)閉慢查詢?nèi)罩疚募缓笫褂胹low_query_log_file=new_file_name指定新的慢查詢?nèi)罩疚募?,然后使用slow_query_log=1重新啟用慢查詢?nèi)罩救罩疚募?/p>

  • 如果mysqld在啟動(dòng)是使用了--log-short-format選項(xiàng),則MySQL Server會(huì)將較少的慢查詢信息寫入慢查詢?nèi)罩局小?/p>

如果使用了log_slow_admin_statements=1 設(shè)置,則MySQL Server會(huì)在慢查詢?nèi)罩局杏涗浫缦鹿芾碚Z(yǔ)句:

ALTER TABLE,ANALYZE TABLE,CHECK TABLE,CREATE INDEX,DROP INDEX,OPTIMIZE TABLE和REPAIR TABLE

如果使用了log_queries_not_using_indexes=1 設(shè)置,則MySQL Server會(huì)把任何不使用索引的查詢語(yǔ)句記錄到慢查詢?nèi)罩局小?/p>

  • 當(dāng)記錄這些查詢語(yǔ)句時(shí),慢查詢?nèi)罩究赡軙?huì)迅速增長(zhǎng)。此時(shí)可以通過(guò)設(shè)置log_throttle_queries_not_using_indexes系統(tǒng)變量來(lái)限制這些未使用索引的語(yǔ)句計(jì)入慢查詢?nèi)罩镜乃俾剩ㄗ⒁猓涸撟兞肯拗频氖?0秒內(nèi)的未使用索引的語(yǔ)句數(shù)量,不是限制時(shí)間)。默認(rèn)情況下,這個(gè)變量是0,表示沒(méi)有速率限制。當(dāng)啟用限制時(shí),第一個(gè)不使用索引的查詢執(zhí)行之后,將打開一個(gè)60秒的時(shí)間窗口,在該窗口內(nèi),將禁止其他未使用索引的查詢記錄到慢查詢?nèi)罩局?,等待時(shí)間窗口結(jié)束之后,Server記錄一個(gè)摘要信息,表示有多少次以及在這些執(zhí)行次數(shù)總的花費(fèi)時(shí)間。然后進(jìn)入下一個(gè)60秒的窗口。

MySQL Server按照以下順序來(lái)判斷語(yǔ)句是否需要計(jì)入慢查詢:

  • 判斷參數(shù) log_slow_admin_statements是否啟用,如果啟用,則判斷語(yǔ)句是否是管理語(yǔ)句,如果是 則計(jì)入慢查詢,不是則進(jìn)入下一輪判斷。如果參數(shù)未啟用,則進(jìn)入下一步判斷。

  • 判斷查詢語(yǔ)句執(zhí)行時(shí)間是否超過(guò)long_query_time秒,如果超過(guò)則計(jì)入慢查詢,如果未超過(guò),則判斷l(xiāng)og_queries_not_using_indexes 參數(shù)是否啟用,如果啟用該參數(shù)且該語(yǔ)句未使用索引,則計(jì)入慢查詢,否則進(jìn)入下一步判斷。

  • 如果min_examined_row_limit變量設(shè)置非零值,則判斷語(yǔ)句的檢查行數(shù)是否超過(guò)該變量設(shè)置的值,如果超過(guò)則計(jì)入慢查詢,如果未超過(guò)則不記錄慢查詢。

慢查詢?nèi)罩居涗浀臅r(shí)間戳由log_timestamps系統(tǒng)變量控制。

默認(rèn)情況下,復(fù)制架構(gòu)中的從庫(kù)不會(huì)將重放binlog產(chǎn)生的慢查詢寫入自己的慢速查詢?nèi)罩局校绻枰涗洀膸?kù)重放binlog的慢查詢語(yǔ)句計(jì)入慢查詢?nèi)罩?,需要啟用變量log_slow_slave_statements=1。

寫入慢查詢?nèi)罩镜恼Z(yǔ)句中的密碼被服務(wù)器重寫,不會(huì)以純文本形式出現(xiàn)。如果需要記錄原始語(yǔ)句,需要使用--log-raw選項(xiàng)。

二、混雜表

由于本系列不介紹企業(yè)版認(rèn)證插件的audit_log_filter, audit_log_user表、防火墻插件的firewall_users, firewall_whitelis表,所以只剩下一個(gè)servers混雜表的篇幅不足夠另起一期,所有我們強(qiáng)塞到本期里,主要是federated引擎使用的信息,如無(wú)興趣可直接跳過(guò)本期后續(xù)內(nèi)容。

    2.1. servers

該表提供查詢連接組合信息(遠(yuǎn)程實(shí)例的IP、端口、帳號(hào)、密碼、數(shù)據(jù)庫(kù)名稱等信息,詳見(jiàn)后續(xù)示例),這些連接組合信息通常用于federated引擎(當(dāng)然也可以作為在數(shù)據(jù)庫(kù)中保存連接組合的一種方式,維護(hù)也較為方便),該表中的信息需要使用create server方式創(chuàng)建。

在介紹別字段含義之前,先看看dederated引擎的兩種創(chuàng)建方式。

# 使用create server方式創(chuàng)建的連接組合
Syntax:
CREATE SERVER server_name
    FOREIGN DATA WRAPPER wrapper_name
    OPTIONS (option [, option] ...)
option:
  { HOST character-literal
  | DATABASE character-literal
  | USER character-literal
  | PASSWORD character-literal
  | SOCKET character-literal
  | OWNER character-literal
  | PORT numeric-literal }
# 直接使用CONNECTION選項(xiàng)指定完整的連接組合
CONNECTION=scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name

下面是該表中存儲(chǔ)的信息內(nèi)容。

root@localhost Tue Jun 5 01:12:05 2018 01:12:05 [(none)]>CREATE SERVER fedlink_ip
    -> FOREIGN DATA WRAPPER mysql
    -> OPTIONS (USER 'test',PASSWORD 'test', HOST '127.0.0.1', PORT 3306, DATABASE 'test_table',Owner 'test_table1');
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 01:12:10 2018 01:12:10 [(none)]>CREATE SERVER fedlink_socket
    -> FOREIGN DATA WRAPPER mysql
    -> OPTIONS (USER 'test',PASSWORD 'test', SOCKET '/data/mysql/mysql3306/data/mysql.sock', PORT 3306, DATABASE 'test_table',Owner 'test_table2');
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 01:12:10 2018 01:12:10 [(none)]>CREATE SERVER fedlink_socket_ip
    -> FOREIGN DATA WRAPPER mysql
    -> OPTIONS (USER 'test',PASSWORD 'test', HOST '127.0.0.1',SOCKET '/data/mysql/mysql3306/data/mysql.sock', PORT 3306, DATABASE 'test_table',Owner 'test_table3');
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 01:12:10 2018 01:12:10 [(none)]>select * from mysql.servers;
+-------------------+-----------+------------+----------+----------+------+---------------------------------------+---------+-------------+
| Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner |
+-------------------+-----------+------------+----------+----------+------+---------------------------------------+---------+-------------+
| fedlink_socket_ip | 127.0.0.1 | test_table | test | test | 3306 | /data/mysql/mysql3306/data/mysql.sock | mysql | test_table3 |
| fedlink_socket | | test_table | test | test | 3306 | /data/mysql/mysql3306/data/mysql.sock | mysql | test_table2 |
| fedlink_ip | 127.0.0.1 | test_table | test | test | 3306 | | mysql | test_table1 |
+-------------------+-----------+------------+----------+----------+------+---------------------------------------+---------+-------------+
3 rows in set (0.00 sec)
# 如果要?jiǎng)h除連接組合記錄,可以使用如下語(yǔ)句
root@localhost Tue Jun 5 01:10:41 2018 01:10:41 [(none)]>drop SERVER fedlink;
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 01:11:30 2018 01:11:30 [(none)]>drop SERVER fedlink_socket ;
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 01:11:55 2018 01:11:55 [(none)]>drop SERVER fedlink_socket_ip;
Query OK, 1 row affected (0.00 sec)

federated引擎的兩種使用方式讀寫遠(yuǎn)程實(shí)例數(shù)據(jù)示例。

# 創(chuàng)建遠(yuǎn)程實(shí)例用戶
root@localhost Tue Jun 5 00:23:45 2018 00:23:45 [(none)]>grant all on *.* to test@'%' identified by 'test';
Query OK, 0 rows affected (0.00 sec)
# 創(chuàng)建用于存放遠(yuǎn)程實(shí)例表的庫(kù)
root@localhost Tue Jun 5 00:24:06 2018 00:24:06 [(none)]>create database test_table;
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 00:30:50 2018 00:30:50 [(none)]>use test_table
Database changed
# 創(chuàng)建遠(yuǎn)程實(shí)例表test_table1和test_table2
    root@localhost Tue Jun 5 00:31:03 2018 00:31:03 [test_table]>CREATE TABLE test_table1 (
    -> id INT(20) NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(32) NOT NULL DEFAULT '',
    -> other INT(20) NOT NULL DEFAULT '0',
    -> PRIMARY KEY (id),
    -> INDEX name (name),
    -> INDEX other_key (other)
    -> );
Query OK, 0 rows affected (0.06 sec)
root@localhost Tue Jun 5 00:31:09 2018 00:31:09 [test_table]>CREATE TABLE test_table2 (
    -> id INT(20) NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(32) NOT NULL DEFAULT '',
    -> other INT(20) NOT NULL DEFAULT '0',
    -> PRIMARY KEY (id),
    -> INDEX name (name),
    -> INDEX other_key (other)
    -> );
Query OK, 0 rows affected (0.00 sec)
# 創(chuàng)建存放federated引擎表的庫(kù)
root@localhost Tue Jun 5 00:31:16 2018 00:31:16 [test_table]>create database federated;
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 00:31:22 2018 00:31:22 [test_table]>use federated
Database changed
# 使用create server方式創(chuàng)建一個(gè)連接字符串組合,該記錄會(huì)保存到mysql.servers表中
root@localhost Tue Jun 5 00:31:25 2018 00:31:25 [federated]>CREATE SERVER fedlink
    -> FOREIGN DATA WRAPPER mysql
    -> OPTIONS (USER 'test',PASSWORD 'test', HOST '127.0.0.1', PORT 3306, DATABASE 'test_table');
Query OK, 1 row affected (0.03 sec)
# 查看mysql.servers表中的記錄
root@localhost Tue Jun 5 00:31:37 2018 00:31:37 [federated]>select * from mysql.servers;
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
| Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner |
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
| fedlink | 127.0.0.1 | test_table | test | test | 3306 | | mysql | |
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
1 row in set (0.00 sec)
# 使用create server連接字符串組合方式,創(chuàng)建federated引擎表
root@localhost Tue Jun 5 00:32:12 2018 00:32:12 [federated]>CREATE TABLE federated1 (
    -> id INT(20) NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(32) NOT NULL DEFAULT '',
    -> other INT(20) NOT NULL DEFAULT '0',
    -> PRIMARY KEY (id),
    -> INDEX name (name),
    -> INDEX other_key (other)
    -> )
    -> ENGINE=FEDERATED
    -> CONNECTION='fedlink/test_table1';
Query OK, 0 rows affected (0.04 sec)
root@localhost Tue Jun 5 00:32:17 2018 00:32:17 [federated]>show create table federated1;
...
| Table | Create Table |
...
| federated1 | CREATE TABLE `federated1` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL DEFAULT '',
  `other` int(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `other_key` (`other`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='fedlink/test_table1' |
...
1 row in set (0.00 sec)
# 往federated引擎表federated1中插入數(shù)據(jù),然后可以在federated引擎表和遠(yuǎn)程實(shí)例表中都查詢到相同的數(shù)據(jù)
root@localhost Tue Jun 5 00:32:58 2018 00:32:58 [federated]>insert into federated1(name) values('federated1');
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 00:33:42 2018 00:33:42 [federated]>select * from federated1;
+----+------------+-------+
| id | name | other |
+----+------------+-------+
| 1 | federated1 | 0 |
+----+------------+-------+
1 row in set (0.00 sec)
root@localhost Tue Jun 5 00:33:49 2018 00:33:49 [federated]>select * from test_table.test_table1;
+----+------------+-------+
| id | name | other |
+----+------------+-------+
| 1 | federated1 | 0 |
+----+------------+-------+
1 row in set (0.00 sec)
# 使用CONNECTION方式完整的連接字符串創(chuàng)建federated引擎表
root@localhost Tue Jun 5 00:32:32 2018 00:32:32 [federated]>CREATE TABLE federated2 (
    -> id INT(20) NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(32) NOT NULL DEFAULT '',
    -> other INT(20) NOT NULL DEFAULT '0',
    -> PRIMARY KEY (id),
    -> INDEX name (name),
    -> INDEX other_key (other)
    -> )
    -> ENGINE=FEDERATED
    -> CONNECTION='mysql://test:test@127.0.0.1:3306/test_table/test_table2';
Query OK, 0 rows affected (0.00 sec)
# 往federated引擎表federated2中插入數(shù)據(jù),然后可以在federated引擎表和遠(yuǎn)程實(shí)例表中都查詢到相同的數(shù)據(jù)
root@localhost Tue Jun 5 00:34:08 2018 00:34:08 [federated]>insert into federated2(name) values('federated2');
Query OK, 1 row affected (0.00 sec)
root@localhost Tue Jun 5 00:34:16 2018 00:34:16 [federated]>select * from test_table.test_table2;
+----+------------+-------+
| id | name | other |
+----+------------+-------+
| 1 | federated2 | 0 |
+----+------------+-------+
1 row in set (0.00 sec)
root@localhost Tue Jun 5 00:34:22 2018 00:34:22 [federated]>select * from federated2;
+----+------------+-------+
| id | name | other |
+----+------------+-------+
| 1 | federated2 | 0 |
+----+------------+-------+
1 row in set (0.00 sec)
root@localhost Tue Jun 5 00:34:28 2018 00:34:28 [federated]>select * from mysql.servers;
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
| Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner |
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
| fedlink | 127.0.0.1 | test_table | test | test | 3306 | | mysql | |
+-------------+-----------+------------+----------+----------+------+--------+---------+-------+
1 row in set (0.00 sec)
# 使用socket方式類似,如果使用socket時(shí),create server連接組合創(chuàng)建方式參照"表記錄內(nèi)容示例"

表字段含義。

Server_name:連接組合唯一標(biāo)識(shí)(即名稱,使用drop server刪除連接組合記錄時(shí),直接指定該表中存在的server_name即可刪除組合記錄,如:drop server server_name;)。

Host:連接組合中的遠(yuǎn)程主機(jī)名(IP或域名),對(duì)應(yīng)create server中的HOST,對(duì)應(yīng)CONNECTION連接組合字符串中的host_name。

Db:連接組合中的遠(yuǎn)程實(shí)例的數(shù)據(jù)庫(kù)名稱,對(duì)應(yīng)create server中的DATABASE ,對(duì)應(yīng)CONNECTION連接組合字符串中的db_name。

Username:連接組合的遠(yuǎn)程實(shí)例用戶名,對(duì)應(yīng)create server中的USER ,對(duì)應(yīng)CONNECTION連接組合字符串中的user_name。

Password:連接組合的遠(yuǎn)程實(shí)例用戶密碼,對(duì)應(yīng)create server中的PASSWORD ,對(duì)應(yīng)CONNECTION連接組合字符串中的password。

Port:連接組合的遠(yuǎn)程實(shí)例端口,對(duì)應(yīng)create server中的PORT ,對(duì)應(yīng)CONNECTION連接組合字符串中的port_num。

Socket:連接組合的本地實(shí)例的socket路徑,對(duì)應(yīng)create server中的SOCKET ,對(duì)應(yīng)CONNECTION連接組合字符串中的host_name。

Wrapper:類似一個(gè)協(xié)議名稱,對(duì)應(yīng)create server中的WRAPPER ,對(duì)應(yīng)CONNECTION連接組合字符串中的scheme。

PS:

CONNECTION字符串方式不會(huì)在mysql.servers表中添加記錄。

到此,關(guān)于“分析mysql系統(tǒng)庫(kù)日志信息記錄表”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

標(biāo)題名稱:分析mysql系統(tǒng)庫(kù)日志信息記錄表
文章地址:http://muchs.cn/article32/gdcgpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)品牌網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站導(dǎo)航網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)