1、redolog、binlog的简单分析图解:redolog和binlog机制2、开启binlog及关注点3、关注binlog的相关参数4、binlog模式分析5、关于binlog的使用补充:双一模式一、区别redolog和binlog
1、如下表格的一个简单对比
redologbinlog日志作用保护脏数据数据库备份恢复使用引擎支持只适合InnoDB引擎所有引擎日志格式物理日志逻辑日志,SQL语句提交方式快速提交提交时一次性写入保存形式会被循环覆盖长期保存
2、redolog记录的是对于每个页的修改数据页地址、行地址、操作类型(I/D)、数据
e.g:一个update修改100行,至少产生200行redo日志,所以DML产生的redo可能很大:
100、2、D
100、2、I、'value'
……
实际就是update table set ……100(数据页地址) 2(行地址)
3、binlog只是记录DML、DDL、DCL,不记录SELECT
通过参数设置控制binlog的记录模式:
1、语句模式
e.g:delete from t1 where id<=1000;
2、行模式
delete from t1 where id=1;
delete from t1 where id=2;
……
delete from t1 where id=1000;
4、图解redolog、binlog机制
注意:
在oracle里面虽然redolog也是循环覆盖的,但是在循环覆盖之前,数据库会将redo拷贝出来做个归档,所以oracle里可以用redolog做数据恢复。 四、binlog_format有哪些
1、STATEMENT
每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。只需要记录在 master 上所执行的语句的细节,以及执行语句时候的上下文的信息。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数,rand()函数等会出现问题warning)。
2、ROW
不记录sql语句上下文相关信息,仅保存哪条记录被修改,也就是说日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。
优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
缺点:在 row 模式下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。3、MIXED
是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种;新版本的MySQL中对row模式也被做了优化,并不是所有的修改都会以rowl来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。五、binlog的使用
1、二进制日志两个最重要的使用场景
1、MySQL replication在master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的,也就是主从备份。
2、数据恢复,通过使用mysqlbinlog工具来使恢复数据
2、常用binlog日志操作命令
1、查看所有binlog日志列表
mysql> show master logs;
2、查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status; //结合上述binlog文件,进行binlog生成速度监控
3、刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs; //注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
4、重置(清空)所有binlog日志
mysql> reset master;
3、查看binlog日志内容
1、OS层面查看binlog文件
shell> mysqlbinlog -vv mysql-bin.000001
2、数据库层面show binlog events
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
选项解析:
1、in 'log_name':指定要查询的binlog文件名(不指定就是第一个binlog文件)
2、from pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
3、limit [offset,]:偏移量(不指定就是0)
4、row_count:查询总条数(不指定就是所有行)
mysql> show binlog events FROM 9451 limit 1G; *************************** 1. row *************************** Log_name: mysql-bin.000001 Pos: 9451 Event_type: Query Server_id: 1 End_log_pos: 9561 Info: use `db1`; create index i_n_a on t1(name,address) 1 row in set (0.00 sec)
4、从binlog日志恢复语法
1、恢复语法格式:
# mysqlbinlog [选项] mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
2、常用选项:
--start-position=953 起始pos点
--stop-position=1437 结束pos点
--start-datetime="2017-6-8 13:18:54" 起始时间点
--stop-datetime="2017-6-8 13:21:53" 结束时间点
--database=TEST 指定只恢复TEST数据库(一台主机上往往有多个数据库,只限本地log日志)
3、不常用选项:
-u --user=name #Connect to the remote server as username.连接到远程主机的用户名
-p --password[=name] #Password to connect to remote server.连接到远程主机的密码
-h --host=name #Get the binlog from server.从远程主机上获取binlog日志
--read-from-remote-server #Read binary logs from a MySQL server.从某个MySQL服务器上读取binlog日志
使用小结:
实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;所谓恢复,就是让MySQL将保存在binlog日志中指定段落区间的SQL语句逐个重新执行一次而已。关于双一模式: 1、redolog、binlog:双1(绝对安全) 1、innodb_flush_log_at_trx_commit=1 2、sync_binlog=1 2、innodb_support_xa=1:分布式事务,默认开启ON 1、保证binlog里面存在的事务一定在redo log里面存在 2、保证binlog里面事务顺序与redo log事务顺序一致性 3、commit,要么成功要么失败,防止出现主从不一致所以在双一的情况下,也要配合开启innodb_support_xa,更安全。