梦想还是要有的,万一忘了咋办?

0%

Mysql 慢日志分析

目录:

  • mysql配置
  • 系统配置
  • logrotate
  • 分析当天的日志
  • AI问答

本文作者 同事 张同学

mysql配置

当前配置(重启后失效,配合my.cnf)

1
2
3
4
5
6
7
8
-- 开启慢日志
SET GLOBAL slow_query_log = 1;
-- 慢日志文件
SET GLOBAL slow_query_log_file = "/var/lib/mysql/slow.log";
-- 慢查询阈值为1s
SET GLOBAL long_query_time = 1;
-- 未使用索引均认为是慢查询
SET GLOBAL log_queries_not_using_indexes = 1;

/etc/my.cnf(生效需重启)

1
2
3
4
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=1
log_queries_not_using_indexes=1

创建能够分割日志的用户

1
2
3
-- 创建能分割日志的用户
create user 'digest'@'%' identified by 'Digest_0501';
grant reload on *.* to 'digest'@'%';

系统配置

安装工具

1
2
3
4
5
6
7
8
# 安装依赖
yum -y install perl perl-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5

mkdir -p /opt/install
cd /opt/install
curl -fSsL -O https://downloads.percona.com/downloads/percona-toolkit/3.5.2/binary/tarball/percona-toolkit-3.5.2_x86_64.tar.gz

tar -xf percona-toolkit-3.5.2_x86_64.tar.gz

注册163邮箱

配置 - 非幂等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#  smtp_smarthost: 'smtp.163.com:465'
# smtp_from: 'xxxxxx@163.com'
# smtp_auth_username: 'xxxxxx@163.com'
# smtp_auth_password: 'xxxxxx'

cat >> /etc/mail.rc << \EOF
set from=xxxxx@163.com
set smtp="smtp.163.com"
set smtp-auth-user="xxx@163.com"
set smtp-auth-password="xxxxxx"
set smtp-auth=login
#set ssl-verify=ignore
#set nss-config-dir=/etc/pki/nssdb
EOF

验证

1
echo 'it is only a test' | mail -s "test eamil"  notice_zszc@163.com

logrotate - 每天自动运行分析前一天的日志(大概3点左右)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#编写logrotate配置文件
cat << \EOF > /etc/logrotate.d/mysql-slow
/var/lib/mysql/slow.log {
daily
rotate 7
dateext
compress
delaycompress
missingok
postrotate
#备份原日志后进行慢日志的刷新
/usr/bin/mysql -udigest -pDigest_0501 -e 'flush slow logs;'
dealdate=`date +%Y%m%d`
#附件生成路径(需对应配置)
dealpath=/tmp/mysql-slow
#数据库慢日志路径(需对应配置)dealdate为logrotate处理日期
dblogpath=/var/lib/mysql/slow.log-$dealdate
#logrotate配置文件名称(需对应配置)
dealtype=mysql-slow
#接收者邮箱(需对应配置)
to=notice_zszc@163.com

mkdir -p $dealpath
/opt/install/percona-toolkit-3.5.2/bin/pt-query-digest $dblogpath > $dealpath/$dealtype-$dealdate.log
cat $dealpath/$dealtype-$dealdate.log | iconv -t GBK -f UTF-8 | /usr/bin/mailx -s `hostname`"-$dealtype-$dealdate" -a "$dealpath/$dealtype-$dealdate.log" $to
rm -f $dealpath/$dealtype-$dealdate.log
endscript
}
EOF

#手工分割
# logrotate -f /etc/logrotate.d/mysql-slow

分析当天的日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 定义环境变量
dblogpath=/var/lib/mysql/slow.log
dealpath=/tmp/mysql-slow
dealdate=`date +%F_%T`
dealtype=mysql-slow
to=notice_zszc@163.com

# 生成慢日志描述文件
/opt/install/percona-toolkit-3.5.2/bin/pt-query-digest $dblogpath > $dealpath/$dealtype-$dealdate.log

# 发送文件
cat $dealpath/$dealtype-$dealdate.log | iconv -t GBK -f UTF-8 | /usr/bin/mailx -s `hostname`"$dealtype-$dealdate" -a "$dealpath/$dealtype-$dealdate.log" $to

# 删除慢日志描述文件
rm -f $dealpath/$dealtype-$dealdate.log

ai问答

这几个配置是MySQL中用于开启和配置慢查询日志的参数,具体含义如下:

  1. slow_query_log=1:将该参数设置为1表示开启慢查询日志功能。当该参数开启时,MySQL会将执行时间超过long_query_time指定时间阈值的查询语句记录到慢查询日志中。

  2. slow_query_log_file=/var/lib/mysql/slow.log:该参数指定了慢查询日志的文件路径和名称。在上面的配置中,慢查询日志文件被设置为/var/lib/mysql/slow.log

  3. long_query_time=1:该参数指定了查询执行时间的阈值,单位为秒。当查询执行时间超过该阈值时,MySQL会将该查询记录到慢查询日志中。在上面的配置中,查询执行时间超过1秒的语句会被记录到慢查询日志中。

  4. log_queries_not_using_indexes=1:该参数控制是否记录未使用索引的查询语句。将该参数设置为1表示记录未使用索引的查询语句,将其设置为0表示不记录。在上面的配置中,未使用索引的查询语句也会被记录到慢查询日志中。

总的来说,上述配置的含义是开启慢查询日志功能,并将慢查询日志文件设置为/var/lib/mysql/slow.log,将查询执行时间阈值设置为1秒,同时记录未使用索引的查询语句。这些配置可以帮助我们诊断和分析慢查询问题,以优化数据库性能。需要注意的是,开启慢查询日志功能会对数据库的性能产生一定影响,因此应该在生产环境中谨慎使用,并避免将日志文件存储在磁盘速度较慢或可用空间较小的位置。