深入分析mysql日志教程

1. 错误日志

错误日志主要用于定位mysql启动和运行中的一些问题,错误日志是默认开启的,可以通过show global variables查看错误日志文件的位置:

mysql> show global variables like '%log_error%';

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

1 row in set (0.00 sec)

也可以通过mysql配置文件my.cnf查看错误日志文件的位置:

# Error log - should be very few entries.
log_error = /var/log/mysql/error.log

常见的错误日志也包括存储引擎相关的信息,常见的格式如下:

140716 20:24:11 [Note] Plugin 'FEDERATED' is disabled.
140716 20:24:11 InnoDB: The InnoDB memory heap is disabled
140716 20:24:11 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140716 20:24:11 InnoDB: Compressed tables use zlib 1.2.3.4
140716 20:24:11 InnoDB: Initializing buffer pool, size = 128.0M
140716 20:24:11 InnoDB: Completed initialization of buffer pool
140716 20:24:11 InnoDB: highest supported file format is Barracuda.
140716 20:24:11  InnoDB: Waiting for the background threads to start
140716 20:24:12 InnoDB: 5.5.37 started; log sequence number 20673572
140716 20:24:13 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
140716 20:24:13 [Note]   - '127.0.0.1' resolves to '127.0.0.1';
140716 20:24:13 [Note] Server socket created on IP: '127.0.0.1'.
140716 20:24:13 [Note] Event Scheduler: Loaded 0 events
140716 20:24:13 [Note] /usr/sbin/mysqld: ready for connections.

2. 查询日志

查询日志用于记录所用的增删查改信息,由于在并发量大时会产生大量信息,所以默认是关闭的。可以通过show global variables查看查询日志的位置以及是否开启。

mysql> show global variables like '%general_log%';
+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/lib/mysql/mysql.log |
+------------------+----------------------------+

本例中查询日志是关闭的。我们可以在my.cnf中开启查询日志,开启后会影响mysql服务的性能,所以一般只用在开发环境中。

# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

查询日志包括了mysql执行的每一条sql信息以及会话信息,日志格式如下:

140716 20:33:46     9 Connect   user@localhost on domain
            9 Query select url,url_token from articles where url_md5 = 'c473c205d1ee72cecf2546d332abbbcd'
            9 Query select title,url from hot_articles limit 60 ,10
            9 Quit

3. 慢查询日志

慢查询日志应该是对调试程序最有用的日志了,可以通过慢查询日志找到哪些sql语句是性能瓶颈。一般情况下,正常的web应用时不会出现大量的慢查询日志的,因此强烈建议开启。可以通过show global variables查看慢查询日志的位置以及是否开启。

mysql> SHOW  GLOBAL VARIABLES LIKE '%slow%';              
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| log_slow_queries    | ON                            |
| slow_launch_time    | 2                             |
| slow_query_log      | ON                            |
| slow_query_log_file | /var/log/mysql/mysql-slow.log |
+---------------------+-------------------------------+

慢查询默认记录超过10秒的查询语句,可以精确到毫秒:

mysql> SHOW  GLOBAL VARIABLES LIKE '%long_query_tim%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

可以通过在my.cnf中设置慢查询相关选项,比如超时时间、记录无索引查询等:

# Here you can see queries with especially long duration
log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 10
log-queries-not-using-indexes

常见的慢查询日志格式如下,其中包含用户、查询耗时、sql语句、结果集数量等信息:

# Time: 140716 20:47:59
# User@Host: user[user] @ localhost []
# Query_time: 12.00012  Lock_time: 0.000136 Rows_sent: 1  Rows_examined: 1

use test;
SET timestamp=1405514879;
select url,url_token from articles where url_md5 = '817563bd7ef4b2a476f1f55d0b558cd1';

4. 二进制日志

二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,可以在my.cnf中配置二进制日志相关参数,如文件路径、过期时间、文件大小等。也可以从二进制日志中导出sql,用于恢复数据库。

log_bin         = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size         = 100M
使用show binary log查看mysql产生的bin log信息,包括文件名、文件大小(单位为字节)等。

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      6252 |
| mysql-bin.000002 |       295 |
| mysql-bin.000003 |       126 |
| mysql-bin.000004 |       107 |
+------------------+-----------+
4 rows in set (0.00 sec)

4.1 查看二进制日志

可以通过show master status和show binlog events查询定位binlog信息:

#使用show master status查看下一条binlog的偏移起始位置:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      870 |              |                  |
+------------------+----------+--------------+------------------+

#使用show binlog events查询某条binglog记录
#语法:show binlog events [int 'log_file'] [from position] [limit [offset,] row_count]
#一下是查看一个完整的事务执行binlog记录
mysql> show binlog events in 'mysql-bin.000004' from 870 limit 4\G;
*************************** 1. row ***************************
   Log_name: mysql-bin.000004
        Pos: 870
 Event_type: Query
  Server_id: 1
End_log_pos: 941
       Info: BEGIN
*************************** 2. row ***************************
   Log_name: mysql-bin.000004
        Pos: 941
 Event_type: Intvar
  Server_id: 1
End_log_pos: 969
       Info: INSERT_ID=277
*************************** 3. row ***************************
   Log_name: mysql-bin.000004
        Pos: 969
 Event_type: Query
  Server_id: 1
