目录
传送门
对于一些开发来说,MySQL大多数时候可能只是单纯的使用来存储数据,会写几句SQL就敢上手写代码了。
久了之后,开发过程中比较关注的也是索引的使用,Mysql索引是什么
或者高级一些的锁的使用,Mysql锁系列(1):概述
MySQL日志分类
在程序优化中,有很多优化的地方及方案,但是SQL查询优化肯定是其中一项。
上面提到,开发的时候不仅仅是实现功能,还要关注性能,MySQL索引的正确使用就起到关键作用。但是一开始设计好的索引,在程度运行中并没有发挥作用,或者随着数据量上升导致索引失效,这个时候就需要动态的监控SQL执行时间来发现这些发问题。那么通过MySQL的慢查询日志就可以查询到执行比较的慢的查询语句SQL,然后再针对性优化。
索引优化跟MySQL是有密切关联的。了解Mysql的日志也是很有好处的,比如binlog可以用来做为主从复制。
MySQL的日志大致分为以下几类:
- 错误日志
- 查询日志
- 二进制日志
- 慢查询日志
错误日志
错误文件一般是mysql.err文件(文件名称可以自定义)。记录MySQL服务的启动,运行或停止服务时出现的问题,
查看错误日志
比如下面这种日志的样式,因为是按文本文件记录,可以直接打开,比如
cat /data/mysql/mysql.err
会展示如下图所示的日志格式
里面会记录MySQL相关的操作,比如启动日志
/usr/local/mysql/bin/mysqld (mysqld 5.7.36-log) starting as process ...
停止日志
/usr/local/mysql/bin/mysqld: Shutdown complete
还有主要的错误日志,里面记录刚才启动失败的原因
2022-08-24T15:18:49.857529Z 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.7.36-log) starting as process 137459 ...
mysqld: File '/data/mysql/bin-log/bin_log.index' not found (Errcode: 2 - No such file or directory)
2022-08-24T15:18:49.860114Z 0 [ERROR] Aborting
设置错误文件
MySQL的错误日志默认都是开启的,一般只会根据需要修改日志路径。可以通过命令查询当前错误日志的设置
SHOW VARIABLES like '%log_error%';
查询出当前的配置为
这个路径可以在配置文件my.cnf里面设置
log-error=/data/mysql/mysql.err
log-error=path+filename,其中path为路径,filename为文件名称,一般为.err结尾
修改了这个配置之后,需要重启服务
service mysql restart
通用查询日志
查询日志也叫通用查询日志,文件一般是mysql.log文件(文件名称可以自定义)
查看通用查询日志
会记录MySQL的所有用户操作,包括服务启动,关闭,还有查询更新等SQL语句,如下命令
tail -fn 200 mysql.log
可以展示下面日志格式
上面的日志记录了客户端用户连接,用户为root
Connect root@ip on using TCP/IP
root用户连接上了以后,在nacos库里面执行了下面的查询
select * from config_info;
在通用日志里面也进行了记录
Init DB nacos
2022-09-10T02:36:03.923428Z 6 Query SET PROFILING=1
2022-09-10T02:36:03.959440Z 6 Query SHOW STATUS
2022-09-10T02:36:04.006402Z 6 Query SHOW STATUS
2022-09-10T02:36:04.074408Z 6 Query select * from config_info
2022-09-10T02:36:04.206927Z 6 Query SHOW STATUS
2022-09-10T02:36:04.312479Z 6 Query SELECT QUERY_ID, SUM(DURATION) AS SUM_DURATION FROM INFORMATION_SCHEMA.PROFILING GROUP BY QUERY_ID
2022-09-10T02:36:04.402987Z 6 Query SELECT STATE AS `状态`, ROUND(SUM(DURATION),7) AS `期间`, CONCAT(ROUND(SUM(DURATION)/0.003750*100,3), '%') AS `百分比` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=3 GROUP BY STATE ORDER BY SEQ
2022-09-10T02:36:04.699803Z 6 Query SELECT * FROM `nacos`.`config_info` LIMIT 0
2022-09-10T02:36:04.735794Z 6 Query SHOW COLUMNS FROM `nacos`.`config_info`
设置通用查询日志
该日志默认都是关闭的,可以通过命令查询当前通用查询日志的设置
SHOW VARIABLES like '%general_log%';
查询出当前的配置为
一共2项配置,其中
- general_log表示是否开启,ON-开启,OFF-关闭
- general_log_file表示日志路径
这个路径可以在配置文件my.cnf里面设置
general_log=ON
general_log_file=path+filename,其中path为路径,filename为文件名称,一般为.log结尾
修改了这个配置之后,需要重启服务
binlog
binlog就是通常意义的二进制日志,文件一般是binlog.index文件(文件名称可以自定义)
查看binlog日志
记录所有更改数据有语句,可以用于数据复制,比如下面
在控制台执行了一条插入语句,则会生成如上的binlog日志
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`)
VALUES ('11', 'test11', 'DEFAULT_GROUP', 'test:\r\n id: aa', 'e761ae7c0bf7356db9d8104423581b6b', '2022-06-18 14:40:49', '2022-06-18 14:40:49', 'nacos', '112.45.96.24', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
binlog生成的日志可能有的打开不是这个的SQL语句,而是一些看不懂的日志格式,比如
这是因为可以在MySQL配置文件中my.cnf
binlog可以设置日志格式
- STATEMENT:每一条会修改数据的sql语句会记录到binlog中
- ROW:不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了
- MIXED:以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式
设置binlog
该日志默认都是关闭的,可以通过命令查询当前日志的设置
SHOW VARIABLES like '%log_bin%';
查询出当前的配置为
可以通过设置其中1项配置,其中
- log-bin,来启用并设置binlog的路径,比如log-bin=/data/mysql/bin_log/binlog
这个路径可以在配置文件my.cnf里面设置
log-bin=path,其中path为路径,文件名称由系统决定,不用做设置
修改了这个配置之后,需要重启服务
慢查询日志
记录所有执行时间超过设置阈值时间的SQL,或者不使用索引的查询,阈值时间可以通过long_query_time设置,可以全局查询出来默认为10s
SHOW VARIABLES like '%long_query%';
查看慢查询日志
文件一般是slow.log文件(文件名称可以自定义)
设置慢查询日志
该日志默认是关闭的,可以通过命令查询当前查询日志的设置
SHOW VARIABLES like '%slow_query%';
查询出当前的配置为
一共2项配置,其中
- slow_query_log表示是否开启,ON-开启,OFF-关闭
- slow_query_log_file表示日志路径
这个路径可以在配置文件my.cnf里面设置
slow_query_log=ON
slow_query_log_file=path+filename,其中path为路径,filename为文件名称,一般为.log结尾
修改了这个配置之后,需要重启服务
数据库版本说明
以上所有配置都是基于MySQL版本5.7.36,可能不同版本的配置有所不同。可以通过
SHOW VARIABLES like '%log%';
命令查询一下调整相关配置