2019-05-13 MySQL數據庫日志與企業(yè)應用實踐

1. MySQL常用日志文件知識

MySQL日志種類

MySQL常用日志種類

默認情況下诺核,以上所有的日志都處于非激活狀態(tài)(Linux環(huán)境)。當激活日志時久信,所有的日志都默認配置在數據文件的目錄下窖杀。管理員也可以對上述日志進行輪詢切割,實現該功能常見的命令是mysqladmin flush-logs裙士、mysqldump的“-F”或“--master-data”參數等入客。

2. 錯誤日志的介紹與配置

1. 錯誤日志的介紹

MySQL的錯誤日志用于記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息。

2. 錯誤日志的記錄配置

MySQL的錯誤日志通常由mysqld或mysqld_safe程序產生腿椎∽懒颍可以利用如下方法配置記錄MySQL錯誤日志。
方法1:在my.cnf配置文件中調整酥诽,注意鞍泉,是在[mysqld_safe]模塊的下面進行配置:

[mysqld_safe]
log_error = /application/mysql-5.6.41/data/oldboy.err

方法2:在啟動MySQL服務的命令里加入記錄錯誤日志的參數:

mysql_safe --log-error=/application/mysql-5.6.41/data/oldboy.err &

注意:沒有該文件的話需要自行創(chuàng)建并賦予mysql權限
查看到的最終結果為:

mysql> show variables like '%log_error%';
+---------------------+-------------------------------------------+
| Variable_name       | Value                                     |
+---------------------+-------------------------------------------+
| binlog_error_action | IGNORE_ERROR                              |
| log_error           | /application/mysql-5.6.41/data/oldboy.err |
+---------------------+-------------------------------------------+
2 rows in set (0.00 sec)
[root@oldboy ~]# tail -4 /application/mysql/data/oldboy.err 
2019-05-05 04:23:24 13047 [Note] Server socket created on IP: '::'.
2019-05-05 04:23:24 13047 [Note] Event Scheduler: Loaded 0 events
2019-05-05 04:23:24 13047 [Note] /application/mysql/bin/mysqld: ready for connections.
Version: '5.6.41-log'  socket: '/application/mysql-5.6.41/tmp/mysql.sock'  port: 3306  Source distribution

3. 錯誤日志輪詢

管理員可以使用命令輪詢錯誤日志,例如可以按天輪詢:

[root@oldboy ~]# cd /application/mysql/data    ---切換到日志目錄下
[root@oldboy data]# mv oldboy.err oldboy_$(date +%F).err    ---將錯誤日志按天移動改名
[root@oldboy data]# mysqladmin flush-logs    ---執(zhí)行刷新日志命令
[root@oldboy data]# ll oldboy.err     ---新的錯誤日志誕生了
-rw-rw----. 1 mysql mysql 0 May  5 04:30 oldboy.err

4. 數據庫故障排查案例分析

新手安裝數據庫時肮帐,遇到數據庫無法啟動時的排查方法具體如下:
1)先清空錯誤日志文件咖驮,然后重新啟動MySQL服務,再查看日志文件報什么錯誤训枢,并根據錯誤日志進行處理托修。
2)如果無法解決,則刪除數據文件恒界,重新初始化數據庫睦刃。
假設在排查故障時,得到的錯誤日志提示為:

180321  17:36:26  InnoDB:Completed initialization of buffer pool
180321  17:36:26    InnoDB:Operating system error number 13 in a file operation.
InnoDB:The error means mysqld does not have the access rights to
InnoDB:the directory.
InnoDB:File name ./ibdata1

根據提示可知十酣,該錯誤是權限問題導致的問題涩拙,可對數據目錄遞歸執(zhí)行權限际长,然后再重啟數據庫:

[root@oldboy data]# chown -R mysql.mysql /application/mysql/data/

3. 普通查詢日志的介紹與配置

1. 普通查詢日志的介紹

普通查詢日志的作用是記錄客戶端連接信息,以及執(zhí)行的SQL語句信息兴泥。

2. 普通查詢日志的功能配置

