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及干系关注点
1、开启binlog
修正配置文件/etc/my.cnf,在[mysqld]下添加:
重启MySQL,即可……binlog的启动大概会为mysql增加1%的负载,因此在绝大多数情形下,binlog都不会成为mysql的性能瓶颈,以是一样平常都是会开启binlog的。
2、binlog的存放
3、如何手工切换binlog
1、重启数据库,每次重启都会新切binlog
2、mysql> flush logs;
4、查看binlog日志文件
三、关注binlog干系参数
mysql> show variables like '%bin%';
1、binlog_cache_size
//设置binlog cache(默认32K),每个线程单独分配内存空间
所有未提交的二进制日志文件会被记录到用户事情空间的binlog cache中,等该事务提交时直接将缓冲区中的binlog写入二进制日志文件里
判断binlog_cache_size是否设置过小的依据,如果Binlog_cache_disk_use>0(次数),解释事务未提交,binlog在用户事情空间存放不下,须要借用tmp目录。
2、log_bin
//设置名字前缀
--log-bin [=file_name]:设置此参数表示启用binlog功能,并指定路径名称,生产中都要开启binlog。
sql_log_bin:会话级别的binlog开关掌握,默认是开启的,可以在当前会话级别动态修正临时关闭binlog(主从延迟优化),set session sql_log_bin=0;
3、sync_binlog
//同步binlog的办法
0:默认,提交同步到文件系统缓存
1:commit,通过fsync办法,直接写入disk的binlog文件中(最安全),与redo的双一模式。
>1:sync_binlog=N,如果N>1,在意外发生的时候,就表示会有N-1个dml没有被写入binlog中,有可能就会发生主从数据不一致的情形。
4、max_binlog_size
//binlog文件大小,默认1G
如果是row模式,须要增加binlog文件的大小,由于行模式产生的日志量相对较大。如果超过了该值,就会产生新的日志文件,后缀名+1,并且记录到.index文件里面。
5、binlog_format
//row、statement、mixed,设置binlog记录的模式:行模式、语句模式、mixed模式。动态参数,可以会话级别修正
6、--binlog-do-db、--binlog-ingore-db
//command-line format,表示须要写入或者忽略写入哪些库的日志,默认为空,表示可以将所有库的日志写入到二进制文件里面。
7、log-slave-updates
//启用从机做事器上的slave日志功能,使这台打算机可以用来构成一个镜像链(A->B->C) ,可以让从库上面产生二进制日志文件,在从库上再挂载一个从库。
8、binlog_rows_query_log_events
//便于定位实行过的SQL语句
9、expire_logs_days
//binlog过期清理韶光,默认是0:不自动打消
binlog的删除策略,假设expire_logs_days=5,表示系统保留5天binlog,第六天到来时会删除第一天的binlog。
1、删除策略的风险:
1、删除会导致过高的io,从而导致业务涌现性能抖动
2、主从延迟
2、办理:手工主动删除binlog
PURGE BINARY LOGS #同时删除binlog文件和binlog索引文件记录,如此说来用rm删除binlog和vim修正对应binlog索引文件记录,效果同purge。
四、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:查询总条数(不指定便是所有行)
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,更安全。