mysql之 slow log 慢查询日志
一、 相关参数:
• slow_query_log
◦ 是否开启慢查询日志
• slow_query_log_file
◦ 慢查询日志文件名, 在 my.cnf 我们已经定义为slow.log,默认是 机器名 -slow.log
• long_query_time
◦ 制定慢查询阈值, 单位是秒,且当版本 >=5.5.X ,支持毫秒。例如 0.5 即为 500ms
◦ 大于 该值,不包括值本身。例如该值为2,则执行时间正好 等于 2的SQL语句 不会记录
• log_queries_not_using_indexes
◦ 将没有使索引的SQL记录到慢查询日志
◾ 如果一开始因为数据少,查表快,耗时的SQL语句没被记录,当数据量大时,该SQL可能会执行很长时间
◾ 需要测试阶段就要发现问题,减小上线后出现问题的桜率
• log_throttle_queries_not_using_indexes
◦ 限制每分钟内,在慢查询日志中,去记录没有使用索引的SQL语句的次数;版本需要 >=5.6.X
◾ 因为没有使用索引的SQL可能会短时间重复执行,为了避免日志快速增大,限制每分钟的记录次数
• min_examined_row_limit
◦ 扫描记录少于改值的SQL不记录到慢查询日志
◾ 结合去记录没有使用索引的SQL语句的例子,有可能存在某一个表,数据量维持在几行左右,且没有建立索引。这种表即使不建立索引,查询也很快,扫描记录很小,如果确定有这种表,则可以通过此参数设置,将这个SQL不记录到慢查询日志。
• log_slow_admin_statements
◦ 记录超时的管理操作SQL到慢查询日志,比如ALTER/ANALYZE TABLE
• log_output
◦ 慢查询日志的栺式,[FILE | TABLE | NONE],默认是FILE;版本 >=5.5
◦ 如果设置为TABLE,则记录的到 mysql.slow_log
• log_slow_slave_statements
◦ 在从服务器上开启慢查询日志
• log_timestamps 5.7
◦ 写入时区信息。可根据需求记录UTC时间或者服务器本地系统时间
二、mysqldumpslow工具使用
如果在线上操作,不需要 mysqldumpslow 去扫整个 slow.log , 可以去 tail -n 10000 slow.log > last_10000_slow.log (10000 这个数字根据实际情况进行调整 ),然后进行 mysqldumpslow last_10000_slow.log
三、慢查询日志存入表
-- 在my.cnf 中增加 log_output = TABLE,打开slow_query_log选项,然后重启数据库实例
--
mysql> show variables like "log_output%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "slow_query_log";
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
1 row in set (0.00 sec)
mysql> select * from mysql.slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-----------------+-----------+
| start_time | user_host | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text | thread_id |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-----------------+-----------+
| 2015-11-20 19:50:28.574677 | root[root] @ localhost [] | 00:00:04.000306 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 11 | select sleep(4) | 3 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-----------------+-----------+
1 row in set (0.00 sec)
mysql> show create table mysql.slow_log;
--
-- 表结构输出省略
-- 关键一句如下:
--
ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' -- ENGINE=CSV 这里使用的是CSV的引擎,性能较差
-- 建议将slow_log表的存储引擎改成MyISAM
mysql> alter table mysql.slow_log engine = myisam;
ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled '-- 提示我正在记录日志中,不能转换
mysql> set global slow_query_log = 0; -- 先停止记录日志
Query OK, 0 rows affected (0.01 sec)
mysql> alter table mysql.slow_log engine = myisam; -- 然后转换表的引擎
Query OK, 2 rows affected (5.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> set global slow_query_log = 1; -- 再开启记录日志
Query OK, 0 rows affected (0.00 sec)
mysql> show create table mysql.slow_log;
--
-- 表结构输出省略
-- 关键一句如下:
--
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log' -- ENGINE 变成了MyISAM
使用 TABLE 的优势在于方便查询,但是记住当在备份的时候,不要备份慢查询日志的表,避免备份过大。
使用 FILE 也可以,需要定时清除该文件,避免单文件过大。