[原]MySQL日志

0x01.About

MySQL有四种类型的日志:Error Log、General Query Log、Binary Log 和 Slow Query Log。

第一种错误日志,记录MySQL运行过程ERROR,WARNING,NOTE等信息,系统出错或者某条记录出问题可以查看ERROR日志。

第二种日常运行日志,记录MySQL运行中的每条请求数据。

第三种二进制日志,包含了一些事件,这些事件描述了数据库的改动,如建表、数据改动等,也包括一些潜在改动,主要用于备份恢复、回滚等操作。

第四种慢查询日志,用于MySQL性能调优。


0x02.Error Log

MySQL错误日志默认以hostname.err存放在MySQL日志目录,如果不知道MySQL当前的错误日志目录可以使用查询语句:

mysql> show variables like ‘log_error’;

12345
+---------------+--------------------------------------+| Variable_name | Value                                |+---------------+--------------------------------------+| log_error     | /usr/local/var/mysql/mysql-error.log |+---------------+--------------------------------------+

修改错误日志地址可以在/etc/my.cnf中添加--log-error[=file_name]选项来开启mysql错误日志。

错误日志记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息。

知道了MySQL错误日志地址,我们就可以查看MySQL错误日志:

123
2015-09-12 16:03:20 2624 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 352015-09-12 16:03:20 2624 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.2015-09-13 00:03:21 2183 [Note] InnoDB: Shutdown completed; log sequence number 426783897

InnoDB: Unable to lock ./ibdata1, error: 35 可以得出资源被抢占,有可能是开了多个MySQL线程。


0x03.General Query Log

日常请求的SQL:
添加方式一样在 /etc/my.cnf 中添加 general-log-file[=file_name]


0x04.Binary Log

启用Binlog

修改 /etc/my.cnf

123456
binlog_format = STATEMENTbinlog_cache_size = 2Mmax_binlog_cache_size = 4Mmax_binlog_size = 512Mlog-bin = master-binlog-bin-index = master-bin.index

log-bin-index 指向 master-bin 这个文件,记录有哪些分块的Binlog文件名。
log-bin 记录Binlog文件名前缀,后缀会用数字递增。

Binlog格式

Binlog有3种格式,STATMENT,ROW,MIXED。https://dev.mysql.com/doc/refman/5.1/en/binary-log-mixed.html

混合格式(mixed)会在适当时候切换row和statment格式,statment就是直接的SQL语句格式。

分析Binlog

通过MySQL自带的mysqlbinlog 命令,可以直接查看到Binlog转码数据:

mysqlbinlog /usr/local/var/mysql/master-bin.000117

得到:

12345678
# at 335#150913  0:05:12 server id 1  end_log_pos 366 CRC32 0xa31b50db 	Xid = 151COMMIT/*!*/;DELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

第一行包含日志文件偏移字节值(335)。

第二行包含:

  • 事件的日期事件,MySQL会使用他们来产生SET TIMESTAMP
  • 服务器的服务器id
  • end_log_pos 下一个事件的偏移字节
  • 事件类型,这里是Xid,常见的还有其他,例如:Intvar,Query,Stop,Format_desc
  • 原服务器上执行语句的线程id,用于审计和CONNECTION_ID()
  • exec_time对于master端的Binlog来说是执行这个event所花费的时间
  • 原服务器产生的错误代码

通过

mysql> show binlog events;

也可以的到binlog数据:

