bin log
bin log的格式
- statement:记录原生SQL;
- row:记录所属表(Table_map)和操作行为(如删除为Delete_rows,在操作行为中有操作的数据所有信息)。
- mixed:MySQL根据自己的情况来选择用哪个。
在某些情况下,如果用row会记录很多很多的日志,但是对于statement只是一条SQL。但是statement的SQL语句会出现索引选择错误的情况,比如带有索引的limit 1这种,选择哪个索引最终出现的数据完全不一样。
但是row这种方式记录的却是绝对准确的,它是根据这条数据的ID来的。所以,一般都建议使用row这种方式。
格式状态的设置和查看:
查看:SHOW VARIABLES LIKE '%binlog_format%';
设置:set GLOBAL BINLOG_FORMAT ='MIXED';
在客户端需要另开窗口就可以看见了。
bin log的查看
查看bin log里记录的内容
show binlog events in 'binlog.000001';
其中binlog.000001
是bin log的日志文件名。在该命令下会看到bin log的起止位置,如下面的8900,2738,2973都是在bin log中的位置。
在row模式下,上面的语句是看不到row内部执行的。所以需要执行下面的语句:
mysqlbinlog -vv data/master.000001 --start-position=8900;
下面是用bin log来恢复数据:
mysqlbinlog master.000001 --start-position=2738 --stop-position=2973 | mysql -h127.0.0.1 -P13000 -u$user -p$pwd;
双一设置
双一设置有很高的安全保障,但是插入的速度也慢了。
show VARIABLES like 'innodb_flush_log_at_trx_commit';
show VARIABLES like 'sync_binlog';
switch(innodb_flush_log_at_trx_commit){
case 0:
log buffer将每秒一次地写入log file,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
break;
case 1:
每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去;
break;
case 2:
每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
}
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。
网友评论