为什么80%的码农都做不了架构师?>>>
MySQL日志记录了MySQL数据库日常操作和错误信息,MySQL总共有四种类型的日志,通过分析这些日志可以查询到MySQL的运行情况、用户操作、错误信息等,可以为MySQL的管理和优化提供必要信息。
1、日志类型
MySQL总共有四种类型的日志,如下:
- 错误日志:记录Mysql服务的启动、运行或停止MySQL服务时出现的问题,默认开启。
- 查询日志:记录建立连接的客户端连接和执行的语句。
- 二进制日志:记录所有更改数据的语句,可以用于数据复制。
- 慢查询日志:记录所有执行时间超过设定时间(long_query_time)的查询
四种日志,仅错误日志默认开启,其他需要手动配置开启,启动日志会降低服务器性能、而且会占用大量磁盘空间。
什么是刷新日志?
刷新日志可以强制MySQL关闭旧的日志文件,重新打开新的日志文件 即切换到新的日志文件,例如:错误日志当手工删除后无法重新建立新的日志文件,则需要进行刷新日志操作才会重新创建日志文件。
如何操作?
可在服务器端执行:
mysqladmin -u root -p flush-logs
或在客户端执行
flush logs
2、二进制日志
1、原理介绍
二进制日志主要记录MySQL数据库的变化,主要运用场景为 MySQL replication ,例如主从复制,主主复制,环形复制(不常用),从机通过IO线程读取主机的二进制日志 生成自己的中继日志,然后自己的SQL线程通过中继日志进行复制数据功能,简单点说就是把SQL再执行一遍,主要原理详细如下图:
2、开启二进制日志
在my.cnf文件 [MySQLd]组下进行如下配置
log-bin[=path/filename]
例如:
log-bin
log-bin=mysql-bin
log-bin=/home/zhpt/logs/mysql-bin
以上三种方式都可开启二进制日志
其他配置:
expire_logs_days=10 #自动清除过期日志的时间
max_binlog_size=100M #设置单个二进制日志文件的大小,默认为1G,不能设置超过1G或小于4096B
3、查看二进制日志及其设置
show variables like 'log_%'
结果如下:
也可使用
show binary logs
查看二进制日志文件的个数及文件名,如下图:
3、错误日志
MySQL错误日志记录了MySQL服务在运行中发生的任何严重错误信息,此错误类型默认开启。
1、查看日志文件配置
show variables like 'log_error%'
结果如下所示:
2、修改日志文件路径
在my.cnf文件 [MySQLd]组下进行如下配置
log-error=/home/zhpt/logs/MySQL_Ruoli.err
错误日志直接以文件的形式存储于磁盘上,可随时手工删除,删除后需要执行刷新日志才可生成新的错误日志。
4、通用查询日志
在my.cnf文件 [MySQLd]组下进行如下配置 开启 通用查询日志
log[=path/filename]
通用查询日志记录了用户的所有操作,可使用编辑工具直接查看,开启通用查询日志后,会降低数据库性能增大磁盘占用,不建议在生产环境中使用。
5、慢查询日志
慢查询日志是MySQL提供的用来记录执行时间过长的查询语句,为数据库性能优化提供重要依据。
1、查看慢查询日志开启状态及存储位置:
mysql> show variables like 'slow_query%';
+---------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------+----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /mysql/data/localhost-slow.log |
+---------------------------+----------------------------------+
如上所示,此台服务器已经开启了慢查询日志功能,慢查询日志文件路径也在其data目录下。
2、查看慢查询日志超时时间
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 5.000000 |
+-----------------+-----------+
3、开启慢查询日志
前面提到过,慢查询日志并不是默认开启的,开启慢查询可以通过如下方式:
- 通过配置文件设置,此种修改方式为永久生效。
在my.cnf文件 [MySQLd]组下进行如下配置,开启慢查询日志,如下:
slow_query_log = ON
slow_query_log_file =/usr/local/mysql/data/slow.log
long_query_time=2 #设置超时时间为2秒,默认为10秒
- 通过设置全局变量设置,此种方式重启后失效。
将 slow_query_log 全局变量设置为“ON”状态
mysql> set global slow_query_log='ON';
设置慢查询日志存放的位置
mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';
查询超过2秒就记录
mysql> set global long_query_time=2;
开启记录没有使用索引的查询语句
mysql> set global log-queries-not-using-indexes = on
4、慢查询日志分析
上图是一条慢查询日志的内容,我们进行分析时主要看的就是执行信息,包括执行时间(Query_time)、发送行数(Rows_sent)、扫描行数(Rows_examined),通过降低扫描行数可以明显降低执行时间。
如果扫描行数明显大于发送行数说明此条SQL的索引命中率很低,可以优先进行优化。
关于降低降低扫描行数来提升查询效率最直接的例子就是MySQL的分页查询。
具体可以另一篇文章:最快速的办法解决MySQL数据量增大之后翻页慢问题