1234
| master-bin.000002 | 3861 | Query       |         1 |        3954 | BEGIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           || master-bin.000002 | 3954 | Intvar      |         1 |        3986 | INSERT_ID=5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     || master-bin.000002 | 3986 | Query       |         1 |        4475 | use `dropbox`; INSERT INTO `UserLog` (`uid`, `fids`, `nids`, `msg`, `log`, `from`, `type`, `ctime`) VALUES (‘1‘, ‘[\"35\",\"33\",\"21\"]‘, ‘[\"22\",\"21\",\"11\",\"4\",\"3\"]‘, ‘从垃圾箱恢复: 恢复文件 \‘[\"35\",\"33\",\"21\"]\‘ 恢复文件夹 \‘[\"22\",\"21\",\"11\",\"4\",\"3\"]\‘‘, ‘[[\"35\",\"33\",\"21\"],[\"22\",\"21\",\"11\",\"4\",\"3\"]]‘, ‘cloud.jue.so‘, ‘recover_by_trash‘, ‘2015-09-07 00:51:31‘)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               || master-bin.000002 | 4475 | Xid         |         1 |        4506 | COMMIT /* xid=423 */

查看Binlog信息

mysql> show variables like ‘%binlog%’;

123456789101112131415161718192021
+-----------------------------------------+----------------------+| Variable_name                           | Value                |+-----------------------------------------+----------------------+| binlog_cache_size                       | 2097152              || binlog_checksum                         | CRC32                || binlog_direct_non_transactional_updates | OFF                  || binlog_error_action                     | IGNORE_ERROR         || binlog_format                           | STATEMENT            || binlog_gtid_simple_recovery             | OFF                  || binlog_max_flush_queue_time             | 0                    || binlog_order_commits                    | ON                   || binlog_rows_query_log_events            | OFF                  || binlog_stmt_cache_size                  | 32768                || binlogging_impossible_mode              | IGNORE_ERROR         || innodb_api_enable_binlog                | OFF                  || innodb_locks_unsafe_for_binlog          | OFF                  || max_binlog_cache_size                   | 4194304              || max_binlog_size                         | 536870912            || max_binlog_stmt_cache_size              | 18446744073709547520 || simplified_binlog_gtid_recovery         | OFF                  |+-----------------------------------------+----------------------+

Slow Query Log

开启 Slow Query

修改/etc/my.cnf

1234
slow-query-log = 1slow-query-log-file = /usr/loval/var/mysql/mysql-slow.loglong_query_time = 1 #设置满请求时间log-queries-not-using-indexes

Slow Query工具

Slow Query有很多查看工具,比如:MySQL自带的mysqldumpslow 和 mysqlsla,用的比较多的 py-query-digest,还可以将满请求数据丢给zabbix做显示分析处理。

这里我用 py-query-digest /usr/local/var/mysql/mysql-slow.log 导出了满请求的数据,例如:

1234567891011121314151617181920212223242526272829303132
# Query 1: 0.02 QPS, 0.55x concurrency, ID 0xFC19E4D04D8E60BF at byte 12547# This item is included in the report because it matches --limit.# Scores: V/M = 118.26# Time range: 2015-09-12 05:52:03 to 05:57:54# Attribute    pct   total     min     max     avg     95%  stddev  median# ============ === ======= ======= ======= ======= ======= ======= =======# Count          1       7# Exec time     78    194s   250ms    169s     28s    167s     57s   992ms# Lock time      0   901us   111us   158us   128us   152us    18us   119us# Rows sent      0       5       0       1    0.71    0.99    0.45    0.99# Rows examine   7 545.01k  14.18k  97.66k  77.86k  97.04k  32.08k  97.04k# Query size     0     868     123     125     124  124.25       1  118.34# String:# Databases    mysqltest# Hosts        localhost# Users        root# Query_time distribution#   1us#  10us# 100us#   1ms#  10ms# 100ms  #################################################################    1s  ###########################################  10s+  ########################################### Tables#    SHOW TABLE STATUS FROM `mysqltest` LIKE ‘File‘\G#    SHOW CREATE TABLE `mysqltest`.`File`\G#    SHOW TABLE STATUS FROM `mysqltest` LIKE ‘User‘\G#    SHOW CREATE TABLE `mysqltest`.`User`\G# EXPLAIN /*!50100 PARTITIONS*/SELECT count(*) FROM `File` LEFT JOIN `User` ON `User`.`name`= `File`.`name` WHERE `User`.`name` LIKE ‘%r%‘ order by `last`\G

可以看到该SQL被调用7次,平均每次28s,好慢…平均检测数据大小77.86k。

再来看看SQL语句:

SELECT count(*) FROM File LEFT JOIN User ON User.nameFile.name WHERE User.name LIKE ‘%r%’ order by last

看着都觉得慢 ON User.name= File.name 在没有建立索引的情况下,所有数据将进行字符串匹配name字段。

这个库有 15W条User数据,10W条File数据,也就是要比对15*10 WW 次数据。

MySQL的slow log的作用也就在这里了,优化慢查询。


参考:

1.《高性能MySQL》

2.Analyse slow-query-log using mysqldumpslow & pt-query-digest

3.初探MySQL的Binlog

4.MySQL doc

本文出自 夏日小草,转载请注明出处:http://homeway.me/2015/09/12/mysql-log

-by小草

2015-09-12 01:49:10

时间: 2024-10-03 22:47:24

[原]MySQL日志的相关文章

MySQL 日志的类型

MySQL日志类别:一般查询日志:log,general_log,log_output慢查询日志:查询执行的时长超过指定的查询,即为慢查询:错误日志:通常时指错误日志的相关信息,通常用服务器关闭和启动的日志信息,服务器运行过程中的错误信息,还可以记录警告信息.二进制日志:只是跟修改相关的操作,可以理解为一个重做日志,用于复制的基本凭据:中继日志:它其实跟复制相关的,与二进制日志几乎相同: 事物日志:随机I/O转换为顺序I/O,一般在两个文件存储,一个存满了就换另外一个存 查询日志 log={ON

MySQL日志详细说明

这片博文我们会详细说明MySQL本身的日志,不包含重做日志和undo日志(这两个日志是innodb存储引擎的日志). MySQL本身的日志有以下几种(MySQL5.7版本): 错误日志 慢查询日志 通用日志 二进制日志 错误日志 默认情况下,错误日志是无法被禁止:错误日志的位置及日志名使用log_error参数指定,若是没有指定,则默认错误日志名为hostname.err(错误日志是以.err为后缀的).yum安装的MySQL错误日志默认路径是在/var/log/mysqld.log下的! 在M

2.MySQL日志

MySQL日志分类 MySQL日志主要包含:错误日志.查询日志.慢查询日志.重做日志.回滚日志.二进制日志错误日志: 用来记录 MySQL 服务器运行过程中的错误信息,比如,服务器启动关闭信息.运行错误信息.时间调度器运行一个事件时产生的信息.在服务器上启动进程产生的信息. 错误日志可以自己配置,log-error:配置是否启用错误日志功能和错误日志的存储位置.log-warning:配置是否将警告信息也定义至错误日志中 错误日志存储在数据库的数据文件目录中,名称为 hostname.err,其

MySQL日志

mysql日志=====默认为数据目录下 1.错误日志(记录错误信息) show variables like '%log%'; log_error = /database/mydata/server1.err   ======默认为数据目录2.访问日志(记录客户端执行的语句)====文本记录 general_log = on general_log_file = /database/mydata/server1.log 3.二进制日志(记录对数据库的操作)===只记录数据改变的命令==upda

如何查询MySql日志

如何查询MySql日志 分类: mysql2012-02-23 19:14 26756人阅读 评论(2) 收藏 举报 mysqlcommandprintingserversocketoutput 今天美国老板发来一封email,一句What happen to ...? 其他任何线索没有,我的给出答案,一一排查,看能否找到问题缘由或是恢复数据,更新问题?程序问题?结果都是没有头绪,最后想了下mysql的日志看能否看看,以前没看过mysql的日志,查查资料,最终皇天不负有心人,搞定了,现在总结下:

何时、怎样开启 MySql 日志?

假如你是一名 web 开发者.假设你想调试你的应用或提升其性能的话,那你须要去參考各种日志文件.日志是開始故障排除最好的选择.就著名的 MySql 数据库server而言,你须要參考下面日志文件: 错误日志:它包括了server执行时(当然也包括服务启动和停止时)所发生的错误信息 普通查询日志:这是一个记录 mysqld 在做什么(连接.断开,查询)的通用日志 慢查询日志:正如其名,它记录了 "慢" 的查询 SQL 语句 本文未涉及到二进制日志.二进制日志要求非常高的server硬件配

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子 简介 Part1:写在最前 MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿. MariaDB如何审计,可移步: http://suifu.blog.51cto.com/9167728/1857

MySQL 日志

MySQL 日志 ================================================================================ 概述: ================================================================================ MySQL的日志分类: ★查询日志:general_log ★慢查询日志:log_slow_queries ★错误日志:log_error, log_