Mysql binlog 日志

1.介绍

mysql binglog 日志记录了mysql 所有操作技能,不包含select,在一些mysql 同步上经常使用binlog同步,这里介绍下binlog日志记录。


2.开启binlog

2.1 查看是否开启

show VARIABLES like '%log_bin%';

log_bin:on 开启。

2.2 开启方法

2.2.1 关闭数据库

[root@master mysql]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]

2.2.2 配置my.conf 
在my.conf 文件的[mysqld]域下面添加下面:
log-bin=mysql-bin
binlog_format= ROW    

说明:
STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

2.2.3 开启数据库

[root@master mysql]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]


2.3验证
show VARIABLES like '%log_bin%';

3.binlog 常用操作

show master logs;  #查看数据库所有日志文件。  
show master status; #查看最新的日志
show binlog events \G;  #查看binlog文件信息(默认000001开始,\G 命令行用法)。  
show binlog events in 'mysql-bin.000016';  #查看指定的binlog文件信息。  
flush logs;  #将内存中log日志写磁盘,保存在当前binlog文件中,并产生一个新的binlog日志文件。  
reset master;  #删除所有二进制日志,并重新(mysql-bin.000001)开始记录。


show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)
指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G
注意:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;


查看binlog位置:
[root@master ~]# ps -ef |grep mysql
root       3707      1  0 10:43 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql      3947   3707  0 10:43 ?        00:00:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root       4087   3286  0 10:55 pts/2    00:00:00 mysql -uroot -px xxxx
root       4176   4106  0 10:58 pts/3    00:00:00 grep --color=auto mysql

[root@master mysql]# mysqlbinlog --base64-output=decode-rows -v  mysql-bin.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#171108 11:30:36 server id 1  end_log_pos 120 CRC32 0xcd676b23  Start: binlog v 4, server v 5.6.37-log created 171108 11:30:36
# at 120
#171108 11:33:24 server id 1  end_log_pos 192 CRC32 0x66bc8be7  Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1510112004/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 192
#171108 11:33:24 server id 1  end_log_pos 247 CRC32 0xeda09f19  Table_map: `test`.`test` mapped to number 70
# at 247
#171108 11:33:24 server id 1  end_log_pos 302 CRC32 0x3725bf1b  Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `test`.`test`
### SET
###   @1=10
###   @2='1010'
###   @3='hxw10'
###   @4=1510112004
# at 302
#171108 11:33:24 server id 1  end_log_pos 333 CRC32 0xb61e6042  Xid = 263
COMMIT/*!*/;
# at 333
#171108 11:34:29 server id 1  end_log_pos 356 CRC32 0x92e6d836  Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

执行sql部分的sql显示为base64编码格式

固生成sql记录的时候 不能用常规的办法去生成 需要加上相应的参数才能显示出sql语句

--base64-output=decode-rows -v



基于时间,事务恢复的参考:http://www.cnblogs.com/kevingrace/p/5907254.html

猜你喜欢

转载自blog.csdn.net/jjshouji/article/details/78475865