day06-02-日志管理

日志参数

错误日志:

--log-error=/path/file_name.log.err

常规日志:

--general_log=/path/file_name.log

慢查询:(程序:mysqldumpslow)

--slow_query_log = /path/file_name-slow.log
--long_query_time =  /path/file_name-slow.log

二进制日志(程序:mysqlbinlog)

--log-bin=/path/file_name-bin.000001
--expire-log-days = 7 (days)

审计

--audit_log = /path/file_name-audit.log
--audit_log_file

生产环境重点关注:

错误日志: --log-erro

慢查询:--slow_query_log --long_query_time

二进制:--bin-log --expire-logs-days


1.错误日志

1.1作用

排查mysql运行过程的故障。

1.2配置

默认开启

默认路径和名字

--datadir= /path/hostname.err

内容关键字:grep -e '\[ERROR\]' /path/file_name.log.err

1.3人为定制位置

select @@log_error;
vi my.cnf
[mysqld]
log_error = /path/file_name.err

2.二进制日志(binlog)(非常重要)

2.1 作用

(1)主从要依赖二进制日志

(2)数据恢复时需要依赖于二进制日志

(3) binlog是SQL层的逻辑日志,主要是记录数据行的变化或者语句本身

2.2如何配置

默认不开启(5.7必须加server_id)

server_id = [1-65535]
log_bin = 1 # 打开二进制开关,日志存放于data指定目录
log_bin = /path/binlog/mysql-bin	#一般使用这个配置,指定具体位置及文件名
binlog_format = row #5.7 版本以后,默认就是row
sync_binlog = 1

注意:MySQL8.0之前,默认是没有开启二进制日志的。
基础参数查看:
开关:
[(none)]>select @@log_bin;
日志路径及名字
[(none)]>select @@log_bin_basename;
服务ID号:
[(none)]>select @@server_id;
二进制日志格式:
[(none)]>select @@binlog_format;
双一标准之二:
[(none)]>select @@sync_binlog;

双“一”标准之二(非常非常重要)

sync_binlog =1

作用:每次事务提交,都立即刷写到binlog到磁盘。

即每次提交MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘

2.3 二进制日志记录了是么?

2.3.1概括

记录数据库所有变更类的操作日志,且一定是commit 提交成功的事务

DDL,DCL,DML

2.3.2 DDL 和 DCL

已语句的方式,原模原样的记录


2.3.3 DML

(1)记录已提交的事务

记录SQL语句种类

DDL:原封不动的记录当前DDL(statement语句方式)。
DCL:原封不动的记录当前DCL(statement语句方式)。
DML:只记录已经提交的事务DML(insert,update,delete)

(2)DML记录格式(statement,row,mixd)

通过binlot_format=row 参数控制,这个参数只能控制DML语句。 DDL/DCL 一点作用都没有,仍然以语句的方式记录。

说明:

statement(5.6默认)SBR(statement based replication),SBR: 语句模式,语句模式记录SQL,做什么就记录说明。

ROW(5.7默认值)RBR(ROW based replication): RBR,行模式,记录数据行的变化。比如:update set 1=2 ,记录数据如何改变,逻辑层面的。(redo 记录的是数据页变化,别搞混了)

mixed(混合)MBR(mixed based replication)模式,有mysql自己决定,不可控。


面试题:

SBR 和 RBR 说明区别? 怎么选择?

SBR:可读性较强,对于范围操作,日质量少。但是可能会出现记录不准确。

update t1 set name='zs' where id>5;

id大于5的数据行改变,SBR模式只记录这一条语句。

缺点:

比如:insert into t1 values(1,'zs',now()); now()会记录当时业务发生时的时间点,如果做数据恢复的话,这个now()就会获得现在的时间点

RBR:可读性强,对于范围操作日志量大,不会出现记录错误。

		在一些高可用环境或某些架构中,新特性要依赖于RBR模式,必须使用。

公司业务对数据严谨性高,所以会选择RBR

SBR 和 RBR 说明区别? 怎么选择?

比如现在进行update 100行数据的更新操作,where id>1000;

RBR记录每一行数据的变化。

SBR只记录一条执行语句。

怎么选择?

SBR 可能会记录错误的日志,日志记录会有偏差,时间函数举例。


2.4 二进制日志记录单元

2.4.1 event 事件