End_log_pos: 1247
       Info: use `user`; insert into test (title,url,url_md5,url_token,view_time) values('test','www.baidu.com','ae98f26d3b883f80b3eadb8709467607','1438524738','1405517003')
*************************** 4. row ***************************
   Log_name: mysql-bin.000004
        Pos: 1247
 Event_type: Xid
  Server_id: 1
End_log_pos: 1274
       Info: COMMIT /* xid=137 */
4 rows in set (0.00 sec)

4.2 使用二进制日志恢复数据

使用mysql的命令行工具,可以方便的将binlog中的sql语句导出,导出后的sql语句可以方便的用于恢复数据库。具体格式可以参考mysqlbinlog --help的输出,下面是两个最常用的例子:

#将mysql中的命令点870到命令点1274之间的sql语句导出到文件中
mysqlbinlog --start-position=870 --stop-position=1274 mysql-bin.000004  > /tmp/mysql_restore.sql
#将mysql中的binlog中某段时间内的sql导出,可用于恢复一段时间的数据
mysqlbinlog --start-datetime="2012-07-16 00:00:00" --stop-datetime="2012-07-17 00:00:00" mysql-bin.000004 > /tmp/mysql_restore.sql

时间: 2024-08-30 19:35:26

深入分析mysql日志教程的相关文章

MySQL日志分析软件mysqlsla的安装和使用教程_Mysql

一.下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz --19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz Resolving hackmysql.com... 64.13.232.157 Connecting to hackmysql.com|64.13.232.157|:80... connec

mysql 日志清除与mysql 日志分析

mysql教程 日志清除与mysql 日志分析 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename - 要操作的数据库教程名 Select @LogicalFileName = 'tablename_log', - 日志文件名 @MaxMinutes = 10, - Limit on time allowed to wrap log. @NewSize = 1 -

lnmp关闭mysql日志保护硬盘空间的方法_Mysql

下面先来分享一下,关闭mysql日志的方法 LNMP一键包安装的Mysql默认开启Mysql日志,如果网站对数据库读写较为频繁的话可能会产生大量日志,并占用磁盘空间,还有可能导致VPS的硬盘闲置空间消耗满导致数据库无法开启. 本教程的路径适用于LNMP一键安装包环境,其它环境请根据实际情况操作. 若需要关闭,请执行以下操作: 一.修改文件配置 修改/etc/my.cnf,找到以下字符 log-bin=mysql-bin binlog_format=mixedbash 注释这两行,如下: #log

zabbix监控MySQL日志文件的例子

一般情况下,日志最先反映出应用当前的问题,在海量日志里面找到我们异常记录,然后记录下来,并且根据情况报警,大家可以监控系统日志.nginx.Apache.业务日志.这边我拿常见的MySQL日志做监控,大家看演示. 监控日志key 首先要了解key,log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>] file:文件名,写绝对路径 regexp:要匹配内容的正则表达式,或者直接写你要检索的

Mysql 5.7.17安装后登录mysql的教程

mysql-5.7.17的安装在文章下面有介绍,大家可以参考下.下面先给大家介绍下Mysql 5.7.17安装后登录mysql的教程,一起看看吧. 在运行 ./bin/mysqld –initialize 初始化数据库时,会生成随机密码,示例: [Note] A temporary password is generated for root@localhost: Wtng#?e&S5,- 例中密码为 Wtng#?e&S5,- ,首次登录 mysql,用这个密码. $ /usr/local

了解和正确维护MySQL日志

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1433576 前段时间自己给自己挖了坑,为了优化MySQL数据库配置在运行有InnoDB的MySQL数据库中修改了my.cnf文件中关于InnoDB的部分配置,尽管是在关机的情况下操作的,但依旧忽略了InnoDB对日志文件(如ibdata1.ib_logfile0.ib_logfile1.ib_logfile2)强大

如何修改MySQL日志文件位置?

MySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面就教您修改MySQL日志文件位置的方法,供您参考. 今天需要改MySQL日志文件的位置,发现在/etc/my.cnf中怎么也改不了. 后来发现MySQL日志位是指定的: [root@localhost etc]# ps auxgrep mysqld   root     11830 0.5 0.0   4524 1204 pts/0    S    03:03   0:00 /bin/

PHP 和 MySQL 基础教程(三)

mysql|基础教程 用 cookies 来跟踪识别用户 让我们来看看保存在浏览器中的内容.如果你用的是 IE5 ,在 windows 目录下有一个 cookies 的目录,里面有很多文本文件,文件名都是类似于 wudong@15seconds[1].txt 这样的,这就是浏览器用来保存值的 cookies 了.在以前的 IE 版本中, cookies 的内容是可以察看的,但现在内容已经被编码了.在浏览器得到一个 Web 页面之前,它会先看这个页面的域名,是否在 cookie 中存在,如果有相比

PHP 和 MySQL 基础教程(二)

mysql|基础教程 数据验证 清理空格 trim 函数将清除数据头尾的空格,它的语法是: trim ($first_name); 必填字段的处理 在你数据库中,有些字段时必须填写的.这样对应于 HTML 表单的相应的字段也不允许空出来不填.当然,这个检验处理的过程可以用客户端的 JavaScript 脚本来处理,但既然我们讲的是 PHP ,就还使用 PHP 来处理吧.下面的代码检查用户的姓是否输入: if (ereg(".", $first_name) == 1) { print (