1、binlog相关操作
查询操作:
mysql> show master status; //查看当前正在写入的binlog文件
mysql> show binlog events in ‘mysql-bin.000002’; //查看指定binlog文件的内容
mysql> show binary logs; //获取binlog文件列表
mysql> show master logs; //查看master的binlog日志
删除操作:
自动删除binlog
通过binlog参数(expire_logs_days )来实现mysql自动删除binlog
mysql> show binary logs;
mysql> show variables like ‘expire_logs_days’;
mysql> set global expire_logs_days=3;
手工删除binlog
mysql> reset master; //删除master的binlog
mysql> reset slave; //删除slave的中继日志
mysql> purge master logs before ‘2012-03-30 17:20:00’; //删除指定日期以前的日志索引中binlog日志文件
mysql> purge master logs to ‘binlog.000002’; //删除指定日志文件的日志索引中binlog日志文件
或者直接用操作系统命令直接删除
2、TABLE_MAP_EVENT
当用户提交一条修改语句时(如, insert, update, delete),MySQL会产生2个Binlog事件: 第一个就是TABLE_MAP_EVENT,用于描述改变对应表的结构(表名, 列的数据类型等信息);紧接着的是ROWS_EVENT,用于描述对应表的行的变化值
table_map_log_event的格式如下图所示:
2.1. table id
用于唯一标识一个表的结构,table id是MySQL自动递增分配的。需要注意的是,table id唯一标识的是一个表结构,而不是实际的数据库表。如,一个普通表tpcc.my_test1, 如果在MySQL实例运行期间,没有发生结构变化(DML),那么它的table id就不会变化;但结构发生变化后,会生成新的TABLE_MAP_EVENT,并且使用新的table id标识。在ROW格式的二进制中,事件信息中没有列的信息,需要通过Table_Map将表名对应的表信息加载到cache中,然后根据事件信息中的列下标来定位到数据列。
在基于行的复制模式下,为什么BINLOG中使用TABLE_ID而不直接使用表名:
1、如果某事务中一条SQL语句修改了100万行记录,那么会在该事务对应的BINLOG中记录这100万记录相应的信息,通过TABLE_ID方式来映射表名,那么仅需要存储一次表名即可,后面的使用TABLE_ID代替,可以有效降低BINLOG长度。
导致TABLE_ID发生变化的操作有:
1>DDL语句执行 (创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等)
2>Flush Tables语句执行
3>Table被加载到Table Cahche