Mysql數據庫日志


 


Mysql數據庫日志

日志分類

MySql日志類型 解析說明
錯誤日志(error log) 當數據庫啟動、運行、停止時產生該日志
普通查詢日志(general query log) 客戶端連接數據庫執行語句時產生該日志
二進制日志(binary log) 當數據庫內容發生改變時產生該日志,也被用來實現主從復制功能
中繼日志(relay log) 從庫上收到主庫的數據更新時產生該日志
慢查詢日志(show query log) SQL語句在數據庫查詢超過指定時間時產生該日志
DDL日志(metadata log) 執行DDL語句操作元數據時產生該日志

1、錯誤日志

錯誤日志說明

Mysql的錯誤日志用於記錄mysql服務進程mysqld在啟動、關閉或運行過程中遇到的錯誤信息。
通常由mysqld或mydql_safe程序產生。
 

錯誤日志的配置

配置方法:
1、在my.cnf配置文件的[mysql_safe]模塊下配置
[mysql_safe]
log-error=/application/mysql-5.6.36/data/mysql-2.err
2、在啟動mysql服務的命令中添加錯誤日志的參數
mysqld_safe --log-error=/application/mysql-5.6.36/data/mysql-2.err &
查看日志結果:
 

[root@mysql-2 ~]# tail -n 4 /application/mysql-5.6.36/data/mysql-2.err 
2019-06-15 03:08:26 28735 [Note] Server socket created on IP: '::'.
2019-06-15 03:08:26 28735 [Note] Event Scheduler: Loaded 0 events
2019-06-15 03:08:26 28735 [Note] /application/mysql-5.6.36/bin/mysqld: ready for connections.
Version: '5.6.36-log'  socket: '/application/mysql-5.6.36/tmp/mysql.sock'  port: 3306  Source distribution
 

錯誤日志輪詢

管理員可以使用命令來輪詢錯誤日志,按天輪詢
#進入日志目錄
[root@mysql-2 ~]# cd /application/mysql-5.6.36/data/
#將錯誤日志移動改名
[root@mysql-2 data]# mv mysql-2.err mysql-2_$(date +%F).err
#執行刷新日志命令
[root@mysql-2 data]# mysqladmin flush-logs
#查看新的錯誤日志
[root@mysql-2 data]# ls -l *.err
-rw-rw---- 1 mysql mysql 28491 Jun 15 03:08 mysql-2_2019-06-15.err
-rw-rw---- 1 mysql mysql     0 Jun 15 10:17 mysql-2.err
 

安裝數據庫故障排除

安裝完成新數據庫無法啟動
1、先清空錯誤日志,啟動mysql數據庫,查看錯誤日志內的錯誤信息經行處理
2、初始化參數錯誤,刪除數據文件,重新初始化數據庫
 

 

2、普通查詢日志

普通查詢日志說明

普通查詢日志的作用是記錄客戶端的連接信息及執行的SQL語句信息。
 

普通查詢日志的配置

普通查詢日志的重要性很低,默認情況下該日志是關閉的
mysql> show variables like '%general_log%';
+------------------+--------------------------------------------+
| Variable_name    | Value                                      |
+------------------+--------------------------------------------+
| general_log      | OFF                                        |
| general_log_file | /application/mysql-5.6.36/data/mysql-2.log |
+------------------+--------------------------------------------+
2 rows in set (0.00 sec)
如果希望永久開啟,在my.cnf的[mysqld]模塊下配置
[mysqld]
general_log=on
general_log_file=/application/mysql-5.6.36/data/mysql_gerenal.log
執行幾條命令后,查看普通日志
[root@mysql-2 ~]# tail /application/mysql/data/mysql-2_general.log 
/application/mysql-5.6.36/bin/mysqld, Version: 5.6.36-log (Source distribution). started with:
Tcp port: 0  Unix socket: (null)
Time                 Id Command    Argument
[root@mysql-2 ~]# tail /application/mysql/data/mysql-2_general.log 
190615 15:13:03   1 Connect root@localhost on 
    1 Query select @@version_comment limit 1
190615 15:13:10   1 Query SELECT DATABASE()
    1 Init DB test
    1 Query show databases
    1 Query show tables
    1 Field List stu 
    1 Field List test 
    1 Field List test1 
190615 15:13:18   1 Query show tables
在高並發數據庫的場景下,建議關閉普通查詢日志(默認為關閉),因為查詢日志的信息量很大,容易導致磁盤I/O性能問題。當訪問量不是很大,企業又有審計執行的SQL語句的需求時,可以考慮開啟。
 

3、二進制日志

二進制日志的說明

