在 MySQL中,有 4 种不同的日志,分别是错误日志、二进制日志(BINLOG 日志)、查询日志和慢查询日志。

1.错误日志

  • 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。
  • 指定 mysqld(MySQL 服务器)保存错误日志文件的位置:

      --log-error[=file_name]

   如果没有给定 file_name 值,mysqld 使用错误日志名 host_name.err(host_name 为主机名)并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。

2.二进制日志

  • 二进制日志(BINLOG)记录了所有的 DDL(数据定义语言) 语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。此日志对于灾难时的数据恢复起着极其重要的作用。

2.1日志的位置和格式

  • 当用 --log-bin[=file_name] 选项启动时,mysqld 开始将数据变更情况写入日志文件。如果没有给出 file_name 值,默认名为主机名跟“-bin”。如果给出了文件名,但没有包含路径,则文件默认被写入参数 DATADIR(数据目录)指定的目录。
  • MySQL 5.5 中,二进制日志的格式分为 3 种:STATEMENT、ROW、MIXED,可以在启动时通过参数 --binlog_format 进行设置,这 3 种格式的区别如下。

  1)STATEMENT

     MySQL 5.1 之前的版本都采用这种方式。顾名思义,日志中记录的偶素是语句(statement),每一条对数据造成修改的 SQL 语句都会记录在日志中,通过 mysqlbinlog 工具,可以清晰的看到每条语句的文本。主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。

这种格式的优点是日志记录清晰易读、日志量少,对 I/O 影响较小。

缺点是某些情况下 slave 的日志复制会出错。

  2)ROW

     MySQL 5.1.11 之后,出现了这种新的日志格式。它将每一行的变更记录到日志中,而不是记录 SQL 语句。

这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。

缺点是日志量大,对 I/O 影响较大。

  3)MIXED

     这是目前 MySQL 默认的日志格式,即混合了 STATEMENT 和 ROW 两种日志。默认情况下采用 STATEMENT,但在一些特殊情况下采用 ROW 来进行记录,比如采用 NDB 存储引擎,此时对表的 DML 语句全部采用 ROW;客户端使用了临时表;客户端采用了不确定函数,比如 current_user() 等,因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。MIXED 格式能尽量利用两种模式的优点,而避开它们的缺点。

注意:可以在 global 和 session 级别对 binlog_format 进行日志格式的设置,但一定要谨慎操作,确保从库的复制能够正常进行。

2.2日志的读取

由于日志以二进制的方式存储,不能直接读取,需要用 mysqlbinlog 工具来查看,语法如下:

     shell > mysqlbinlog log-file;

如果日志是 ROW 格式,则 mysqlbinlog 解析后是一堆无法读懂的字符。此时可以加上 -v 或者 -vv 参数进行读取。

2.3日志的删除

  • 方法1

    执行

      RESET MASTER;

    命令,该命令将删除所有 BINLOG 日志,新日志编号从 000001 开始。

  • 方法2

    执行

      PURGE MASTER LOGS TO 'mysql-bin.******'

    命令,该命令将删除 “******” 编号之前的所有日志。

  • 方法3

    执行

      PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh24:mi:ss'

    命令,该命令将删除指定日志之前产生的所有日志。

  • 方法4

    设置参数 --expire_logs_days=#,此参数的含义是设置日志的过期天数,过了指定的天数后日志将会被自动删除,这样将有利于减少 DBA 管理日志的工作量。

  • 触发日志文件更新:

      mysqladmin flush-log

2.4其他选项

  • 二进制日志由于记录了数据的变化过程,对于数据的完整性和安全性起着非常重要的作用。因此,MySQL 还提供了一些其他参数选项来进行更小粒度的管理。

      --binlog-do-db=db_name:该选项告诉主服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,应该更新记录到二进制日志中。其他所有没有显式指定的数据库更新将被忽略,不记录在日志中。

      --binlog-ignore-db=db_name:该选项告诉服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,不应该将更新保存到二进制日志中,其他没有显式忽略的数据库都将进行记录。