二进制日志中,最小记录单元是 事件 event。

DDL:create database db_name;

对于DDL等语句,每个语句就是一个事件。

DML:一个事务包含多个语句

begin: 事件1

a 事件2

b 事件3

commit; 事件4

2.4.2 event 事件的开始和结束

作用:方便从日志截取想要的日志事件

2.5二进制日志的管理

2.5.1查看二进制日志位置

show variables like '%log_bin%';

root@localhost 10:48:55->show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name                   | Value                              |
+---------------------------------+------------------------------------+
| log_bin                         | ON                                 |
| log_bin_basename                | /data/mysql/binlog/mysql-bin       |
| log_bin_index                   | /data/mysql/binlog/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.01 sec)

root@localhost 10:49:00->

2.5.2 查看所有已存在的二进制日志

show binary logs;

flush logs;

2.5.3 查看正在使用的二进制日志

show master status;

2.5.4 查看二进制日志事件

先查看当前使用是哪个 binlog文件

root@localhost 10:57:31->show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      328 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

root@localhost 10:58:57->

然后查看事件内容:

show binlog events in 'mysql-bin.000002';

show binlog events in 'mysql-bin.000002' limit 5;

root@localhost 10:58:58->show binlog events in 'mysql-bin.000002';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                      |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
| mysql-bin.000002 |   4 | Format_desc    |      3306 |         123 | Server ver: 5.7.26-log, Binlog ver: 4     |
| mysql-bin.000002 | 123 | Previous_gtids |      3306 |         154 |                                           |
| mysql-bin.000002 | 154 | Anonymous_Gtid |      3306 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'      |
| mysql-bin.000002 | 219 | Query          |      3306 |         328 | use `simon_test`; create table t1(id int) |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
4 rows in set (0.00 sec)

root@localhost 10:59:19->

内容解析:

前两行是二进制文件的“头”格式

POS:事件起始号码

End_log_pos:事件结束号码

截取事务,一定是从begin到commit,这才是一个完整的事务。

2.5.5 查看二进制日志内容

[root@mysql-node01 binlog]# mysqlbinlog --base64-output=decode-rows -vvv ./mysql-bin.000002
--base64-output=decode-rows #转码翻译,方便阅读
-vvv #详细信息
[root@mysql-node01 binlog]# mysqlbinlog -d db_name 		#查看指定数据库

插入几行数据:

mysql -e 'insert into simon_test.t1 values(1),(2),(3);commit;'

查看内容

mysqlbinlog --base64-output=decode-rows -vvv #这个转码翻译后的内容只是为了方便阅读,并不能做日志恢复

[root@mysql-node01 binlog]# pwd
/data/mysql/binlog
[root@mysql-node01 binlog]# mysqlbinlog --base64-output=decode-rows -vvv ./mysql-bin.000002

......
# at 1443
#201015 11:32:32 server id 3306  end_log_pos 1571 CRC32 0x6a53905e      Query   thread_id=15    exec_time=0     error_code=0
use `simon_test`/*!*/;
alter table t1 add column name varchar(10)
/*!*/;
# at 1636
#201015 11:33:17 server id 3306  end_log_pos 1714 CRC32 0x0b0da816      Query   thread_id=15    exec_time=0     error_code=0
SET TIMESTAMP=1602732797/*!*/;
BEGIN
/*!*/;
# at 1714
#201015 11:33:17 server id 3306  end_log_pos 1768 CRC32 0x67dbf12c      Table_map: `simon_test`.`t1` mapped to number 118
# at 1768
#201015 11:33:17 server id 3306  end_log_pos 1819 CRC32 0xf6edf875      Write_rows: table id 118 flags: STMT_END_F
### INSERT INTO `simon_test`.`t1`
### SET
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='aa' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */
### INSERT INTO `simon_test`.`t1`
### SET
###   @1=5 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bb' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */
# at 1819
#201015 11:33:19 server id 3306  end_log_pos 1850 CRC32 0xb2c40913      Xid = 137
COMMIT/*!*/;
......
[root@mysql-node01 binlog]# 

内容解释:

