create table person(
id bigint primary key comment '主键',
name varchar(255) not null '姓名',
)
此时数据库里有三条数据
+--------+-----------+
| id | name |
+--------+-----------+
| 134068 | 略略略 |
| 812022 | 嘤嘤嘤 |
| 819439 | 哈哈哈 |
+--------+-----------+
在我们执行update person set name = 'low-low'语句,在三种模式下binlog记录的所呈现的是不一样的
可以用 mysqlbinlog -v /var/lib/mysql/日志名 进行查看
row:
### UPDATE `tmp`.`person`
### WHERE
### @1=134068
### @2='略略略'
### SET
### @1=134068
### @2='low-low'
### UPDATE `tmp`.`person`
### WHERE
### @1=812022
### @2='嘤嘤嘤'
### SET
### @1=812022
### @2='low-low'
### UPDATE `tmp`.`person`
### WHERE
### @1=819439
### @2='哈哈哈'
### SET
### @1=819439
### @2='low-low'
statement:
update person set name = 'he-he'
mixed
会结合着两种情况,根据情况的不同结合着两种模式
区别:
statement只会记录着一条sql语句
row会记录着所有更改过的行记录的sql
mixed若是简单sql,则会使用statement,若是复杂sql(涉及到多个函数)则会使用row
各自的优缺点:
statement:
优点:
1 不需要记录每一行的变化,减少了binlog日志量,文件较小
缺点:
1 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
使用以下函数的语句无法被复制:LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()
2 使用insert和update可能会产生更多的行级锁
3 对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
4 执行复杂sql事务,会比row消耗更多资源
row:
优点:
1 任何情况都可以被复制,这对复制来说是最 安全可靠 的。(比如:不会出现某些特定情况下
的存储过程、function、trigger的调用和触发无法被正确复制的问题)
2 相比statement,可能会产生更少的行锁
缺点:
1 相比statement,binlog 大了很多
mysql binlog三种模式的区别
于 2023-09-14 13:13:48 首次发布