如果想记录或忽略多个数据库,可以对上面两个选项分别使用多次,即对每个数据库指定相应的选项。

      --innodb-safe-binlog:此选项经常和 --sync-binlog=N(每写 N 次日志同步磁盘)一起配合使用,使得事务在日志的记录更加安全。

      SET SQL_LOG_BIN=0:具有 SUPER 权限的客户端可以通过此语句禁止将自己的语句记入二进制记录。这个选项在某些环境下是有用的,但是使用时一定要小心,因为它很可能造成日志记录的不完整或者在复制环境中造成主从数据的不一致。

3查询日志

  • 查询日志记录了客户端的所有语句。

3.1日志的位置和格式

  • 查询日志和慢查询日志都可以选择保存在文件或者表汇总,并使用参数

      --log-output[=value, ...]
    来进行控制,value 值可以使 TABLE、FILE、NONE 的一个或者多个组合,中间用逗号进行分割,分别表示日志保存在表、文件、不保存在表和文件中,这里的表指的是 mysql 库中的 general_log(慢查询日志是 slow_log)表。其中 NONE 的优先级最高。

  • 在 MySQL 5.5.7 之前的版本中,日志记录到表比记录到文件要占用更多的系统资源,如果需要更高的性能,则建议使用文件来记录日志。

    启用查询日志:

      --general_log[={0|1}]      #控制是否启用日志。1或者不带值可以启用查询日志;0关闭查询日志。不指定该参数也不启用查询日志。

                        #5.1.29 之前使用 --log[=file_name] 或 -l [file_name]

      --general_log_file[=file_name]  #控制日志文件的路径。如果没有指定值,且没有显式设置 --log-output参数,那么日志将写入参数 DATADIR(数据目录)指定的路径下,默认文件名是 host_name.log。这两个参数都是 global 类型,可以在系统启动时或者系统运行时进行动态修改,如果想在 session 级别控制日志是否被记录,则通过在 session 中设置参数 sql_log_off 为 on 或者 off 来进行控制。

3.2日志的读取

  • 查询日志记录的格式是纯文本,所以可以直接进行读取。

4慢查询日志

  • 慢查询日志记录了所有执行时间超过参数 long_query_time(单位:秒)设置值并且扫描记录数不小于 min_examined_row_limit 的所有 SQL 语句的日志(注意:获得表锁定的时间不算作执行时间)。long_query_time 默认为 10 秒,最小为 0,精度可以到微秒。
  • 在默认情况下,有两类常见语句不会记录到慢查询日志:管理语句和不使用索引进行查询的语句。这里的管理语句包括 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE。如果要监控这两类 SQL 语句,可以分别通过参数 --log-slow-admin-statements 和 log_queries_not_using_indexes 进行控制。

4.1文件位置和格式

  • 慢查询日志默认是关闭的。
  • 在 MySQL 5.1.29 之前,使用

      --log-slow-queries[=file_name]

    选项启动 mysqld(MySQL 服务器)时,慢查询日志开始被记录。和前面几种日志一样,如果没有给定 file_name 的值,日志将写入参数 DATADIR(数据目录)指定的路径下,默认文件名是 host_name-slow.log。

  • 在 MySQL 5.1.29 之后,--log-slow-queries 已经不推荐使用,而采用两个新的参数来替换:使用

      --slow_query_log[={0|1}]

    显式指定慢查询的状态,如果不指定值或者指定值为 1 都会打开慢查询;使用

      slow_query_log_file[=file_name]

   来指定慢查询日志的路径。另外,如前所述,还可以使用 --log-output 参数来指定日志输出方式,默认会输出到文件,当然也可以选择输出到表,需要注意的是,如果选择输出到表,则表中记录的慢查询时间只能精确到秒,而日志文件可以精确到微秒。