二進制日志的時記錄數據庫里的數據被修改的SQL語句,一般為DDL和DML語句,例如:insert、update、delete、create、drop、alter等關鍵字的語句。
具體作用:
1、記錄mysql數據的增量數據,用來做增量數據庫恢復,沒有二進制日志功能,mysql的備份將無法完成的還原數據
2、實現主從復制
 

二進制日志的配置

二進制日志實在my.cnf的[mysqld]模塊下配置
[mysqld]
log-bin=/application/mysql-5.6.36/data/mysql-bin
binlog_format=row  
binlog_format
mysql復制主要有三種方式:基於SQL語句的復制(statement-based replication, SBR),基於行的復制(row-based replication, RBR),混合模式復制(mixed-based replication, MBR)。對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED。

① STATEMENT模式(SBR)

每一條會修改數據的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日志量,節約IO,提高性能。缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)

② ROW模式(RBR)

不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什么樣了。而且不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確復制的問題。缺點是會產生大量的日志,尤其是alter table的時候會讓日志暴漲。

③ MIXED模式(MBR)

以上兩種模式的混合使用,一般的復制使用STATEMENT模式保存binlog,對於STATEMENT模式無法復制的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日志保存方式。
 
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------+
| Variable_name                   | Value                                   |
+---------------------------------+-----------------------------------------+
| log_bin                         | ON  #記錄binlog開關                                   |
| sql_log_bin                     | ON  #臨時不記錄binlog開關                               
+---------------------------------+-----------------------------------------+

sql_log_bin可是臨時關閉binlog,只是當前session窗口有效,不影響其他會話

mysql> set sql_log_bin=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------+
| Variable_name                   | Value                                   |
+---------------------------------+-----------------------------------------+
| log_bin                         | ON                                      |
| log_bin_basename                | /application/mysql/data/mysql-bin       |
| log_bin_index                   | /application/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                     |
| log_bin_use_v1_row_events       | OFF                                     |
| sql_log_bin                     | OFF                                     |
+---------------------------------+-----------------------------------------+
6 rows in set (0.00 sec)

重新開啟一個session會話窗口
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------+
| Variable_name                   | Value                                   |
+---------------------------------+-----------------------------------------+
| log_bin                         | ON                                      |
| log_bin_basename                | /application/mysql/data/mysql-bin       |
| log_bin_index                   | /application/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                     |
| log_bin_use_v1_row_events       | OFF                                     |
| sql_log_bin                     | ON                                      |
+---------------------------------+-----------------------------------------+
6 rows in set (0.00 sec)

該會話下sql_log_bin=ON開啟的
查看sql_log_bin=OFF是否生效

mysql> set sql_log_bin=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |       376 |
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       120 | ###最新的binlog文件及位置點
+------------------+-----------+
4 rows in set (0.00 sec)

mysql> create database king;
Query OK, 1 row affected (0.00 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |       376 |
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       120 |###最新的binlog文件及位置點
+------------------+-----------+
4 rows in set (0.00 sec)

binlog日志沒有變化

mysql> system mysqlbinlog mysql-bin.000004|grep king;
mysql>
過濾binlog文件,沒有記錄binlog
開啟sql_log_bin=ON

mysql> set sql_log_bin=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> drop database king;
Query OK, 0 rows affected (0.17 sec)

mysql> system mysqlbinlog mysql-bin.000004|grep king;
drop database king
mysql> 
發現了有記錄的binlog
sql_bin_log的功能實在用戶使用mysql恢復數據時,不希望恢復的數據SQL記錄到binLog里面

二級制日志文件的刷新條件

1、數據庫重啟會自動刷新binlog新文件
2、執行"mysqldump -F" 或"mysqladmin 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.00 sec)

二進制日志索引文件

二進制日志除了很多按序列生成的binlog文件列表外,還有一個索引文件

[root@mysql-2 data]# pwd
/application/mysql-5.6.36/data
[root@mysql-2 data]# ls -l mysql-bin*
-rw-rw---- 1 mysql mysql 143 Jun 15 03:08 mysql-bin.000001
-rw-rw---- 1 mysql mysql 376 Jun 15 10:17 mysql-bin.000002
-rw-rw---- 1 mysql mysql 143 Jun 15 15:12 mysql-bin.000003
-rw-rw---- 1 mysql mysql 299 Jun 15 15:49 mysql-bin.000004
-rw-rw---- 1 mysql mysql 164 Jun 15 15:12 mysql-bin.index

索引文件名與binlog文件一樣,只是擴展名為index,索引文件的內容
[root@mysql-2 data]# cat mysql-bin.index 
/application/mysql/data/mysql-bin.000001
/application/mysql/data/mysql-bin.000002
/application/mysql/data/mysql-bin.000003
/application/mysql/data/mysql-bin.000004

binlog索引文件的控制參數、
mysql> show variables like 'log_bin_index';
+---------------+-----------------------------------------+
| Variable_name | Value                                   |
+---------------+-----------------------------------------+
| log_bin_index | /application/mysql/data/mysql-bin.index |
+---------------+-----------------------------------------+
1 row in set (0.00 sec)

刪除二進制日志的方法(謹慎操作!!!)

binlog日志很重要,不要隨意刪除。
確定什么時候可以刪除binlog
每天的數據庫**全備時刻**,以前的binlog無用了,實際企業中需要保留3-7天的本地binlog文件按。
方法1:
設置參數自動刪除binlog
expire_logs_days = 7 ##設置刪除7天前的日志
默認該參數是沒有配置的
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)

