`
grzrt
  • 浏览: 188731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

binlog-format

 
阅读更多

面的这些是在网上找的!没有写明出处!如果有问题,联系我,我删掉!


MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制。简言之,这种新技术就是关注表中发生变化的记录,而非以前
的照抄 binlog 模式。从 MySQL 5.1.12 开始,可以用以下三种模式来实现:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默认的。

在运行时可以动态低改变binlog的格式,除了以下几种情况:
存储过程或者触发器中间
启用了NDB
当前会话试用 RBR 模式,并且已打开了临时表
如果binlog采用了 MIXED 模式,那么在以下几种情况下会自动将binlog的模式由 SBR 模式改成 RBR 模式。
当DML语句更新一个NDB表时
当函数中包含 UUID() 时
2个及以上包含 AUTO_INCREMENT 字段的表被更新时
行任何 INSERT DELAYED 语句时
用 UDF 时
视图中必须要求使用 RBR 时,例如创建视图是使用了 UUID() 函数

设定主从复制模式的方法非常简单,只要在以前设定复制配置的基础上,再加一个参数:

binlog_format="STATEMENT"
#binlog_format="ROW"
#binlog_format="MIXED"

当然了,也可以在运行时动态修改binlog的格式。例如

mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';

mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

现在来比较以下 SBR 和 RBR 2中模式各自的优缺点:
SBR 的优点:
历史悠久,技术成熟
binlog文件较小
binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
binlog可以用于实时的还原,而不仅仅用于复制
主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR 的缺点:
不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候。
调用具有不确定因素的 UDF 时复制也可能出问题
使用以下函数的语句也无法被复制:
* LOAD_FILE()
* UUID()
* USER()
* FOUND_ROWS()
* SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)
INSERT ... SELECT 会产生比 RBR 更多的行级锁
复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
存储函数(不是存储过程)在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
确定了的 UDF 也需要在从服务器上执行
数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
执行复杂语句如果出错的话,会消耗更多资源

RBR 的优点:
任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:
* INSERT ... SELECT
* 包含 AUTO_INCREMENT 字段的 INSERT
* 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
执行 INSERT,UPDATE,DELETE 语句时锁更少
从服务器上采用多线程来执行复制成为可能

RBR 的缺点:
binlog 大了很多
复杂的回滚时 binlog 中会包含大量的数据
主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
UDF 产生的大 BLOB 值会导致复制变慢
无法从 binlog 中看到都复制了写什么语句
当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生

另外,针对系统库 mysql 里面的表发生变化时的处理规则如下:
如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录
如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何都采用 SBR 模式记录
注:采用 RBR 模式后,能解决很多原先出现的主键重复问题。

分享到:
评论

相关推荐

    php-binlog-parser:用纯PHP实现MySQL Binlog解析器

    例如,Format_description_event用于描述后续事件的格式,Query_event包含执行的SQL语句,而Row_event类事件则包含实际的数据变更信息。php-binlog-parser通过定义一系列的类来对应这些事件,每个类都有自己的解析...

    mysql-binlog-emitter:Node.js mysqlmariadb从属复制事件发射器

    mysql-binlog-emitter 一个nodejs mysql / mariadb从属复制事件发射器。 这是mysql的二进制日志协议的高级实现,如果您仅对数据库中发生的更改感...bin_index = /var/log/mysql/mysql-bin.indexbinlog-format = row #

    springbootj集成canal+mysql+rabbitmq

    binlog-format=ROW server_id=1 配置好后重启mysql。 3.3 rabbitmq配置 在virtualHost:/ 下新增Exchanges: canal.exchange 新增队列:test.queue, 绑定canal.queue, RoutingKey:canal.routing.key canal...

    mysql binlog日志恢复【亲测有效,有例子实测】

    MySQL的二进制日志(binlog)是数据库...在实际操作中,应根据具体业务需求调整binlog的相关配置,例如binlog_format、expire_logs_days和max_binlog_size等。同时,定期备份binlog文件也是防止数据丢失的重要手段。

    go-canal:简单配置,可将数据库变更记录记录递递到系统中

    对于自建MySQL,需要先开启Binlog写入功能,配置binlog-format为ROW模式,my.cnf中配置如下 [mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction ...

    Linux下Canal安装和使用.doc

    对于自建 MySQL,需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式。在 my.cnf 中配置如下: [mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL ...

    py-mysql-es:mysql binlog到es

    py-mysql-es mysql binlog同步到elasticsearch 安装 pip install yaml ...binlog-format = row MySQL用户权限 CREATE USER es IDENTIFIED BY 'es'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT

    深入浅出Mysql优化性能提升.txt

    01-MySQL优化大的思路.wmv ...26-Binlog-Format的区别.wmv 27-主主复制.wmv 28-主主复制时的主键冲突解决.wmv 29-被动主主复制.wmv 30-MySQL Proxy完成负载均衡与读写分离.wmv 31-Partition分区.wmv 32-事务讲解.wmv

    10-MySQL5.7主从复制1

    - `binlog-format`:可设置为 `ROW`, `STATEMENT`, 或 `MIXED`,影响复制时的日志格式。默认是 `STATEMENT`,建议使用 `ROW`,因为它是最精确的复制方式。 - `replicate-do-db` 和 `replicate-ignore-db`:在从DB上...

    MySQL 主从配置(linux),mysql-proxy

    这里,`server-id`是一个唯一的标识符,`log-bin`指定二进制日志的存储位置,`binlog-format`决定了复制的模式,ROW模式可以精确地复制每一行的变化。 接下来,我们需要创建一个用于复制的账号并授权。在主服务器上...

    mysql中binlog_format模式与配置详细分析

    `binlog_format` 参数定义了binlog的记录方式,有三种模式:STATEMENT、ROW和MIXED。 1. **STATEMENT模式(SBR)** - 在这种模式下,binlog记录的是修改数据的SQL语句。因为不需要记录每一行的变更,所以日志文件...

    MySQL-主从配置篇

    其中,`log-bin`指定二进制日志文件名前缀,`binlog-format`设置日志格式,`server-id`为主服务器的唯一ID。 2. 重启MySQL服务使配置生效。 三、从服务器配置 1. 设置从服务器ID: ``` server-id=2 ``` 2. ...

    mysql5.5的全量和增量备份及误删除库后的全量和增量恢复(分库)

    binlog-format=mixed 然后,可以使用以下命令来将 binlog 日志转换为 SQL 语句: mysqlbinlog --start-datetime="2022-01-01 00:00:00" --stop-datetime="2022-01-01 10:00:00" /路径/…/binlog.000001 > /路径/…...

    MySQL高可用负载均衡集群部署

    binlog-format=mixed auto-increment-increment=2 auto-increment-offset=1 replicate-do-db=scm_base 在 scm-node2 主机上修改 mysql 配置文件: sudo vi /etc/my.cnf 在 /etc/my.cnf 中的 [mysqld] 后添加内容...

    mysql主从数据搭建问题处理

    例如,为主服务器设置`server-id`,并在`binlog-format`中选择适当的日志格式(如ROW、STATEMENT或MIXED),同时开启二进制日志`log-bin`。 2. **复制方式**:MySQL支持基于语句的复制(Statement-based ...

    MySQL数据库:数据库高可用与容灾方案

    binlog-format=ROW binlog-gtid-enabled=ON ``` 总结来说,通过深入理解高可用性的概念与重要性,结合MySQL高可用性架构设计的原则以及主从复制的具体实践,我们可以有效地提升MySQL数据库系统的稳定性和可靠性...

    Mysql数据库监听binlog的开启步骤

    `binlog-format`选择ROW模式,这样能记录每个表行的精确变化。 2. **重启MySQL服务**:保存配置文件后,重启MySQL服务以使新配置生效。在Ubuntu上,你可以运行: ``` sudo service mysql restart ``` 在macOS上...

    mysql-redis-sync-utility:MySQL 到 Redis 缓存同步实用程序

    安装 $ sudo apt-get install python-setuptools $ sudo easy_install pip ...binlog-format = row #例子 mysql > create database contact ; mysql > use contact ; mysql > create table contacti

    CAN_and_General_BLF_Format

    The document specifies the format of CAN events and general objects in the CANoe/CANalyzer BLF logging. The described structures can be used to read and write BLF logging files using the binlog.dll, ...

Global site tag (gtag.js) - Google Analytics