可能官方考慮到普通查詢日志的重要性比較低工育,因此默認情況下普通查詢日志是關閉狀態(tài):

mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | OFF                                |
| general_log_file | /application/mysql/data/oldboy.log |
+------------------+------------------------------------+
2 rows in set (0.00 sec)

可以執(zhí)行在線修改的命令使其臨時生效:

mysql> set global general_log = on;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | ON                                 |
| general_log_file | /application/mysql/data/oldboy.log |
+------------------+------------------------------------+
2 rows in set (0.03 sec)

如果希望永久生效,則可以把參數寫入my.cnf的配置文件里的[mysqld]模塊下:

general_log = on
general_log_file = /application/mysql-5.6.41/data/oldboy.log

3. 普通查詢日志示例

可在執(zhí)行幾個操作后搓彻,觀察查詢日志文件的變化:

[root@oldboy data]# tail oldboy.log 
/application/mysql/bin/mysqld, Version: 5.6.41-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /application/mysql-5.6.41/tmp/mysql.sock
Time                 Id Command    Argument
190505  5:09:38     3 Query show variables like 'general_log%'
190505  5:10:28     3 Query show variables like 'log_error%'
190505  5:12:52     3 Quit

4. 普通查詢日志的生產使用建議

在高并發(fā)數據庫的場景下如绸,普通查詢日志應該是關閉狀態(tài)的(默認也是關閉的),主要是因為查詢日志的信息量很大旭贬,容易導致磁盤I/O性能問題怔接。當訪問量不是很大,而企業(yè)又有審計執(zhí)行的SQL語句的需求時稀轨,可以考慮開啟該功能扼脐。

4. 二進制日志的介紹與配置

1. 二進制日志的介紹

二進制日志的作用是記錄數據庫里的數據被修改的SQL語句,一般為DDL和DML語句靶端,例如含有insert谎势、update、delete杨名、create、drop猖毫、alter等關鍵字的語句台谍。

2. 二進制日志的作用

二進制日志最重要的作用有2個,具體如下:
第一個是記錄MySQL數據的增量數據吁断,用來做增量數據庫恢復趁蕊,沒有二進制日志功能,MySQL的備份將無法完整還原數據仔役。
第二個是實現主從復制功能掷伙。

3. 二進制日志的配置

[root@oldboy data]# grep log_bin /etc/my.cnf
log_bin
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |    ---記錄binlog開關
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |    ---記錄binlog開關
| sql_log_bin   | ON    |    ---臨時不記錄binlog開關
+---------------+-------+
2 rows in set (0.00 sec)

4. 二進制日志文件的刷新條件

1)數據庫重啟會自動刷新binlog為新文件
2)執(zhí)行“mysqldump -F”或“mysqldump flush-logs”會將binlog刷新為新文件
3)binlog文件達到1GB左右時,會自動刷新binlog為新文件
4)人為配置切割參數及調整
binlog最大值控制參數及默認大小查看方法如下:

mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.03 sec)

5. 二進制日志索引文件

除了很多按序列生成的binlog文件列表之外又兵,還有一個索引文件任柜,例如下文里的oldboy-bin.index:

[root@oldboy logs]# pwd
/application/mysql/logs
[root@oldboy logs]# ll oldboy-bin.*
-rw-rw----. 1 mysql mysql    2409 May  4 11:42 oldboy-bin.000003
-rw-rw----. 1 mysql mysql     611 May  4 13:15 oldboy-bin.000004
-rw-rw----. 1 mysql mysql   69414 May  4 13:17 oldboy-bin.000005
-rw-rw----. 1 mysql mysql 1396515 May  4 13:17 oldboy-bin.000006
-rw-rw----. 1 mysql mysql     143 May  4 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql     120 May  4 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql     143 May  5 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql     168 May  5 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql     211 May  5 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql     378 May  5 04:30 oldboy-bin.index

索引文件的文件名和binlog文件一樣,只是擴展名為index沛厨,查看索引文件內容的命令如下:

[root@oldboy data_ori]# cat oldboy-bin.index 
./oldboy-bin.000001
./oldboy-bin.000002
./oldboy-bin.000003

binlog索引文件的控制參數為:

mysql> show variables like 'log_bin_index';
+---------------+------------------------------------------+
| Variable_name | Value                                    |
+---------------+------------------------------------------+
| log_bin_index | /application/mysql/logs/oldboy-bin.index |
+---------------+------------------------------------------+
1 row in set (0.00 sec)

6. 刪除二進制日志的方法

binlog日志很重要宙地,不能隨意清除。那么如何正確刪除binlog文件呢逆皮?
首先宅粥,要確定什么時候可以刪除binlog。理論上每天的數據庫全備時刻以前的binlog都是無用的电谣,但是工作中我們會根據需要保留3~7天的本地binlog文件秽梅。
以下是具體的刪除方式:
(1)設置參數自動刪除binlog
設置參數自動刪除binlog是每個管理員都應該做的抹蚀。設置示例如下:

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)
mysql> set global expire_logs_days = 7;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 7     |
+------------------+-------+
1 row in set (0.00 sec)

[root@oldboy logs]# grep expir /etc/my.cnf
expire_logs_days = 7

(2)從最開始一直刪除到指定的文件位置(不含指定文件)
這種方法一般用于處理臨時的需求,操作如下:

[root@oldboy logs]# cp oldboy-bin.* /tmp/

登錄數據庫時執(zhí)行如下命令:

mysql> show binary logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| oldboy-bin.000003 |      2409 |
| oldboy-bin.000004 |       611 |
| oldboy-bin.000005 |     69414 |
| oldboy-bin.000006 |   1396515 |
| oldboy-bin.000007 |       143 |
| oldboy-bin.000008 |       120 |
| oldboy-bin.000009 |       143 |
| oldboy-bin.000010 |       168 |
| oldboy-bin.000011 |       211 |
+-------------------+-----------+
9 rows in set (0.00 sec)
mysql> purge binary logs to 'oldboy-bin.000004';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| oldboy-bin.000004 |       611 |    ---序列000004以前的就沒了
| oldboy-bin.000005 |     69414 |
| oldboy-bin.000006 |   1396515 |
| oldboy-bin.000007 |       143 |
| oldboy-bin.000008 |       120 |
| oldboy-bin.000009 |       143 |
| oldboy-bin.000010 |       168 |
| oldboy-bin.000011 |       211 |
+-------------------+-----------+
8 rows in set (0.00 sec)

(3)按照時間刪除binlog日志
這種方法也是用于臨時的需求企垦,操作如下:

[root@oldboy logs]# ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql     611 2019-05-04 13:15 oldboy-bin.000004
-rw-rw----. 1 mysql mysql   69414 2019-05-04 13:17 oldboy-bin.000005
-rw-rw----. 1 mysql mysql 1396515 2019-05-04 13:17 oldboy-bin.000006
-rw-rw----. 1 mysql mysql     143 2019-05-04 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql     120 2019-05-04 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql     143 2019-05-05 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql     168 2019-05-05 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql     211 2019-05-05 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql     336 2019-05-05 13:35 oldboy-bin.index

下面刪除“2019-05-04 13:27”以前的binlog文件:

mysql> PURGE MASTER LOGS BEFORE '2019-05-04 13:27';
Query OK, 0 rows affected (0.08 sec)
mysql> system ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql 143 2019-05-04 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql 120 2019-05-04 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql 143 2019-05-05 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql 168 2019-05-05 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql 211 2019-05-05 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql 210 2019-05-05 13:42 oldboy-bin.index

(4)清除所有的binlog环壤,并從000001開始重新記錄

mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> system ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql 120 2019-05-05 13:44 oldboy-bin.000001
-rw-rw----. 1 mysql mysql  42 2019-05-05 13:44 oldboy-bin.index

下面是binlog相關參數的設置和優(yōu)化思路
使用如下命令可以查看binlog相關參數:

mysql> show variables like 'binlog_%';
mysql> show variables like '%log_bin%';