方法2:
從最開始一直刪除到指定的文件位置(不含指定文件)
一般用於處理臨時的需求

做一個備份
[root@mysql-2 data]# cp mysql-bin.* /tmp

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       143 |
| mysql-bin.000002 |       376 |
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       299 |
+------------------+-----------+
4 rows in set (0.00 sec)

刪除到mysql-bin.000002的binlog(不包含mysql-bin.000002)
只刪除mysql-bin.000001

mysql> purge binary logs to 'mysql-bin.000002';
Query OK, 0 rows affected (0.00 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000002 |       376 |  #####000002以前的就沒有了
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       299 |
+------------------+-----------+
3 rows in set (0.00 sec)

方法3:
按照時間刪除binlog日志
用於處理臨時需求

[root@mysql-2 data]# ls -l --time-style=long-iso mysql-bin*
-rw-rw---- 1 mysql mysql 376 2019-06-15 10:17 mysql-bin.000002
-rw-rw---- 1 mysql mysql 143 2019-06-15 15:12 mysql-bin.000003
-rw-rw---- 1 mysql mysql 299 2019-06-15 15:49 mysql-bin.000004
-rw-rw---- 1 mysql mysql 123 2019-06-15 16:15 mysql-bin.index

刪除"2019-06-15:23"刪除mysql-bin.000002和mysql-bin.000003
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000002 |       376 |
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       299 |
+------------------+-----------+
3 rows in set (0.00 sec)

mysql> system ls -l --time-style=long-iso mysql-bin*;
-rw-rw---- 1 mysql mysql 376 2019-06-15 10:17 mysql-bin.000002
-rw-rw---- 1 mysql mysql 143 2019-06-15 15:12 mysql-bin.000003
-rw-rw---- 1 mysql mysql 299 2019-06-15 15:49 mysql-bin.000004
-rw-rw---- 1 mysql mysql 123 2019-06-15 16:15 mysql-bin.index

mysql> purge master logs before '2019-06-15:23';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> system ls -l --time-style=long-iso mysql-bin*;
-rw-rw---- 1 mysql mysql 299 2019-06-15 15:49 mysql-bin.000004
-rw-rw---- 1 mysql mysql  41 2019-06-15 16:22 mysql-bin.index

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 |       299 |
+------------------+-----------+
1 row in set (0.00 sec)
方法4:
刪除所有的binlog,並從000001開始重新記錄
reset master命令可以清楚所欲的binlog文件,並從000001開始重新記錄

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 |       299 |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> reset master;
Query OK, 0 rows affected (0.01 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> system ls -l --time-style=long-iso mysql-bin*;
-rw-rw---- 1 mysql mysql 120 2019-06-15 16:26 mysql-bin.000001
-rw-rw---- 1 mysql mysql  41 2019-06-15 16:26 mysql-bin.index

binlog的常用相關參數

查看binlog相關參數
mysql> show variables like 'binlog_%';
+-----------------------------------------+--------------+
| Variable_name                           | Value        |
+-----------------------------------------+--------------+
| binlog_cache_size                       | 32768        |
| binlog_checksum                         | CRC32        |
| binlog_direct_non_transactional_updates | OFF          |
| binlog_error_action                     | IGNORE_ERROR |
| binlog_format                           | ROW          |
| binlog_gtid_simple_recovery             | OFF          |
| binlog_max_flush_queue_time             | 0            |
| binlog_order_commits                    | ON           |
| binlog_row_image                        | FULL         |
| binlog_rows_query_log_events            | OFF          |
| binlog_stmt_cache_size                  | 32768        |
| binlogging_impossible_mode              | IGNORE_ERROR |
+-----------------------------------------+--------------+
12 rows in set (0.00 sec)

mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------------------+
| Variable_name                   | Value                                   |
+---------------------------------+-----------------------------------------+
| log_bin                         | ON                                      |
| log_bin_basename                | /application/mysql/data/mysql-bin       |
| log_bin_index                   | /application/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                     |
| log_bin_use_v1_row_events       | OFF                                     |
| sql_log_bin                     | ON                                      |
+---------------------------------+-----------------------------------------+
6 rows in set (0.00 sec)

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,而此時又在執行一個較大的事務,那么為了保證事務的完整性,數據庫不會做日志刷新動作,而是直到該事務的日志全部記錄進入當前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”參數的說明具體如下。
·“sync_binlog=0”表示在事務提交之后,數據庫不會將binlog_cache中的數據刷新到磁盤,而是讓文件系統自行決定什么時候來做刷新或者在緩存滿了之后才刷新到磁盤。
·“sync_binlog=n”表示每進行n次事務提交之后,數據庫都會進行一次將緩存數據強制刷新到磁盤的操作。
該參數默認的設置是0,示例如下:
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)
設置為0時數據庫的性能是最好的,但數據風險也是最大的,對於數據安全性要求較高的數據庫,應該調整該參數將其改為1,值得注意的是,即使參數設置為1,仍然有binlog記錄的內容與數據庫的實際內容不一致的風險。

可以在my.cnf下的[mysqld]模塊設置
[mysqld]
sync_binlog=1

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

(1)語句(statement-based)模式是MySQL5.6版本默認的模式,簡單地說,就是每一條被修改的數據的SQL語句都會記錄到master的binlog中。在復制slave庫的時候,SQL進程會解析成與原來master端執行過的相同的SQL來再次執行。
該模式的優點是不需要記錄細到每一行數據的更改變化,因此,可減少binlog日志量,實際上是減少了很多,節約了磁盤I/O,提高了系統性能。
但該模式同樣有一些缺點,由於語句模式記錄的是執行的SQL語句,所以,對於某些具有特殊功能的SQL語句來說,就可能會導致無法在從庫上正確執行,從而導致主從庫數據不一致的問題。
例如,當特殊的函數被執行時,當觸發器、存儲過程等特殊功能被執行時,而row level模式是基於每一行來記錄變化的,所以不會出現類似的問題
(2)行級模式
簡單地說,行級(row-based)模式就是將數據被修改的每一行的情況記錄為一條語句。
優點:在行級模式下,binlog中可以不記錄執行的SQL語句的上下文相關信息,僅僅記錄哪一條記錄被修改了,修改成什么樣了即可,所以row level的日志內容會非常清楚地記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程或function以及trigger的調用和觸發無法被正確復制的問題。
缺點:行級模式下,所有的執行語句都將根據修改的行來記錄,而這就可能會產生大量的日志內容,例如一條語句修改了100萬行,語句模式就用一條語句即可搞定,而行級模式執行之后,日志中記錄的就是100萬行的修改記錄,binlog日志的量可能會大得驚人。
(3)混合模式
混合(mixed-based)模式默認采用語句模式記錄日志,在一些特定的情況下會將記錄模式切換為行級模式記錄,這些特殊情況包含但不限於以下情況。
當函數中包含UUID()時。
當表中有自增列(AUTO_INCREMENT)被更新時。
·當執行觸發器(trigger)或者存儲過程(stored function)等特殊功能時。
·當FOUND_ROWS()、ROW_COUNT()、USER()、CURRENT_USER()、CURRENT_USER等執行時。

二進制日志模式的選擇

在互聯網公司中,使用MySQL的特殊功能比較少(存儲過程、觸發器、函數),此時可以選擇默認的語句模式。
如果公司較多用到MySQL的特殊功能,如存儲過程、觸發器、函數等,並且需要做主從復制請首選行級模式,次選mixed模式。

二進制日志模式的配置

臨時配置
mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

永久配置
在my.cnf的mysqld模塊下配置
[mysqld]
binlog_format=statement
binlog_format=row
binlog_format=mixed

行模式二進制日志實際讀取

mysql> use test;
mysql> INSERT INTO test1 values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+
2 rows in set (0.00 sec)

[root@mysql-2 data]# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001
#<==--base64-output=decode-rows -v以行級模式解析binlog日志。
.......
BEGIN
/*!*/;
# at 192
#190615 19:17:34 server id 1  end_log_pos 243 CRC32 0x35c8b48a 	Table_map: `test`.`test1` mapped to number 72
# at 243
#190615 19:17:34 server id 1  end_log_pos 292 CRC32 0x3d5c2369 	Write_rows: table id 72 flags: STMT_END_F
### INSERT INTO `test`.`test1`
### SET
###   @1=1
###   @2='a'
### INSERT INTO `test`.`test1`
### SET
###   @1=2
###   @2='b'
# at 292
#190615 19:17:34 server id 1  end_log_pos 323 CRC32 0x3e0a646e 	Xid = 61
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@mysql-2 data]# 

