记录mysql数据库中任何修改或潜在会修改数据的内容,所以,一般来说,SELECT语句是不会被记录的.下面看看mysql 的二进制日志格式,mysql的二进制文件默认在数据目录下,以下是二进制日志文件和二进制日志文件的索引文件

image

所以二进制日志通常也叫复制日志

image

二进制日志的最主要功能是把过去某一段事件所有修改过数据的操作记录下来,这些记录下来的数据如果重新执行一遍,可以得到与此前的数据一样的结果,二进制日志的格式是二进制格式的,所以不能用cat等命令去查看,他有专门的查看工具,mysqlbinlog,下图可以看到,是不能用cat查看的

image

 
  
  1: #140402 19:00:18  事件的开始时间,14年4月2号 19点
  2: # at 107          事件的偏移量
  3: ...
  4: # at 121          这样表示这个事件和上一个事件中有121-107的字符长度

定位某一事件的时候,既可以根据时间(time)进行,也可以根据事件偏移量(position)进行

查看MySQL服务器的状态

image

当多个用户在写数据的时候,不能并行的向二进制日志文件中写入数据,为了避免性能过低,这里使用缓冲机制,由MySQL定期从缓冲器中向二进制日志文件中写入数据,但是如果此时数据写了一半,断电了,那么此时虽然数据库中的数据是完整的,二进制日志确实不完整的,所以性能和安全性只能二选一了.请自行选择平衡点.上面说过,二进制日志是为了复制数据的,如果单个的二进制文件过大,在读入内存时会相当慢,所以二进制日志需要滚动保存,默认二进制日志文件大小到达1G就滚动.当然能也可以根据时间滚动.或者手动滚动,执行命令 FLUSH LOGS,此命令只能滚动二进制日志和中继日志.重启MySQL服务器默认也会滚动日志

查看MySQL从开始到目前的所有能被MySQL管理的二进制日志文件的列表

image

二进制的功用:

即时点恢复:

复制:

删除二进制日志,通常手动删除二进制文件,并不是想象中的使用rm命令,而知在mysql> 命令行下使用 PURGE

 
  
  1: PURGE { BINARY | MASTER } LOGS
  2:     { TO 'log_name' | BEFORE datetime_expr }

因为在数据文件中不仅保存着二进制日志文件,还保存着二进制日志文件的索引文件,如下图所示,所以不能使用rm删除

image

查看SHOW BINLOG EVENTS使用帮助

image

查看二进制文件中的事件信息

image

server-id:记录是哪个服务器产生的信息,End log pos:在哪个位置(position),Event_type:事件类型(读,写,提交等)

server-id:服务器的身份标识,主要作用了为了避免记录本身的二进制日志,在双主模式下的MySQL服务器中,如果没有server-id标识,服务器A获取了服务器B的二进制日志,并记录在自己的二进制日志文件中,同时保存一分在中继日志中,并且通过中继日志,写回数据文件,这时候A的数据发生了改变,B侦测到了,就会获取A的二进制日志,但是看到A的二进制日志文件的server-id就是自己的,那么,B主机就不会获取这份二进制日志了.所以在同一个架构中的复制模型中,每台服务器的server-id都必须不一样

二进制日志记录格式有三种:

语句(statement):

    优点:记录的都是SQL语句,容易看懂,火速距离小,适应性强. 

    缺点:有些语句无法做到精确复制,无法对使用了触发器,存储过程等代码的应用实现精确复制,如果使用的数据库有存储过程或触发器就不要使用语句了

行(row):

   优点:可以完成所有复制,包括触发器,存储过程,可以减少锁的使用,占据更少的CPU,使用性强,

    缺点:无法判断执行了哪些SQL语句,数据量可能略大

混合模式(mixed):语句+行

提醒:如果不知道该如何判断,就使用默认,目前来说,单独使用语句的几乎不存在

查看指定位置之后的事件信息:方法一

          image

方法二:此命令要在日志目录下

 
   
  1: # mysqlbinlog 
  2:     --start-time      开始时间
  3:     --stop-time       结束时间
  4:     --start-position  开始位置
  5:     --stop-position   结束位置

image

 
   
  1: 二进制日志文件内容格式:
  2:     事件发生的日期和时间   #120402
  3:     服务器ID            #server id
  4:     事件的结束位置
  5:     事件的类型
  6:     原服务器生成此事件时的线程ID
  7:     语句的时间戳和写入二进制日志文件的时间差;
  8:     错误代码; 0表示正常执行
  9:     事件内容
 10:     事件位置,相当于下一事件的开始位置
提示:中继日志的格式几乎和二进制格式相同,不过一个的记录日志,一个是写入日志

可以基于以上方法将二进制日志从指定的位置开始导出以做备份,如下图所示:

image


查看跟二进制相关的配置信息

 
  
  1: mysql> SHOW GLOBAL VARIABLES LIKE '%log%';
  2:     log_bin = {ON|OFF}, 还可以是个文件路径
  3:     log_bin_trust_function_creators 用于控制创建存储函数时如果会导致不安全的是否,二进制是否禁止创建存储函数的
  4:     sql_log_bin = {ON|OFF} 可以临时关闭记录二进制日志
  5:     sync_binlog 设定多久同步一次,将缓冲区的二进制日志记录到二进制文件中,0表示不同步,就是不开启此项,仅在事务提交时同步
  6:     binlog_format = {statement|row|mixed} 格式
  7:     max_binlog_cache_size = #
  8:       二进制日志缓冲空间大小,仅用于缓冲事务类的语句;
  9:     max_binlog_stmt_cache_size =    非事务类的和事务类的共用的大小
 10:     max_binlog_size = 
 11:       二进制日志文件上限,一旦超出设定,就会自动滚动

提醒:切勿将二进制日志与数据文件放在同一设备


中继日志:

在主从模式的MySQl模型中,当从服务器从主服务器上的二进制文件读取数据时,读取到本地的日志会保存在本地的日志文件中,而这个日志文件就叫中继日志,所以中继日志只在从服务器上开启

 

中继日志参数

relay_log_purge={ON|OFF}:是否自动清理不再需要中继日志,一般来说是需要自动清理的

relay_log_recovery={ON|OFF}:与中继日志的恢复先关

relay_log_space_limit:空间大小是否有限定,0表示不限制