### INSERT INTO `simon_test`.`t1`		#插入操作
### SET			#set 等同于 values
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */ 
###   @2='aa' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */
### INSERT INTO `simon_test`.`t1`
### SET
###   @1=5 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bb' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */
@1=4 表示,在表的第一个列,插入值"4",INT 是数据类型,is_null 表示:该字段允许为空
@2='aa' 表示,在表的第二个列,插入值"aa",VARSTRING(40) 字段数据类型以及最大预留长度

2.5.6 截取二进制日志

mysqlbinlog

--start-position=[start pos]

--stop-position=[end pos]

[root@mysql-node01 binlog]# mysqlbinlog --start-position=1178 --stop-position=1347 ./mysql-bin.00000

截取后的文件,可以直接用做数据恢复。

start position / stop position 实际上就是表示,这个事件内容,占了文件的第n个字节 到 第n字节之间


2.5.7 通过binlog恢复数据

mysql> show master status;		#确实当前使用哪个binlog文件
mysql> show binlog events in 'mysql-bin.xxxxxx';		#查看事件,查找start pos 和 end pos
mysql> mysqlbinlog --start-position=xxx --stop-position=xxx ./mysql-bin.xxxxxx > /tmp/bak.sql			#截取日志并导出到sql文件

查看当前会话,sql_bin_log 开启状态

root@localhost 12:06:35->show variables like '%sql_log_bin%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

root@localhost 12:06:44->

在当前会话窗口,临时关闭二进制日志(恢复过程中,产生的二进制记录,是不需要再次记录到二进制日志中)

root@localhost 12:06:46->set sql_log_bin=0;
mysql> source /tmp/bak.sql		#恢复
mysql> set sql_bin_log=1;  	#再开启当前会话的binlog记录

2.6 binlog 的gtid记录模式的管理

2.6.1GITD 介绍

GTID:全局事务编号

对于binlog中的每一个事务,都会生成一个GTID号码

DDL,DCL一个event就是一个事务,就会有一个GTID号

DML 语句来讲,begin到commit,就是一个事务,就是一个GTID号

2.6.2 GTID的组成

server_uuid: TID

server_uuid 是怎么生成的?

数据库初始化完成,第一次启动的时候,就会自动生成

默认存储在--datadir=/data_path/

[root@mysql-node01 data]# pwd
/data/mysql/data
[root@mysql-node01 data]# ll auto.cnf 
-rw-r----- 1 mysql mysql 56 Oct  9 21:22 auto.cnf
[root@mysql-node01 data]#
[root@mysql-node01 data]# cat auto.cnf 
[auto]
server-uuid=7a995d76-0a32-11eb-9c4a-525400c58226
[root@mysql-node01 data]

TID 是一个自增长数字,从1开始

7a995d76-0a32-11eb-9c4a-525400c58226:1-15 #大概就是这个样子,1-15表示当前数据已经运行1-15个事务

2.6.3 GTID的幂等性

如果拿有GTID的日志去恢复时,会先检查当前系统中是否有相同GTID号,有相同的就自动跳过。

会影响到binlog恢复和主从复制。

2.6.4 GTID的开启和配置

vi /etc/my.cnf
[mysqld]

#GTID模式
gtid-mode=on

#强制GTID一致性
enforce-gtid-consistency=true

#重启mysql
root@localhost 12:37:20->show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.01 sec)

root@localhost 12:37:26->
root@localhost 12:38:27->show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

root@localhost 12:38:31->

开启GTID后,要留意观察Executed_Gtid_Set的号码。

2.6.5 查看GTID信息

mysql>create database db_name charset utf8mb4;
root@localhost 12:42:00->show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 |      730 |              |                  | 7a995d76-0a32-11eb-9c4a-525400c58226:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

root@localhost 12:42:05->

Executed_Gtid_Set 号,已经自动生成。

对于DDL等语句,每个语句就是一个GTID号。

DML:insert into, update, delete,必须commit提交之后,才是一个事务

root@localhost 12:49:56->show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 |     1180 |              |                  | 7a995d76-0a32-11eb-9c4a-525400c58226:1-5 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