4、慢查詢日志

慢查詢日志說明

慢查詢日志(slow query log)是記錄執行時間超出指定值(long_query_time)或其它地址條件(如:沒有使用索引,結果集大於10000行)的SQL語句

慢查詢日志的參數說明

慢查詢參數 解釋說明
slow_query_log 慢查詢開啟開關,默認為”OFF“
slow-query-log-file 記錄慢查詢語句的文件,文件名如"hostname-slow.log"
long_query_time 記錄大於指定N秒的SQL語句,默認為10s,也可以使用微秒單位
log_queries_not_using_indexes 記錄沒有使用到索引的SQL語句,默認為"OFF"
min_examined_row_limit 記錄結果大於N行的SQL語句,默認為0行
log_slow_admin_statements 記錄管理的慢SQL語句,如:alter table, analyze table, check table, create table, create index, drop index, optimize table, repair table
log_throttle_queries_not_using_indexes 限制每分鍾寫入記錄的慢SQL語句的數量,默認為"0",表示沒有限制

企業中常見的慢查詢配置參數

在my.cnf的[mysqld]模塊下配置
[mysqld]
slow-query-log = ON                        #<==慢查詢開啟開關
long_query_time = 2                        #<==記錄大於2秒的SQL語句。
log_queries_not_using_indexes = ON         #<==沒有使用到索引的SQL語句。
slow-query-log-file = /application/mysql-5.6.36/slow.log  #<==記錄SQL語句的文件。
min_examined_row_limit = 800               #<==記錄結果集大於800行的SQL語句。
測試檢查

