首页 > 代码库 > MySQL Logs

MySQL Logs

摘要

一、MySQL日志

  1.1 查询日志

  1.2 慢查询日志

  1.3 错误日志

  1.4 二进制日志

一、 MySQL日志

MySQL服务器上一共有六种日志:错误日志,查询日志,慢查询日志,二进制日志,中继日志以及事务日志。

 

 

1.1 查询日志

查询日志就是用来记录查询的,但是查询日志会增加很多的磁盘I/O,所以如非处于调试目的,不建议开启查询日志

general_log: ON表示开启,OFF表示关闭,默认是关闭

log_output: 日志输出类型,FILE|TABLE|NONE

general_log_file=HOSTNAME.log 日志输出路径

 

#General logging.:
log-output=FILE
general-log=1
general_log_file="filename.log"

 

1.2 慢查询日志

执行时长(包括等待CPU/IO的时间)超过long_query_time定义时长的查询。慢查询日志开销较小,可以用于定位性能问题,建议开启

相关参数:

  slow_query_log = {ON|OFF}:是否启用慢查询日志
  slow_query_log = /path/to/somefile: 日志文件路径

  log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
  log_slow_rate_limit = 限制记录日志的速率
  log_slow_verbosity = 慢查询日志详细程度,越详细越容易分析,消耗越大

 

demo:

mysql> SHOW VARIABLES LIKE slow_query_log%;
+---------------------+--------------------------------------------------+
| Variable_name       | Value                                            |
+---------------------+--------------------------------------------------+
| slow_query_log      | OFF                                              |
| slow_query_log_file | /usr/local/var/mysql/upstreamdeMac-mini-slow.log |
+---------------------+--------------------------------------------------+

 

 

1.3 错误日志

错误日志不仅仅记录错误信息,它记录的事件有:

-mysqld启动和关闭过程中输出的信息;
-mysqld运行中产生的错误信息;
-event scheduler运行一个event时产生的日志信息;
-在主从复制架构中的从服务器上启动从服务器线程时产生的日志信息;

  log_error = {ON | OFF | /path/to/somefile}

    定义错误日志文件。ON的话有默认路径
  log_warnings = {ON|OFF}:是否记录警告信息于错误日志中;

 

1.4 二进制日志

  记录了MySQL数据库中所有与更新相关的操作,常用于恢复数据库和主从复制

 

(1) 查看日志文件

显示所有的日志文件:

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |    276665 |
+------------------+-----------+
1 row in set (0.03 sec)

显示当前正在使用的日志文件:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

(2) 查看日志内容

SHOW BINLOG EVENTS [IN log_name] [FROM pos] [LIMIT [offset,] row_count]

 (3) 日志文件说明

有三种格式:

  基于"语句"记录: statement,只记录语句

  基于"行"记录:row,记录数据,因此数据量更大

  混合模式:mixed,系统自行判定

由二部分文件构成:

  日志文件:mysql-bin.文件名后缀,是二进制格式

  索引文件:mysql-bin.index 是文本格式

(4) 相关变量

  sql_log_bin=ON|OFF 是否记录二进制日志

  log_bin={ON | OFF |/PATH/TO/BIN_LOG_FILE}:  记录位置

  binlog_format = {statement | row | mixed} 日志格式

  max_binlog_size=1073741824 单个二进制日志文件的最大体积,默认是1G,到达1G会自动滚动

  max_binlog_cache_size=18446744073709547520 日志io相关,数据内存缓存

  max_binlog_stmt_cache_size = 18446744073709547520 日志io相关,语句内存缓存

  expire_logs_days=0 自动日志清理功能 0表示永不清理

  sync_bin_log=1 | 0 为了尽量不影响性能,日志的写入也是异步的,设定多久同步一次二进制日志文件

            设定0表示不同步,可能会影响数据

 

(5) 客户端工具: mysqlbinlog

  -j, start-position=#: 从指定的事件位置查看

  --stop-position=#: 只显示到指定的事件位置  

  --start-datetime=name

  --stop-datetime=name

    YYYY-MM-DD hh:mm:ss

  -u
  -h
  -p

 

日志信息格式说明:

# at 13383
            #161021  4:31:55 server id 1  end_log_pos 13509     Query    thread_id=18    exec_time=0    error_code=0
            SET TIMESTAMP=1476995515/*!*/;
            ALTER TABLE `test`.`t1` 
            ADD INDEX `INDEX_T1_NAME` (`name` ASC)
            /*!*/;
            # at 13509


            事件发生的日期和时间;(161021  4:31:55)
            事件发生在服务器的标识(server id)
            事件的结束位置:(end_log_pos 13509)
            事件的类型:(Query)
            事件发生时所在的服务器执行此事件的线程的ID:(thread_id=18)
            语句的时间戳与将其写入二进制文件中的时间差:(exec_time=0)
            错误代码:(error_code=0)
            事件内容:
                SET TIMESTAMP=1476995515/*!*/;
                ALTER TABLE `test`.`t1` 
                ADD INDEX `INDEX_T1_NAME` (`name` ASC)
                /*!*/;                    
            
            GTID事件专属:
            事件所属的全局事务的GTID:(GTID 0-1-2

 

演示:

c、提取指定position位置的binlog日志并输出到压缩文件  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 |gzip >extra_01.sql.gz  

d、提取指定position位置的binlog日志导入数据库  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | mysql -uroot -p  

e、提取指定开始时间的binlog并输出到日志文件  
# mysqlbinlog --start-datetime="2014-12-15 20:15:23" /opt/data/APP01bin.000002 --result-file=extra02.sql  

f、提取指定位置的多个binlog日志文件  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 /opt/data/APP01bin.000002|more  

g、提取指定数据库binlog并转换字符集到UTF8  
# mysqlbinlog --database=test --set-charset=utf8 /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 >test.sql  

h、远程提取日志,指定结束时间   
# mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --stop-datetime="2014-12-15 20:30:23" --read-from-remote-server mysql-bin.000033 |more  

i、远程提取使用row格式的binlog日志并输出到本地文件  
# mysqlbinlog -urobin -p -P3606 -h192.168.1.177 --read-from-remote-server -vv inst3606bin.000005 >row.sql  

 

 

 

   

 

 

MySQL Logs