4.2日志的读取

  • 和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。
  • 如果慢查询日志中记录内容很多,可以使用 mysqldumpslow 工具来对慢查询日志进行分类汇总。
  • 对于 SQL 文本完全一致,只是变量不同的语句,mysqldunpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的 SQL 瓶颈。
  • 慢查询日志对于我们发现应用中有性能问题的 SQL 很有帮助,建议正常情况下打开此日志并经常查看分析。
 #错误日志
log-err=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/err.log
#二进制日志
log-bin=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/bin
#查询日志
general_log=1
general_log_file=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/query.log
#慢查询日志
slow_query_log=1
slow_query_log_file=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/slow-query.log
long_query_time=2

window 下的配置,一定要用 /,用 \ 最后总是被转义。

5.mysqlsla 简介

  • mysqlsla 是 MySQL Statement Log Analyzer 的缩写,它可以分析查询日志、慢查询日志(包括微秒日志)、二进制日志和具有固定格式的自定义日志。
  • mysqlsla 基本用法:

    解析查询日志和慢查询日志:

      mysqlsla --log-type slow LOG

      mysqlsla --log-type general LOG

    解析二进制日志,需要先通过 mysqlbinlog 进行转换:

      mysqlbinlog LOG | mysqlsla --log-type binary -

    解析微秒日志:

      mysqlsla --log-type msl LOG

    解析用户自定义日志:

      mysqlsla --log-type udl --udl-format FILE

    需要注意的是,除二进制日志外,其他类型日志的 --log-type 参数在正常情况下可以省略,mysqlsla 会自动分析日志类型进行解析;而 mysqlsla 无法判断经过标准输出后的日志类型,因此二进制日志通过 mysqlbinlog LOG 解析后mysqlsla 无法判断日志类型,必须加上 --log-type 参数。

  • mysqlsla 提供了很多可选参数,下面列出了一些常用的参数:

      --statement-filter (-sf) CONDTIONS 用来过滤语句类型,CONDTIONS 前面可以加 + 或者 -,表示报表中 仅显示 或者 仅去掉 后面的语句类型。

      --explain (-ex) 用来在报表中显示执行计划。

      --sort 是排序方式,慢查询日志和微秒日志默认是按照总执行时间 t_sum 来排序,其他日志都按照执行次数 c_sum 来排序。

      --grep PATTERN 用来匹配 SQL 语句中的特定字符串。

  • 为了方便使用,可以将 mysqlsla 的常用配置选项写入 ~/.mysqlsla,这个文件是 mysqlsla 的配置文件,mysqlsla 使用时会读取里面的配置。
  • 除了 mysqlsla,还有一些常用的日志分析工具,比如 myprofi、mysql-explain-slow-log、mysqllogfilter。

6.小结

  • 系统故障时,建议首先查看错误日志,以帮助用户迅速定位故障原因。
  • 如果要记录数据的变更、数据的备份、数据的复制等操作时,二进制日志必须打开,以帮助用户进行数据恢复等操作。默认不记录此日志,建议通过 --log-bin 选项将此日志打开。
  • 如果希望记录数据库发生的任何操作,包括 SELECT,则需要用 --log 将查询日志打开,此日志默认关闭,一般情况下建议不要打开此日志,以免影响系统整体性能。
  • 如果希望查看系统的性能问题,希望找到有性能问题的 SQL 语句,则需要要 --slow_query_log 打开慢查询日志。对于大量的慢查询日志,建议使用 mysqldumpslow 工具来进行汇总查看。

