MySQL日志binlog的三种模式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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都会记录到masterbinlog中,slave在复制的时候sql进程会解析成和原来master端相同的sql再执行。

优点:在Statement模式下首先就是解决了row模式下的缺点,不需要记录记录每一行日志的变化,减少了bin-log日志量,节省了I/O以及存储资源,提高性能。因为它们只需要激励在master上所执行的语句的细节以及执行语句时候的上下文信息。

缺点:在Statement模式下,由于它记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候的结果。另外,由于MySQL现在发展较快,很多的新功能不断的加入,使MySQL的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在Statement中,目前已经发现不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现。比如:sleep()函数在有些版本中就不能直接复制,在存储过程中使用了last_insert_id()函数,可能会使slavemaster上得到不一致的id等等。由于rowlevel是基于每一行来记录的变化,所以不会出现类似的问题

1.3  Mixed模式

从官方文档中看到,之前的MySQL一直都只有基于Statement的复制模式,知道5.1.5版本的MySQL才开始支持row模式。从5.0开始,MySQL的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给MySQL replication又带来了更大的挑战。另外,看到官方文档说,从5.1.8版本开始,MySQL提供了除Statementrow之外的第三种模式:mixed,实际上就是前两种模式的结合。在mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statementrow之间选择一种。新版本中的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 里面就用100wupdate 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文件

wKioL1fEFEWj2_7PAABgkFuSPsw227.jpg-wh_50

1.3.3         模仿操作

update一条数据

mysql> select * from test2;                      

+----+--------+

| id | name  |

+----+--------+

|  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 id=5;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1  Warnings: 0

 

mysql> select * from test2;                       

+----+---------+

| id | name   |

+----+---------+

|  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 id 1  end_log_pos 7717  Query  thread_id=32    exec_time=0        error_code=0

SET TIMESTAMP=1472395152/*!*/;

update test2 set name="laowang" whereid=5

/*!*/;

# at 7717

#160828 22:39:12 server id 1  end_log_pos 7744  Xid = 299

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         修改binlogrow模式

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         对表进行操作

updatetest2

mysql> select * from test2;

+----+---------+

| id | name   |

+----+---------+

|  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;         

+----+-------+

| id | name |

+----+-------+

|  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 id 1  end_log_pos 858   Xid = 12

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

再次查看


wKiom1fEFHTwqZzYAAB4WTyumqM113.jpg-wh_50



本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/1843651,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
9天前
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
47 10
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
28 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
33 2
|
22天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
363 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
16天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
336 3
|
26天前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1712 14