mysql-binlog
简介:
- mysql的二进制日志记录了所有DDL和DML(除select)
- 开启binlog日志后会有1%左右的的性能损耗
- 二进制日志包括两类
- 索引文件 XXXX.index
- 日志文件 xxx.0000*
应用场景:
- master(主) 和 slavas(从) 主从保持数据同步
- 使用mysqlbinlog工具来恢复数据
日志更换策略:
- 服务器重启
- 服务器被更新
- 日志达到最长长度 max_binlog_size 默认为 1G
- 日志被刷新 mysql> flush logs
日志格式:
- statement level (基于SQL语句的复制)
- 每一条会修改数据的SQL都会记录到binlog中
- 优点: 不需要记录SQL与每一行的数据变化,这样binlog日志比较少,减少磁盘IO,提高性能
- 缺点: 某些情况会导致主从不一致
- row level (基于行的复制)
- 不记录SQL语句上下文,仅记录那些行那些数据被修改了,修改成什么样子了
- 优点: 不会出现出现某些情况下的存储过程,function,trigger 无法被正确复制的情况
- 缺点: 会产生大量的日志数据,比如 alter table 会让日志暴涨
- mixed (混合模式复制)
- 以上两种模式的混合使用,一般的复制使用statement模式,对于statement无法复制的操作使用row模式保存,mysql会自动根据SQL语句来现在日志的保存方式
- 从官网来看
- version < 5.1.5 之前只有statement
- version < 5.1.8 且 > 5.1.5 有 row 和 statement 两种
- version > 5.1.8 mixed 、 row 、 statement
配置:
[mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义,不要和 其他 slaveId 重复 expire_log_days = 7 # 设置binlog清理时间 max_binlog_size = 100m # 设置binlog每个文件大小 binlog_cache_size = 4m # binlog缓存大小 max_binlog_cache_size = 512m # 最大binlog缓存大小
相关命令:
show variables like "%log_bin%";
Variable_name | Value |
---|---|
log_bin | ON |
log_bin_basename | /var/lib/mysql/mysql-bin |
log_bin_index | /var/lib/mysql/mysql-bin.index |
log_bin_trust_function_creators | OFF |
log_bin_use_v1_row_events | OFF |
sql_log_bin | ON |
log_bin -> ON 表示binlog 日志已经开启
1 show binlog events; # 只查看第一个binlog文件的内容 2 show binlog events in 'mysql-bin.000004'; # 查看指定binlog文件的内容 3 show binary logs; # 获取binlog文件列表
Log_name | File_size |
---|---|
mysql-bin.000001 | 3159 |
mysql-bin.000002 | 154 |
mysql-bin.000003 | 177 |
mysql-bin.000004 | 1609 |
mysql-bin.000005 | 201 |
mysql-bin.000006 | 154 |
1 show master status; # 查看当前正在写入的binlog文件
File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
---|---|---|---|---|
mysql-bin.000006 | 154 |
使用mysqlbinlog工具 mysqlbinlog是一个查看mysql二进制的工具,可以把mysql上面的所有操作记录从日志导出
1 mysqlbinlog /var/lib/mysql/mysql-bin.000004 -r /tmp/outMysql.sql
1 reset master; # 清除master上的binlog
1 reset slave; # 清除slave上的binlog