工作中比較常用的參數:
(1)binlog_cache_size
二進制日志緩存是數據庫為每一個客戶連接分配的內存空間。對于事務引擎來說竹观,適當調整該參數會獲得更好的性能镐捧,該參數的默認值為:

mysql> show variables like '%binlog_cache%';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| binlog_cache_size     | 32768                |
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
2 rows in set (0.00 sec)

(2)max_binlog_size
該參數用于設置binlog日志的最大大小,默認為1GB臭增,但是該值并不能嚴格控制binlog的大小懂酱。若binlog大小接近1GB,而此時又在執(zhí)行一個較大的事務誊抛,那么為了保證事務的完整性列牺,數據庫不會做日志刷新動作,而是直到該事務的日志全部記錄進入當前binlog日志后才會進行刷新拗窃。該參數的默認值查詢結果為:

mysql> show variables like '%max_binlog_size%';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)

(3)sync_binlog
這個參數的作用是控制binlog什么時候同步到磁盤瞎领。對數據庫來說,這是很重要的參數随夸,它不僅會影響數據庫的性能九默,還會影響數據庫數據的完整性。

  • “sync_binlog=0”表示在事務提交之后宾毒,數據庫不會將binlog_cache中的數據刷新到磁盤驼修,而是讓文件系統自行決定什么時候來做刷新或者在緩存滿了之后才刷新到磁盤。
  • “sync_binlog=n”表示每進行n次事務提交之后诈铛,數據庫都會進行一次將緩存數據強制刷新到磁盤的操作乙各。
    該參數默認的設置是0,示例如下:
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.00 sec)

設置為0時數據庫的性能是最好的幢竹,但數據風險也是最大的耳峦,對于數據安全性要求較高的數據庫,應該調整該參數將其改為1焕毫,值得注意的是蹲坷,即使參數設置為1,仍然有binlog記錄的內容與數據庫的實際內容不一致的風險咬荷。

7. 記錄二進制日志的三種模式

(1)語句模式
語句(statement-based)模式是MySQL5.6版本默認的模式冠句,就是每一條被修改的數據的SQL語句都會記錄到master的binlog中。在復制slave庫的時候幸乒,SQL進程會解析成與原來master端執(zhí)行過的相同的SQL來再次執(zhí)行懦底。
該模式的優(yōu)點是不需要記錄細到每一行數據的更改變化,因此,可減少binlog日志量聚唐,實際上是減少了很多丐重,節(jié)約了磁盤I/O,提高了系統性能杆查。而缺點是由于語句模式記錄的是執(zhí)行的SQL語句扮惦,所以,對于某些具有特殊功能的SQL來說亲桦,就可能會導致無法在從庫上正確執(zhí)行崖蜜,從而導致主從庫數據不一致的問題。
例如客峭,當特殊的函數被執(zhí)行時豫领,當觸發(fā)器、存儲過程等特殊功能被執(zhí)行時舔琅,而row level模式是基于每一行來記錄變化的等恐,所以不會出現類似的問題。
(2)行級模式
行級(row-based)模式就是將數據被修改的每一行的情況記錄為一條語句备蚓。
優(yōu)點:在行級模式下课蔬,binlog中可以不記錄執(zhí)行的SQL語句的上下文相關信息,僅僅記錄哪一條記錄被修改了郊尝,修改成什么樣了即可二跋,所以row level的日志內容會非常清楚地記錄下每一行數據修改的細節(jié),非常容易理解流昏。而且不會出現某些特定情況下的存儲過程或function以及trigger的調用和觸發(fā)無法被正確復制的問題同欠。
缺點:行級模式下,所有的執(zhí)行語句都將根據修改的行來記錄横缔,而這就可能會產生大量的日志內容,例如一條語句修改了100萬行衫哥,語句模式就用一條語句即可搞定茎刚,而行級模式執(zhí)行之后,日志中記錄的就是100萬行的修改記錄撤逢,binlog日志的量可能會大得驚人膛锭。
(3)混合模式
混合(mixed-based)模式默認采用語句模式記錄日志,在一些特定的情況下會將記錄模式切換為行級模式記錄蚊荣,這些特殊情況包含但不限于以下情況初狰。

  • 當函數中包含UUID()時
  • 當表中有自增列(AUTO_INCREMENT)被更新時
  • 當FOUND_ROWS()、ROW_COUNT()互例、USER()奢入、CURRENT_USER()、CURRENT_USER等執(zhí)行時媳叨。

