设为首页 收藏本站
查看: 776|回复: 0

[经验分享] MySQL日志binlog的三种模式

[复制链接]

尚未签到

发表于 2018-9-29 06:16:13 | 显示全部楼层 |阅读模式
1        三种模式的介绍
  二进制日志binlog作用:
  1、以二进制形式记录更改数据库的SQL语句(insert,update,delete,create,drop,alter等)
  2、用于Mysql主从复制
  3、增量数据库备份及恢复
1.1  Row模式
  日志会记录成每一行数据被修改成的形式,然后再slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况。
  优点:在row模式下,bin-log中可以不记录执行的sql语句的上下文相关信息,仅仅需要记录哪一条记录被修改了,修改成什么信样了,所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现在某些特定情况下的存储过程和function,以及trigger的调用和处罚无法被正确复制问题。
  缺点:在row模式下,所有执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。比如有这样一条update语句:updateproduct set name='gongli' 这条语句不是记录的一条,而是修改每一条的都会记录下来
1.2  Statement模式
  每一条会修改数据的sql都会记录到master的binlog中,slave在复制的时候sql进程会解析成和原来master端相同的sql再执行。
  优点:在Statement模式下首先就是解决了row模式下的缺点,不需要记录记录每一行日志的变化,减少了bin-log日志量,节省了I/O以及存储资源,提高性能。因为它们只需要激励在master上所执行的语句的细节以及执行语句时候的上下文信息。
  缺点:在Statement模式下,由于它记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候的结果。另外,由于MySQL现在发展较快,很多的新功能不断的加入,使MySQL的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在Statement中,目前已经发现不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现。比如:sleep()函数在有些版本中就不能直接复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于rowlevel是基于每一行来记录的变化,所以不会出现类似的问题
1.3  Mixed模式
  从官方文档中看到,之前的MySQL一直都只有基于Statement的复制模式,知道5.1.5版本的MySQL才开始支持row模式。从5.0开始,MySQL的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给MySQL replication又带来了更大的挑战。另外,看到官方文档说,从5.1.8版本开始,MySQL提供了除Statement和row之外的第三种模式:mixed,实际上就是前两种模式的结合。在mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和row之间选择一种。新版本中的Statement还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row模式也做了优化,并不是所有的修改都会以row模式来记录,比如遇到表结构变更的时候就会以Statement模式来记录,如果sql语句确实是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
2        小结
  Statement:
  优点:记录的简单,内容少
  缺点:导致主从不一致
  例:
  100w条记录
  updatetest set name='tintin';
  binilog 里面就只用update test set name='tintin';
  ROW 行级模式
  优点:记录数据详细(每行),主从一直
  缺点:占用大量的磁盘空间,降低了磁盘的性能
  100w条记录
  updatetest set name='tintin';
  binilog 里面就用100w条update test set name='tintin';语句
  MIXED混合模式
  100w条记录
  updatetest set name='tintin';
  binilog 里面就只用update test set name='tintin';
  对于函数,触发器,存储过程
  会自动的使用row-level模式
1        实战操作
1.1  要想mysql能用三种模式,必须开启binlog功能
  [root@db01 ~]# mysql -uroot -p789 -S/data/3306/mysql.sock -e "show variables like '%log_bin%';"
  +---------------------------------+-------+
  | Variable_name                   | Value |
  +---------------------------------+-------+
  | log_bin                        | ON    |
  | log_bin_trust_function_creators | OFF   |
  | sql_log_bin                     | ON    |
  +---------------------------------+-------+
  配置文件里面配置
  [root@db01 ~]# egrep "log-bin"/data/3306/my.cnf
  log-bin = /data/3306/mysql-bin
1.2  查看当前的binlog日志模式
  [root@db01 ~]# mysql -uroot -p789 -S/data/3306/mysql.sock -e "show variables like '%binlog_format%';"
  +---------------+-----------+
  | Variable_name | Value     |
  +---------------+-----------+
  | binlog_format | STATEMENT|
  +---------------+-----------+
1.3  演示操作
1.3.1         查看当前的binlog文件
  [root@db01 3306]# ls
  data   mysql-bin.000001 mysql-bin.000004  mysqld.pid
  my.cnf mysql-bin.000002 mysql-bin.000005 mysql_oldboy3306.err
  mysql  mysql-bin.000003 mysql-bin.index   mysql.sock
  [root@db01 3306]# mysqlbinlog mysql-bin.000005
1.3.2         使用mysqlbinlog来查看二进制的binglog文件
DSC0000.jpg

1.3.3         模仿操作
  update一条数据
  mysql> select * from test2;
  +----+--------+

  |>  +----+--------+
  |  1 | oldboy|
  |  2 | gongli|
  |  3 |inca   |
  |  4 |sb     |
  |  5 |kaka   |
  |  6 |doubi  |
  +----+--------+
  6 rows in set (0.00 sec)

  mysql> update test2 set name="laowang"where>  Query OK, 1 row affected (0.01 sec)
  Rows matched: 1 Changed: 1  Warnings: 0
  mysql> select * from test2;
  +----+---------+

  |>  +----+---------+
  |  1 |oldboy  |
  |  2 |gongli  |
  |  3 |inca    |
  |  4 |sb      |
  |  5 |laowang |
  |  6 |doubi   |
  +----+---------+
  6 rows in set (0.00 sec)
  查看binlog日志记录
  [root@db01 3306]# mysqlbinlog mysql-bin.000005
  # at 7610

  #160828 22:39:12 server>  SET TIMESTAMP=1472395152/*!*/;
  update test2 set name="laowang" whereid=5
  /*!*/;
  # at 7717

  #160828 22:39:12 server>  COMMIT/*!*/;
  DELIMITER ;
  # End of log file
  ROLLBACK /* added by mysqlbinlog */;
  /*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
1.4  row模式演示
1.4.1         修改binlog为row模式
  mysql> show variables like 'binlog_format';
  +---------------+-----------+
  | Variable_name | Value     |
  +---------------+-----------+
  | binlog_format | STATEMENT |
  +---------------+-----------+
  1 row in set (0.02 sec)
  mysql> set global binlog_format = 'ROW';
  Query OK, 0 rows affected (0.00 sec)
  mysql> show variables like 'binlog_format';
  +---------------+-----------+
  | Variable_name | Value     |
  +---------------+-----------+
  | binlog_format | STATEMENT |
  +---------------+-----------+
  1 row in set (0.00 sec)
  mysql> show global variables like'binlog_format';
  +---------------+-------+
  | Variable_name | Value |
  +---------------+-------+
  | binlog_format | ROW   |
  +---------------+-------+
  1 row in set (0.00 sec)
  临时修改:
  mysql> set global binlog_format ='ROW';
  永久修改:
  修改my.cnf配置文件
1.4.2         对表进行操作
  update表test2
  mysql> select * from test2;
  +----+---------+

  |>  +----+---------+
  |  1 |oldboy  |
  |  2 |gongli  |
  |  3 |inca    |
  |  4 |sb      |
  |  5 |laowang |
  |  6 |doubi   |
  +----+---------+
  6 rows in set (0.00 sec)
  mysql> update test2 setname='dadou';
  Query OK, 6 rows affected (0.00 sec)
  Rows matched: 6 Changed: 6  Warnings: 0
  mysql> select * from test2;
  +----+-------+

  |>  +----+-------+
  |  1 | dadou|
  |  2 | dadou|
  |  3 | dadou|
  |  4 | dadou
1.4.3         查看binlog日志文件
  [root@db01 3306]# ls
  data   mysql            mysql-bin.000005 mysql-bin.000007  mysql-bin.index  mysql_oldboy3306.err
  my.cnf mysql-bin.000004 mysql-bin.000006 mysql-bin.000008  mysqld.pid       mysql.sock
  [root@db01 3306]# mysqlbinlog mysql-bin.000008
  BINLOG '
  GP3CVxMBAAAAMQAAAJ0CAAAAACMAAAAAAAEABm9sZGJveQAFdGVzdDIAAgP+Av48AA==
  GP3CVxgBAAAAogAAAD8DAAAAACMAAAAAAAEAAv///AEAAAAGb2xkYm95/AEAAAAFZGFkb3X8AgAA
  AAZnb25nbGn8AgAAAAVkYWRvdfwDAAAABGluY2H8AwAAAAVkYWRvdfwEAAAAAnNi/AQAAAAFZGFk
  b3X8BQAAAAdsYW93YW5n/AUAAAAFZGFkb3X8BgAAAAVkb3ViafwGAAAABWRhZG91  这里我们会看到这些编码
  '/*!*/;
  # at 831

  #160828 23:02:48 server>  COMMIT/*!*/;
  DELIMITER ;
  # End of log file
  ROLLBACK /* added by mysqlbinlog */;
  /*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
  查看row模式下的编码
  mysqlbinlog --base64-output="decode-rows"--verbose  mysql-bin.000008
  再次查看
DSC0001.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-603435-1-1.html 上篇帖子: mysql非安装版的配置与使用 下篇帖子: php+mysql分页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表