mysql---二进制日志
记录了所有对MySQL数据库的修改事件,包括增删改查事件和对表结构的修改事件
二进制日志的开启
#是否启用了日志
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
[mysqld]
log-bin [=DIR [filename]]
log_bin=mysql-bin 名字可以随便起(mysql-bin)
格式
binlog_format={STATEMENT|ROW|MIXED}
- 语句(statement):默认的记录格式,基于段
- 行(row):定义的并非数据本身而是这一行的数据是什么
- 混合模式(mixed):交替使用行和语句、由mysql服务器自行判断
基于段的日志格式
优点
- 日志记录量相对较小,节约磁盘及网络IO
- 只对一条记录修改或者插入,row格式所产生的日志量小于段产生的日志量
缺点
- 必须要记录上下文信息,保证语句在从服务器上执行结果与主服务器相同
- 特定函数如UUID(),user()这样非确定性函数还是无法复制;可能造成MySQL复制的主备服务器数据不一致
操作
mysql> show variables like 'binlog_format';
mysql> set session binlog_format=statement;
mysql> show binary logs;
mysql> flush logs;
行日志格式
- 5.7版本的默认格式
- Row格式可以避免Mysql复制中出现的主从不一致问题
同一SQL语句修改了10000条数据的情况下
- 基于段的日志格式只会记录这个SQL语句
- 基于行的日志会有10000条记录分别记录每一行的数据修改
优点
- 使MySQL主从复制更加安全
- 对每一行数据的修改比基于段的复制高效
误操作而修改了数据库中的数据,同时又没有备份可以恢复时,我们就可以通过分析二进制日志,对日志中记录的数据修改操作做反向处理的方式来达到恢复数据的目的
缺点
- 记录日志量较大;binlog_row_image=[FULL|MINIMAL|NOBLOB]
混合日志格式
binlog_format=MIXED
特点
- 根据SQL语句由系统决定基于段和基于行的日志格式中进行选择
- 数据量的大小由所执行的SQL语句决定
二进制日志格式对复制的影响
基于SQL语句(statement)复制(SBR)
优点
- 生成的日志量少,节约网络传输IO
- 并不强制要求主从数据库的表定义完全相同
- 相比于基于行的复制方式更为灵活
缺点
- 对于非确定性事件,无法保证主从复制数据的一致性
- 对于存储过程,触发器,自定义函数进行的修改也可能造成数据不一致
- 相比于基于行的复制方式在从上执行时需要更多的行锁
基于行的复制(PBR)
优点
- 可以应用于任何SQL的复制包括非确定函数,存储过程等
- 可以减少数据库锁的使用
- 对主从数据的一致性更加有保证
缺点
- 要求主从数据库的表结构相同,否则可能会中断复制
- 无法在从上单独执行触发器
查看二进制日志
数据库会话查看
#显示当前服务器使用的二进制文件及大小
mysql> show binary logs
#显示主服务器使用的二进制文件及大小
mysql> show master logs;
#当前使用的二进制文件及所处位置
mysql> show master status
#lush logs一般只会滚动中继日志和二进制日志
mysql> flush logs;
#二进制日志的记录位置,通常为上一个事件执行结束时间的位置
mysql> showmaster status;
#...数据库的增删改查
#观察二进制位置的变化
mysql> show master status;
#查看所有的二进制信息
mysql> show binlog eventsG;
#查看指定日志的二进制信息
mysql> show binlog events in 'mysql-bin.000011';
#从指定的事件位置开始
mysql> show binlog events in 'mysql-bin.000011' from 190;
#指定偏移量(不是语句,是事件)
mysql> showbinlog events in 'mysql-bin.000011' from 190 limit 3;
命令行mysqlbinlog
#必须在数据目录下
mysqlbinlog mysql-bin.000017
#导出此数据库的信息
mysqlbinlog mysql-bin.000017 > /tmp/a.sql
#导入此数据库的信息
mysql < a.sql
mysqlbinlog -vv 日志名
二进制日志删除
长时间不清理会浪费很多的磁盘空间,但是删除后可能导致数据库崩溃无法进行恢复.
若要删除二进制日志首先将其和数据库备份一份
#删除所有的二进制日志(不可效仿)
mysql> reset master;
#根据文件或时间点来删除二进制日志
# TO 'log_name' 删除文件之前的所有文件
mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr }
#使用时间来删除二进制日志
mysql> PURGEBINARY LOGS BEFORE '13-10-19 10:26:36';