1、日志的类型

查询日志:

   用于保存当前系统所有跟查询操作相关的信息;(不仅仅SELECT语句)

   繁忙的Mysql服务器上查询操作很频繁,每次都记录日志,会导致系统性能下降和额外的空间开销,不应该开启;默认为关闭

   查询日志相关的变量:

     log:{ON|oFF} 是否记录所有语句的日志信息于一般查询日志文件(general_log),已弃用

     log_output={TABLE|FILE|NONE}

              table和file可以同时出现,用逗号分隔即可

     general_log={ON|OFF}是否启用查询日志

     general_log_file=hostname.log  定义了一般查询日志保存的文件,通常是hostname.log


慢查询日志

   查询执行时长超过指定时长的查询,即为慢查询

   通常用于定位查询操作执行过慢的评估工具,很有必要启动慢查日志;默认为关闭    

   慢查询日志相关的变量:

      slow_query_log={ON|OFF} 是否启用慢查询日志,它的输出位置也取决于log_output={table|file|none}

      slow_query_log_file=hostname-slow.log   定义慢查询日志的文件

      long_query_time=10.00000           慢查询的时间,超过这个时间就是慢查询

      long_slow_filter: 不记录慢查记录

      log_slow_queries={ON|OFF}         会话级别的慢查询日志开关

      log_slow_rate_limit=N             记录慢查日志的速率

      log_slow_verbosity               是否记录慢查询日志的详细信息


错误日志:

  记录服务器启动和关闭过程中的信息;服务器运行过程中的错误信息;

  事件调度器运行一个事件时产生的信息;在复制架构中的从服务器上启动从服务器线程时产生的信息

      log_error = /path/to/error_log_file    错误日志记录的文件

      log_warnings = {1|0}              是否记录警告信息保存至错误日志中,默认为1


二进制日志:

   记录修改相关的操作,用来实现复制的凭据

 

中继日志:

   从服务器从主服务器上的复制过来的二进制日志

   对于非从服务器,中继日志没有启用;

   

  和中继日志相关的服务器变量:

  relay_log                值的格式和二进制日志一样     

  relay_log_index            值的格式和二进制日志一样

  relay_log_purge = {ON|OFF}     是否自动清理不在需要的中继日志;默认ON

  relay_log_space_limit        中继大小是否限制;默认0

  relay_log_recovery          中继日志自动恢复相关

  

事务日志:

   将随机I/O转换为顺序I/O 

  日志文件组:至少要存在两个,实现轮询

  注意:尽可能使用小事务来替代大事务来提升事务引擎的性能


2、二进制日志

   记录了当前服务器的数据修改和有潜在可能性影响数据修改的语句

作用: 

   按时间点恢复

   复制


默认存放在数据目录下,通常情况下为mysql-bin:

[root@Node5 ~]# ls /data/mydata
aria_log.00000001  ib_logfile1        mysql-bin.000001  mysql-bin.000005  Node5.pid
aria_log_control   multi-master.info  mysql-bin.000002  mysql-bin.000006  performance_schema
ibdata1            mydb               mysql-bin.000003  mysql-bin.index   test
ib_logfile0        mysql              mysql-bin.000004  Node5.err

[root@Node5 mydata]# file mysql-bin.000006
mysql-bin.000006: MySQL replication log      
### 二进制格式的文件,需要用专门的工具mysqlbinlog来查看:

[root@Node5 mydata]# mysqlbinlog mysql-bin.000006

### 文件格式

# at 6842
#170221 16:26:52 server id 1  end_log_pos 6880 	GTID 0-1-63 ddl
/*!100001 SET @@session.gtid_seq_no=63*//*!*/;
# at 6880
#170221 16:26:52 server id 1  end_log_pos 6961 	Query	thread_id=55	exec_time=0	error_code=0
use `mysql`/*!*/;
SET TIMESTAMP=1487665612/*!*/;
FLUSH QUERY CACHE
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

事件的偏移位置(时间记录法):position

时间记录(空间记录法):time


查看当前使用的二进制日志和下一个事件开始时的基于的位置show master status;

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 |     6961 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.35 sec)

MariaDB [(none)]>

日志滚动:

   可以按照大小定义:默认当超过1G(未必精确),日志会滚动

   时间定义:

   每次重启服务器或执行执行flush logs,会滚动二进制日志和中继日志


mysql记录二进制日志的格式:

  基于语句:statement,

            date()这类会发生变化的数据存储会不一致

  基于行:row,更精确,但数据量更大

            很有可能会产生大量数据

  混合模式:mixed,mysqld自动判断基于语句还是基于行


手动清除日志:   # 不能直接删除二进制日志文件

 PURGE { BINARY | MASTER } LOGS 

 { TO 'log_name'(某各文件名之前) | BEFORE datetime_expr(某个时间之前) } 

# 如果按时间来清楚二进制日志时,指定的时间点位于某二进制日志文件中,也能正常清楚


查看前服务器使用过的二进制日志文件列表:

MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     27990 |
| mysql-bin.000002 |       346 |
| mysql-bin.000003 |      1510 |
| mysql-bin.000004 |       346 |
| mysql-bin.000005 |       346 |
| mysql-bin.000006 |      7004 |
| mysql-bin.000007 |       409 |
| mysql-bin.000008 |       366 |
+------------------+-----------+
8 rows in set (0.00 sec)

MariaDB [(none)]>

在mysql命令行下也可以使用:SHOW BINLOG EVENTS命令来查看二进制日志:

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

MariaDB [(none)]> SHOW BINLOG EVENTS IN "mysql-bin.000008";
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+
| Log_name         | Pos | Event_type        | Server_id | End_log_pos | Info                                       |
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+
| mysql-bin.000008 |   4 | Format_desc       |         1 |         249 | Server ver: 10.1.21-MariaDB, Binlog ver: 4 |
| mysql-bin.000008 | 249 | Gtid_list         |         1 |         288 | [0-1-63]                                   |
| mysql-bin.000008 | 288 | Binlog_checkpoint |         1 |         327 | mysql-bin.000007                           |
| mysql-bin.000008 | 327 | Binlog_checkpoint |         1 |         366 | mysql-bin.000008                           |
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+
4 rows in set (0.00 sec)

Server-id:服务器身份标识

GTID:global transaction identifier 全局事务ID,MySQL5.6在5.5的基础上增加的新特性,GTID是完成多线程复制的基本依据

    

指定从某个位置开始读取二进制日志:

MariaDB [(none)]> SHOW BINLOG EVENTS IN "mysql-bin.000008" FROM 288;
+------------------+-----+-------------------+-----------+-------------+------------------+
| Log_name         | Pos | Event_type        | Server_id | End_log_pos | Info             |
+------------------+-----+-------------------+-----------+-------------+------------------+
| mysql-bin.000008 | 288 | Binlog_checkpoint |         1 |         327 | mysql-bin.000007 |
| mysql-bin.000008 | 327 | Binlog_checkpoint |         1 |         366 | mysql-bin.000008 |
+------------------+-----+-------------------+-----------+-------------+------------------+
2 rows in set (0.00 sec)


[root@Node5 mydata]# mysqlbinlog --start-position=288 mysql-bin.000008
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170221 21:04:25 server id 1  end_log_pos 249 	Start: binlog v 4, server v 10.1.21-MariaDB created 170221 21:04:25
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
2TqsWA8BAAAA9QAAAPkAAAABAAQAMTAuMS4yMS1NYXJpYURCAGxvZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA3QAEGggAAAAICAgCAAAACgoKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAEEwQAAMOvkZ0=
'/*!*/;
# at 288
#170221 21:04:25 server id 1  end_log_pos 327 	Binlog checkpoint mysql-bin.000007
# at 327
#700101  8:00:00 server id 1  end_log_pos 366 	Binlog checkpoint mysql-bin.000008
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@Node5 mydata]#

mysqlbinlog是mysql服务器的客户端工具,常用的选项:

       -u:用户帐号

       -p:密码

        -h:主机

       -P:端口

   --start-position

   --stop-position

         --start-datetime='时间'

        --stop-datetime='时间'

时间格式:YYYY-MM-DD hh:mm:ss

  -R,--read-from-remote-server

     从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。

[root@Node5 ~]# mysqlbinlog -h192.168.10.5 -p123 -R mysql-bin.000002


二进制日志文件内容格式:

  事件发生的日期和时间

  服务器ID

  事件结束位置

  事件的类型

  原服务器生成此事件时的线程ID号

  语句时间戳和写入二进制文件的时间差,单位为秒

  错误代码,0表示正常执行

  事件内容

  事件位置(相当于下一事件的开始位置)


和二进制日志相关的服务器变量:

  log_bin = {ON|OFF}, 还可以是一个文件路径指定文件如:/data/mybinlog/master-log 

### 查看配置文件/etc/my.cnf中log_bin的配置
log-bin=mysql-bin

  log_bin_trust_function_creators={ON|OFF}  不阻止任何存储函数,一般关闭,默认OFF

  sql_log_bin = {ON|OFF}           当前会话是否将二进制文件进入进二进制文件

  sql_log_off                  是否将一般查询日志记入查询日志

  sync_binlog 

MariaDB [node5]> select @@sync_binlog;
+---------------+
| @@sync_binlog |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)

       sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

  binlog_format = {|statement|row|mixed}   默认自动mixed

  max_binlog_cache_size =       mysql二进制日志的缓冲区大小,仅用于缓存事务类的语句

  max_binlog_stmt_cache_size     语句缓冲区大小,即事务类和非事务类公用的大小

  max_binlog_size             二进制日志文件的上限,单位为字节,默认为1G


注意:

   切勿将二进制日志与数据文件放在同一设备,能提升IO性能,又能防止因磁盘硬件损坏而造成数据无法恢复

   可以临时通过sql_log_bin来控制二进制日志的写入