慢查询日志
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
long_query_time的默认值为10,意思是运行10S以上的语句。该值可以指定为微秒的分辨率。对于记录到文件,写入包括微秒部分的时间。对于记录到表,只写入整数倍; 微秒部分被忽略。
默认情况下,不记录管理语句,也不记录不使用索引进行查找的查询
默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。
慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
写入慢查询日志的语句中的密码将由服务器重写,而不是以纯文本形式发生。
常用语 SQL 语句的优化,运维人员的工作:
配置数据库开启 慢日志功能
配置慢日志的相关参数,比如存放慢日志的具体位置,还有设置规定的时间
检查慢日志文件,假如有,把语句和相关信息给到开发人员。
配置参数详解
是否开启慢日志
属性 | 值 |
---|---|
命令行格式 | --slow-query-log |
系统变量 | slow_query_log |
范围 | 全局 |
动态 | 是 |
类型 | 布尔 |
默认值 | OFF |
设置slow_query_log
为0(或OFF
)以禁用日志或设置为1(或 ON
)以启用它
定义超时时间
属性 | 值 |
---|---|
命令行格式 | --long-query-time=# |
系统变量 | long_query_time |
范围 | 全球 |
动态 | 是 |
类型 | 数字 |
默认值 | 10 |
最低价值 | 0 |
如果查询花费的时间超过此秒数,则服务器会递增Slow_queries
状态变量。如果启用了慢查询日志,则查询将记录到慢查询日志文件中。
设置慢日志文件名称
属性 | 值 |
---|---|
命令行格式 | --slow-query-log-file=file_name |
系统变量 | slow_query_log_file |
范围 | 全球 |
动态 | 是 |
类型 | 文件名 |
默认值 | host_name-slow.log |
如果没有为慢查询日志文件指定任何名称,则默认名称为 host_name-slow.log。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中创建该文件。
系统变量 log-queries-not-using-indexes
:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。
系统变量 log_slow_admin_statements
表示是否将慢管理语句例如 ANALYZE TABLE
和 ALTER TABLE
等记入慢查询日志
Mysql 中查看慢查询的信息
mysql> show variables like 'slow_query%';
+---------------------+---------------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/mysql-master1-slow.log |
+---------------------+---------------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec
Mysql 中设置并查询慢日志设置的是否有效
适用于不允许重启服务器的情况
mysql> set global long_query_time=0;
Query OK, 0 rows affected (0.00 sec)
查询当前会话的慢日志时间阈值
mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)
查询全局的时间阈值
mysql> show global variables like 'long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
查询截至目前已经产生了多少条慢查询记录。
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 0 |
+---------------+-------+
1 row in set (0.01 sec)
通过配置文件方式配置慢查询日志
需要重启服务器
// my.cnf
[mysqld]
# 开启慢查询日志
slow_query_log=1
# 设置阈值 `0.01` 秒
long_query_time=0.01
log_queries_not_using_indexes=ON
slow_query_log_file="/var/log/mysql/mysql_slow.log"
创建对应的目录并授权
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
处理慢日志的大小
刷新日志时,服务器会创建新的二进制日志文件。但是,它只是关闭并重新打开常规和慢速查询日志文件。
日志刷新操作具有以下效果:
如果启用了二进制日志记录,则服务器将关闭当前的二进制日志文件,并使用下一个序列号打开一个新的日志文件。
如果启用了常规查询日志记录或慢速查询日志记录到日志文件,则服务器将关闭并重新打开日志文件。
如果服务器启动时带有将
--log-error
错误日志写入文件的选项,则服务器将关闭并重新打开日志文件。
执行日志刷新语句或命令需要使用具有RELOAD
特权的帐户连接到服务器 。
1 方式一:
要在服务器上创建新文件,请在刷新之前重命名当前日志文件。
shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs
2 方式二
假如有些情况下服务器不允许重新启动,但是有
此情况下又需要对日志重新命名,以便继续备份或者日志切割。
那就可以使用如下方案
先禁用日志功能
mysql> SET GLOBAL general_log = 'OFF';
mysql> SET GLOBAL slow_query_log = 'OFF';
禁用日志后,在外部重命名日志文件; 例如,从命令行。
然后再次启用日志,并刷新日志:
mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL slow_query_log = 'ON';