root@localhost 12:50:00->show binlog events in 'mysql-bin.000003';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                              |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000003 |    4 | Format_desc    |      3306 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                             |
| mysql-bin.000003 |  123 | Previous_gtids |      3306 |         154 |                                                                   |
| mysql-bin.000003 |  154 | Gtid           |      3306 |         219 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:1' |
| mysql-bin.000003 |  219 | Query          |      3306 |         346 | use `simon_test`; DROP TABLE `t3` /* generated by server */       |
| mysql-bin.000003 |  346 | Gtid           |      3306 |         411 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:2' |
| mysql-bin.000003 |  411 | Query          |      3306 |         538 | use `simon_test`; DROP TABLE `t4` /* generated by server */       |
| mysql-bin.000003 |  538 | Gtid           |      3306 |         603 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:3' |
| mysql-bin.000003 |  603 | Query          |      3306 |         730 | use `simon_test`; DROP TABLE `t1` /* generated by server */       |
| mysql-bin.000003 |  730 | Gtid           |      3306 |         795 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:4' |
| mysql-bin.000003 |  795 | Query          |      3306 |         905 | use `simon_test`; create table t1 (id int)                        |
| mysql-bin.000003 |  905 | Gtid           |      3306 |         970 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:5' |
| mysql-bin.000003 |  970 | Query          |      3306 |        1048 | BEGIN                                                             |
| mysql-bin.000003 | 1048 | Table_map      |      3306 |        1099 | table_id: 116 (simon_test.t1)                                     |
| mysql-bin.000003 | 1099 | Write_rows     |      3306 |        1149 | table_id: 116 flags: STMT_END_F                                   |
| mysql-bin.000003 | 1149 | Xid            |      3306 |        1180 | COMMIT /* xid=38 */                                               |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
15 rows in set (0.00 sec)

root@localhost 12:50:02-

2.6.6 基于GTID的binlog恢复

drop table t1;

再查看GTID :

root@localhost 12:52:25->show binlog events in 'mysql-bin.000003';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                              |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000003 |    4 | Format_desc    |      3306 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                             |
| mysql-bin.000003 |  123 | Previous_gtids |      3306 |         154 |                                                                   |
| mysql-bin.000003 |  154 | Gtid           |      3306 |         219 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:1' |
| mysql-bin.000003 |  219 | Query          |      3306 |         346 | use `simon_test`; DROP TABLE `t3` /* generated by server */       |
| mysql-bin.000003 |  346 | Gtid           |      3306 |         411 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:2' |
| mysql-bin.000003 |  411 | Query          |      3306 |         538 | use `simon_test`; DROP TABLE `t4` /* generated by server */       |
| mysql-bin.000003 |  538 | Gtid           |      3306 |         603 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:3' |
| mysql-bin.000003 |  603 | Query          |      3306 |         730 | use `simon_test`; DROP TABLE `t1` /* generated by server */       |
| mysql-bin.000003 |  730 | Gtid           |      3306 |         795 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:4' |
| mysql-bin.000003 |  795 | Query          |      3306 |         905 | use `simon_test`; create table t1 (id int)                        |
| mysql-bin.000003 |  905 | Gtid           |      3306 |         970 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:5' |
| mysql-bin.000003 |  970 | Query          |      3306 |        1048 | BEGIN                                                             |
| mysql-bin.000003 | 1048 | Table_map      |      3306 |        1099 | table_id: 116 (simon_test.t1)                                     |
| mysql-bin.000003 | 1099 | Write_rows     |      3306 |        1149 | table_id: 116 flags: STMT_END_F                                   |
| mysql-bin.000003 | 1149 | Xid            |      3306 |        1180 | COMMIT /* xid=38 */                                               |
| mysql-bin.000003 | 1180 | Gtid           |      3306 |        1245 | SET @@SESSION.GTID_NEXT= '7a995d76-0a32-11eb-9c4a-525400c58226:6' |
| mysql-bin.000003 | 1245 | Query          |      3306 |        1372 | use `simon_test`; DROP TABLE `t1` /* generated by server */       |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
17 rows in set (0.00 sec)

root@localhost 12:52:36->

(1) 截取

gtid格式:

server_id:TID(一个事务,一个ID)

7a995d76-0a32-11eb-9c4a-525400c58226:4-5

mysqlbinlog --include-gtids='7a995d76-0a32-11eb-9c4a-525400c58226:4-5' ./mysql-bin.xxxxxx

[root@mysql-node01 binlog]# mysqlbinlog  --include-gtids='7a995d76-0a32-11eb-9c4a-525400c58226:4-5' ./mysql-bin.000003 > /tmp/bak.sql

(2) 恢复:

set sql_log_bin=0;
source /tmp/gitd_bak.sql;
set sql_log_bin=1;

(3)报错

没恢复成功,报错?为什么报错?

因为幂等性的检查,4-5事务已经做过了。

(4) 正确的做法是什么?

mysqlbinlog 导出的时候,应该添加 --skip-gtids 参数

--skip-gtids 作用:导出时忽略原有gtid信息,恢复时,生成最新的gtid信息。

[root@mysql-node01 binlog]# mysqlbinlog --skip-gtids --include-gtids='7a995d76-0a32-11eb-9c4a-525400c58226:4-5' ./mysql-bin.000003 > /tmp/bak.sql


mysql -e "source /tmp/gtid_bak.sql"
mysql -e "show tables from db_name;select * from tb_name;"

2.6.7 GTID 相关参数

--skip-gtids 导出时,跳过原有gtid信息

--include-gtids 导出时,指定GTID事务号(多个事务,用逗号分开)

--include-gtids='server_id:1-3','server_id:6-9','server_id:12'

--exclude-gtids 导出时,忽略指定GTIT事务号

--include-gtids='server_id:4','server_id:5','server_id:12'

2.7 二进制日志其他操作

2.7.1 自动清理日志

show variables like '%expire%';
expire_logs_days  0   
自动清理时间,是要按照全备周期+1
set global expire_logs_days=8;
永久生效:
my.cnf
[mysqld]
expire_logs_days=15;
企业建议,至少保留两个全备周期+1的binlog

2.7.2 手工清理

show binary logs;
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
PURGE BINARY LOGS TO 'mysql-bin.000010';
注意:不要手工 rm binlog文件
1. my.cnf binlog关闭掉,启动数据库
2.把数据库关闭,开启binlog,启动数据库
删除所有binlog,并从000001开始重新记录日志

*reset master; 主从关系中,主库执行此操作,主从环境必崩

2.8 日志是怎么滚动

flush logs; 
重启mysql也会自动滚动一个新的
日志文件达到1G大小(max_binlog_size)
oot@localhost 02:57:40->show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)

root@localhost 03:00:58->    
备份时,加入参数也可以自动滚动

3.慢日志

3.1 作用

记录mysql工作中,运行较慢的语句,优化过程中常用的工具日志。

3.2 如何配置

# 开关
slow_query_log=1
# 文件位置及名字
slow_query_log_file=/path/slow.log
# 设定慢查询时间
long_query_time=0.1
# 没走索引的语句也记录
show global variables like 'log_querie%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
1 row in set (0.001 sec)

log_queries_not_useing_indexes
log_queries_not_using_indexes

long_query_time 满语句时间,默认是10.000000秒

root@localhost 01:34:58->select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
|         10.000000 |
+-------------------+
1 row in set (0.00 sec)

root@localhost 01:35:08->

long_query_time 设置时间,根据具体业务做综合因素评估,然后再决定。

3.3 模拟慢查询

3.4 分析慢日志

[root@mysql-node01 ~]# mysqldumpslow -s c -t 10 ./node3-slow.log

-s 作用: sort 排序

c 作用: count c 次数

-t 作用: top 前10

默认会用执行时间做第二围度排序

slow 语句排序

优先以执行次数做排序,找出最热语句。

[root@mysql-node01 ~]# mysqldumpslow -s c -t 10 ./node3-slow.log

# 执行次数		#平均执行时间		
Count: 23392  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
  Time: N N:N:N
  # User@Host: spree_online_user[spree_online_user] @  [N.N.N.N]
  # Thread_id: N  Schema: winstar_spree  QC_hit: No
  # Query_time: N.N  Lock_time: N.N  Rows_sent: N  Rows_examined: N
  SET timestamp=N;
  select count(myoilcoupo0_.id) as col_0_0_ from cbc_my_oil_coupon myoilcoupo0_ where myoilcoupo0_.order_id like 'S'

找出语句,然后 desc/explain 分析执行计划

3.5 第三方工具(自己扩展)

https://www.percona.com/downloads/percona-toolkit/LATEST/

yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL per-Digest-MD5

toolkit工具包中的命令:

pt-query-diagest /path/slow.log

Anemometer 基于 pt-query-digest 将MySQL 慢查询可视化

posted @ 2022-11-24 20:22  oldSimon  阅读(14)  评论(0)    收藏  举报