mysql> show variables like 'slow_query%';
+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_query_log      | ON                          | #開啟慢查詢日志
| slow_query_log_file | /application/mysql-5.6.26/slow.log | #文件路徑
+---------------------+-----------------------------+
2 rows in set (0.00 sec)

mysql> show variables like '%long_query%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 2.000000 | #記錄大於2s的查詢
+-----------------+----------+
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)

慢查詢日志的刷新方法

cd /application/mysql-5.6.36/
mv slow.log slow.log.$(date +%F)
mysqladmin flush-log

制作腳本放入定時任務
腳本:
在/server/scripts下創建腳本
vim /erver/scripts/cut_slow_log.sh
#!/bin/bash
export PATH=/application/mysql-5.6.36/bin:/sbin:/bin:/usr/bin:/usr/sbin
cd /application/mysql-5.6.35
mv slow.log slow.log.$(date +%F)
mysqladmin flush-log
放入定時任務
[root@mysql-2 data]# crontab -e
#cut mysql slow log
00 00 * * * /bin/sh /erver/scripts/cut_slow_log.sh

分析慢查詢日志的工具案例

(1)mysqlsla安裝
請提前下載好mysqlsla-2.03.tar.gz到指定目錄下,然后執行如下命令安裝:
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 -lt slow [SlowLogFilePath] > [ResultFilePath]
在實際工作中,老男孩通常使用腳本調用mysqlsla工具進行分析,然后每天早晨8點,把分析結果發給企業的核心人員(DBA、運維總監、CTO、研發總監、核心開發),最后由DBA配合核心開發共同優化這些棘手的SQL慢查詢。
簡單的案例腳本如下,注意切割日志和分析合並為一個腳本了:

vim /server/scripts/slow_log_analyze.sh
#!/bin/bash
export PATH=/application/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin
Date=$(date +%F -d -1day)
#cut slow log
cd /application/mysql/
mv slow.log slow.log_$Date
mysqladmin flush-log
#analyze slow log
Path=/usr/local/bin/mysqlsla
cd /application/mysql
$Path/mysqlsla -lt slow slow.log_$Date > analyzed_slow_$Dste.log 2>&1
#rsync analyzed_slow to backup server 省略此步
#send analyzed slow log to administrator on backup server by mail. 省略此步
定時任務
crontab -e
00 00 * * * /bin/sh /server/scripts/slow_log_analyze.sh
mysqldumpslow命令

mysqldumpslow -s c -t 10 /data/slow/slow.log
mysqldumpslow -s at -t 10 /data/slow/slow.log


這會輸出記錄次數最多的10條SQL語句,
其中:
-s
是表示按照何種方式排序
c、t、l、r分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序。
ac、at、al、ar,表示相應的倒敘。
-t
是top n的意思,即為返回前面多少條的數據;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM