MySQL——MySQL日志查询

1、MySQL数据库中常见的日志文件

  • 错误日志(error log)
  • 二进制日志(binlog)
  • 慢查询日志(slow query log)
  • 查询日志(general log)

    2、错误日志

    错误日志(error log)对MySQL的启动、运行、关闭过程进行了记录, 主要作用是帮助 MySQL DBA 在遇到问题时快速定位问题。 该文件不仅记录了所有的错误信息(ERROR),也记录了一些警告信息(Warning)以及普通信息(Note)。错误日志默认是开启的,默认存放路径为datadir,默认的日志文件名为hostname.err(hostname为主机名),且错误日志是可以直接阅读的日志,建议开启。

    2.1、错误日志的简单配置

    # 设置错误日志log-err存储路径及文件名前缀
    log-error = /usr/local/mysql/logs/mysql-error
    

    2.2、查看错误日志文件存储位置

    show variables like 'log_error%';
    

    3、二进制日志

    二进制日志(binlog)记录了对MySQL数据库执行更改的所有操作,但是不包括select和show语句,其中包括了所有的DDL(数据定义语言)和DML(数据操作语言),如create、alter、drop、truncate以及insert、delete、update等,主要作用是进行数据恢复和主从复制。

    二进制日志默认为关闭状态,需要在MySQL配置文件中进行开启,并设置二进制日志文件的日志记录形式。开启二进制日志对于MySQL整体性能会有一定的影响,大于为1%,但是考虑到二进制日志提供的功能,这种性能损失是完全可以接受的,建议开启。

    3.1、二进制日志的简单配置

    # 设置二进制日志log-bin存储路径及文件名前缀
    # 若不指定具体路径,则是存放在datadir路径下
    log-bin = /usr/local/mysql/logs/mysql-bin
    # 设置binlog日志记录格式
    binlog-format = STATEMENT
    

    在存储二进制日志文件的文件夹内,一般包含二进制日志索引文件(.index)和二进制日志文件(.00000X),其中二进制日志索引文件(.index)中记录的是所有二进制日志文件的文件名,是直接可阅读的,而二进制日志文件(.00000X)记录的则是二进制日志,不可以直接阅读,可以使用MySQL服务器命令行工具 mysqlbinlog 进行查看。

    3.2、二进制日志记录格式

    • STATEMENT:在此记录格式下,二进制日志文件中记录的是对数据库造成修改的逻辑SQL语句,通过mysqlbinlog工具看到的是修改行为对应的SQL语句;
    • ROW : 在此记录格式下,二进制日志文件中不再是记录简单的SQL语句,而是记录表的行更改情况,是目前(MySQL 5.7)默认的二进制日志文件的记录格式,由于记录的是表中行记录的更改,当进行批量修改时,相比于STATEMENT需要占用的存储空间要大得多;
    • MIXED:在此记录格式下,MySQL一般会采用STATEMENT格式进行二进制文件的记录,但是在一些特殊情况下会使用ROW格式进行记录。

      并不是所有的存储引擎都支持STATEMENT和ROW记录格式。

      3.3、二进制日志的查看

      使用MySQL提供的服务器命令行工具mysqlbinlog可以通过多种方式查看和管理二进制日志文件binlog。在MySQL客户端命令行也可以使用对应命令查看二进制日志。

      # 语法
      mysqlbinlog [options] log-files1 log-files2...
      # 常用选项
      -d, --database=name        指定数据库名称
      -o, --offset=n          设置查看的偏移量,即忽略前n行
      -r, --result-file=name      将显示内容输出到指定文件
      -s, --short-from        按照简单格式显示,省略部分信息
      --start-datatime=detel --stop-datatime=date2
                      指定日志显示条目的时间间隔
      --start-position=pos1 --stop-position=pos2
                      指定日志显示条目的开始和结束位置
      

      3.4、二进制日志的删除

      • 方法一: 在MySQL客户端直接执行reset master命令,直接删除所有的 binlog 日志,并且日志编号从000001重新开始;
      • 方法二: 在MySQL客户端执行PURGE MASTER LOGS TO 'mysql-bin.xxxxxx',此命令将删除指定编号之前的所有二进制日志,需要指定二进制日志文件名;
      • 方法三: 在MySQL客户端执行命令PURGE BINARY LOGS BEFORE 'YYYY-MM-DD hh:mm:ss';,此命令将删除指定日期之前的所有二进制日志;
      • 方法四: 设置binlog的自动过期天数,日志存放指定时间后将被自动删除,可以通过在MySQL配置文件中设置expire-logs-days参数,或者直接在MySQL客户端命令行中设置全局变量expire_logs_days来开启自动日志清除。

        3.5、利用二进制日志的数据恢复

        MySQL官方提供的mysqlbinlog 命令行工具不仅可以查看binlog日志文件,还可以基于binlog二进制日志文件对数据库中的数据进行恢复,实际上就是将对数据库进行修改的逻辑 SQL 语句再顺序执行一次。

        进行数据恢复时必须要有对应数据库某个时间点的备份。例如:如果误删了某张表的数据,则可以先将数据库恢复最近的备份状态,然后从二进制文件中获取上一次备份的到删表之前的SQL语句重新执行,最终将数据库恢复到删表之前的状态。

        恢复步骤
        • 获取删表前到数据库备份时二进制日志位置,以及删除表过程在二进制日志中的起始位置;

          • 找出备份过程在对应二进制日志中的结束位置**pos1** :

            cat books.sql | grep -i "CHANGE MASTER TO MASTER_LOG_FILE"
            # 示例
            -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3361;
            
          • 找到删除表过程在对应二进制日志中的开始位置 pos2 ,通过 less 命令检索指定 SQL 语句定位pos:

            mysql -uroot -proot -e "show binlog events in 'mysql-bin.000002'\G" | less -N
            # 示例
            *************************** 40. row ***************************
               Log_name: mysql-bin.000002
                    Pos: 3713
             Event_type: Query
              Server_id: 1
            End_log_pos: 3845
                   Info: use `books`; DROP TABLE IF EXISTS `authors` /* generated by server */
            
          • 导入备份库数据重建库

            mysql -uroot -proot < books.sql
            
          • 获取对应二进制日志文件中pos1到pos2之间修改指定数据库的SQL语句并重新执行:

            mysqlbinlog --start-position=3361 --stop-position=3713 -d books mysql-bin.000002 | mysql -uroot -proot
            

            4、慢查询日志

            慢查询日志(slow query log)能够记录执行时间超过某阈值的SQL语句,且只记录成功执行的SQL语句,可以帮助DBA定位可能存在问题的SQL语句,从而进行SQL语言层面的查询优化。慢查询日志默认文件名为主机名-slow.log,默认存放路径为datadir,默认为关闭状态,建议开启。

            慢查询日志的简单配置

            # 同时设置查询日志general log和慢查询日志slow query log输出方式(可选FILE/TABLE/NONE/FILE,TABLE)
            log-output = FILE
            # 设置启动慢查询日志slow-query-log
            slow-query-log=1
            # 设置慢查询日志slow-query-log存储路径及文件名
            slow-query-log-file = /usr/local/mysql/logs/slow_query_log.log
            # 设置慢查询阈值
            long-query-time = 10
            

            5、查询日志的简单配置

            查询日志(general log)也叫作通用日志,可以直接阅读,其中记录了所有对MySQL数据库请求的信息以及对应执行的SQL语句,不论这些请求是否得到了正确的执行。此日志功能默认为关闭状态,不建议开启。

            查询日志的简单配置

            # 同时设置查询日志general log和慢查询日志slow query log输出方式(可选FILE/TABLE/NONE/FILE,TABLE)
            log-output = FILE
            # 设置开启通用日志general-log
            general-log = 1
            # 设置通用日志存储路径及文件名
            general-log-file = /usr/local/mysql/logs/general.log