8. 企業(yè)中如何選擇二進制日志模式

在互聯網公司中腥光,使用MySQL的特殊功能比較少(存儲過程关顷、觸發(fā)器、函數)武福,此時可以選擇默認的語句模式议双。
如果公司較多用到MySQL的特殊功能,如存儲過程捉片、觸發(fā)器平痰、函數等,并且需要做主從復制請首選行級模式伍纫,次選mixed模式宗雇。

9. 二進制日志的模式配置調整

臨時調整命令如下:

mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

永久調整可以將“binlog_format='模式名'”寫入到my.cnf配置文件中,并重啟服務翻斟。

10. 行級模式二進制日志實際讀取示例

當在數據庫中執(zhí)行如下語句:

mysql> SET GLOBAL binlog_format = 'ROW';

或者在my.cnf中加入binlog_format = 'ROW'配置生效后逾礁,此時如果更新或者刪除多行數據就會發(fā)現binlog日志記錄的內容有所不同,具體命令如下:

[root@oldboy ~]# mysqlbinlog --base64-output=decode-rows -v oldboy-bin.000001
--- --base64-output=decode-rows -v以行級模式解析binlog日志

5. 慢查詢日志

1. 慢查詢日志介紹

慢查詢(slow query log)就是記錄執(zhí)行時間超出指定值(long_query_time)或其他指定條件(例如访惜,沒有使用到索引嘹履,結果集大于1000行)的SQL語句。

2. 慢查詢日志相關參數說明

慢查詢的參數债热,對于數據庫SQL的優(yōu)化非常重要砾嫉,是SQL優(yōu)化的前提。

慢查詢的參數及說明

3. 慢查詢日志重要參數配置

企業(yè)中常見的配置慢查詢的參數為:

slow-query-log = ON    ---慢查詢開啟開關
long_query_time = 2    ---記錄大于2秒的SQL語句
log_queries_not_using_indexes = ON    ---沒有使用到索引的SQL語句
slow-query-log-file = /application/mysql/slow.log    ---記錄慢SQL語句的文件
min_examined_row_limit = 800    ---記錄結果集大于800行的SQL語句

可將上述參數配置到my.cnf里窒篱,配置完畢重啟MySQL服務焕刮,并進行檢查:

mysql> show variables like 'slow_query%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_query_log      | ON                               |    ---開關已打開
| slow_query_log_file | /application/mysql/logs/slow.log |    ---文件路徑已生效
+---------------------+----------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like '%long_query%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 2.000000 |    ---記錄大于2秒的查詢已生效
+-----------------+----------+
1 row in set (0.00 sec)
mysql> show variables like '%log_queries_not%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON    |    ---記錄沒有使用索引的查詢已生效
+-------------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%min_examined_row_limit%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| min_examined_row_limit | 800   |    ---記錄查詢結果集大于800行的SQL已生效
+------------------------+-------+
1 row in set (0.00 sec)

4. 慢查詢日志的刷新方法

在工作中,可以利用定時任務按天對慢查詢日志進行切割墙杯,然后再分析配并。
示例切割腳本如下:

[root@oldboy scripts]# cat cut_slow_log.sh 
#!/bin/bash
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /application/mysql/logs &&\
mv slow.log slow.log.$(date +%F)&&\
mysqladmin flush-log

將上述腳本放入定時任務,每天0點執(zhí)行切割任務高镐,配置結果如下:

[root@oldboy scripts]# tail -2 /var/spool/cron/root 
#cut mysql slow log by oldboy at 20190522
00 00 * * * /bin/sh /server/scripts/cut_slow_log.sh > /dev/null 2>&1