MySQL--MySQL 日志的更多相关文章

  1. MySQL错误日志总结

    MySQL错误日志是记录MySQL 运行过程中较为严重的警告和错误信息,以及MySQL每次启动和关闭的详细信息.错误日志的命名通常为hostname.err.其中,hostname表示服务器主机名. ...

  2. mysql数据库服务日志

    mysql数据库服务日志 ①. 错误日志:error_log ②. 普通日志:general_log ③. 慢查询日志:log-slow-query #有3个参数 分割:.mv .编写定时任务并执行: ...

  3. mysql 二进制日志后缀数字最大为多少

    之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...

  4. MySQL慢日志监控脚本实例剖析

    公司线上的 MySQL 慢日志,之前一直没有做好监控.趁着上周空闲,我就把监控脚本写了下,今天特地把代码发出来与51博友分享一下. 针对脚本的注解和整体构思,我会放到脚本之后为大家详解. 1 2 3 ...

  5. MySQL二进制日志的备份和恢复

    二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...

  6. [mysql] mysql 5.6.X 慢查询日志

    慢查询日志 一篇好文章,学习保存.... 打开慢查询日志 慢查询日志,顾名思义就是记录执行比较慢查询的日志. 查看是否开启慢查询日志: show variables like '%slow%'; 打开 ...

  7. mysql 的日志文件

    mysql的日志文件 日志文件大致分为  error log, binary log, query log, slow query log, innodb redo log ;如图: 1.error ...

  8. Mysql打开日志信息

    还可参考博客:http://pangge.blog.51cto.com/6013757/1319304 1)怎么查看mysql是否启用了日志 mysql>show variables like ...

  9. [转载]mysql慢日志文件分析处理

    原文地址:mysql慢日志文件分析处理作者:maxyicha mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysq ...

  10. ELK监控系统nginx / mysql慢日志

    ELK监控系统nginx / mysql慢日志 elasticsearch logstash kibana ELK监控系统nginx日志 1.环境准备 centos6.8_64 mini IP:192 ...

随机推荐

  1. Bulma CSS - CSS类

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...

  2. K8S Kubernetes 简单介绍 转自 http://time-track.cn/kubernetes-trial.html Kubernetes初体验

    这段时间学习了一下 git jenkins docker  最近也在看  Kubernetes  感觉写得很赞  也是对自己对于K8S 有了进一步得理解  感谢 倪 大神得Blog 也希望看到这篇Bl ...

  3. Git - 版本管理 - 版本回退

    1 在历史里找到 SHA-1 的值 0c6ab03dbbfe61e39af92dfe5450bf693a72b7d9 2 命令行里执行:git reset --hard 0c6ab03dbbfe61e ...

  4. 63.Python中contains和icontains

    1. contains: 进行大小写敏感的判断,某个字符串是否包含在指定的字段中,这个判断条件使用大小写敏感进行判断,因此在被翻译成"SQL"语句的时候,会使用"like ...

  5. 文献阅读报告 - Social GAN: Socially Acceptable Trajectories with Generative Adversarial Networks

    paper:Gupta A , Johnson J , Fei-Fei L , et al. Social GAN: Socially Acceptable Trajectories with Gen ...

  6. ajax 跨域webapi 最简单的demo(只介绍Get)

    这几天遇到一个nodejs的项目,使用VSCode开发,需要连接数据库的,但是用nodejs连接数据库比较繁琐,需要安装很多东西,本人也懒得去研究了.后来想到建一个WebAPI然后用ajax来调用,避 ...

  7. 合理控制MBA Essay写作字数很重要

    作为一个MBA申请人,在Essay写作的时候一定会迸发各种各样的想法和念头,想要统统传达给招生官.然而面对有限的字数限制,想要尽可能多地在Essay中涵盖重要信息,就让人颇为头痛了. 面对想要倾诉的欲 ...

  8. 实验吧Web-易-天网管理系统(php弱类型,==号)

    打开网页,查看源码,看到 <!-- $test=$_GET['username']; $test=md5($test); if($test=='0') --> 说明用户名需要加密之后为0. ...

  9. 吴裕雄--天生自然C++语言学习笔记:C++ 常量

    常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符.字符串和布尔值. 常量就像是常规的变量,只不过常量的值在定义后不能进行 ...

  10. webapi 传入参数校验

    /// <summary> /// 传入参数校验过滤器 /// </summary> public class ValidateReqModelFilter : ActionF ...