5. 使用工具分析慢查詢日志案例

實際工作中溉旋,慢查詢的日志可能非常多,給運維人員的優(yōu)化工作帶來了一定的困難嫉髓,MySQL官方提供了慢查詢的分析工具mysqldumpslow观腊。
下面介紹一款很不錯的第三方分析工具mysqlsla(需要單獨安裝該工具)。
(1)安裝mysqlsla
下載好mysqlsla-2.03.tar.gz到指定目錄下算行,然后執(zhí)行如下命令安裝:

yum install perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
tar xf mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install

(2)利用mysqlsla工具分析慢查詢
mysqlsla命令的默認路徑為:/usr/local/bin/mysqlsla
在實際工作中梧油,通常使用腳本調用mysqlsla工具進行分析,然后每天早晨8點州邢,把分析結果發(fā)給企業(yè)的核心人員(DBA儡陨、運維總監(jiān)、CTO、研發(fā)總監(jiān)迄委、核心開發(fā))褐筛,最后由DBA配合核心開發(fā)共同優(yōu)化這些棘手的SQL慢查詢。
簡單的案例腳本如下叙身,注意切割日志和分析合并為一個腳本了:

[root@oldboy mysqlsla]# cat /server/scripts/slow_log_analyze.sh 
#!/bin/bash
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
Date=`date +%F -d -1day`

#cut slow log
cd /application/mysql/logs &&\
mv slow.log slow.log_$Date &&\
mysqladmin flush-log

#analyze slow log
Time=`date +%F`
Path=/usr/local/bin
cd /application/mysql &&\
$Path/mysqlsla -lt slow slow.log_$Date > analyzed_slow_$Date.log 2>&1

#rsync analyzed_slow to backup server    ---省略了此步
#send analyzed slow log to administator on backup server by mail.    ---省略了此步

將上述腳本放入定時任務渔扎,每天0點執(zhí)行切割任務,配置結果如下:

[root@oldboy mysqlsla]# tail -2 /var/spool/cron/root 
#analyzed mysql slow log by oldboy at 20190523
00 00 * * * /bin/sh /server/scripts/slow_log_analyze.sh > /dev/null 2>&1

當然還可以把日志收集到數據庫中或者使用ELK等流行工具收集慢查詢日志信轿,最后分析后可視化展現晃痴。

可視化展示圖
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市财忽,隨后出現的幾起案子倘核,更是在濱河造成了極大的恐慌,老刑警劉巖即彪,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紧唱,死亡現場離奇詭異,居然都是意外死亡隶校,警方通過查閱死者的電腦和手機漏益,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來深胳,“玉大人绰疤,你說我怎么就攤上這事∥柚眨” “怎么了轻庆?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敛劝。 經常有香客問我余爆,道長,這世上最難降的妖魔是什么夸盟? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任龙屉,我火速辦了婚禮,結果婚禮上满俗,老公的妹妹穿的比我還像新娘。我一直安慰自己作岖,他們只是感情好唆垃,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痘儡,像睡著了一般辕万。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天渐尿,我揣著相機與錄音醉途,去河邊找鬼。 笑死砖茸,一個胖子當著我的面吹牛隘擎,可吹牛的內容都是我干的。 我是一名探鬼主播凉夯,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼货葬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劲够?” 一聲冷哼從身側響起震桶,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎征绎,沒想到半個月后蹲姐,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡人柿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年柴墩,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷扩。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拐邪,死狀恐怖,靈堂內的尸體忽然破棺而出隘截,到底是詐尸還是另有隱情扎阶,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布婶芭,位于F島的核電站东臀,受9級特大地震影響,放射性物質發(fā)生泄漏犀农。R本人自食惡果不足惜惰赋,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呵哨。 院中可真熱鬧赁濒,春花似錦、人聲如沸孟害。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挨务。三九已至击你,卻和暖如春玉组,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁侄。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工惯雳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸿摇。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓石景,卻偏偏與公主長得像,于是被迫代替她去往敵國和親户辱。 傳聞我的和親對象是個殘疾皇子鸵钝,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容