共计 3070 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章给大家分享的是有关 mysql 中如何设置 binlog_format=MIXED 的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
binlog_format 有三种格式,STATEMENT、ROW 和 MIXED。statement 在二进制日志里,记录的是实际的 SQL 语句,ROW 在二进制日志记录的是实际行的变更。
在二进制日志里,MIXED 默认还是采用 STATEMENT 格式记录的,但在下面这 6 种情况下会转化为 ROW 格式:
第一种情况:DNB 引擎,表的 DML 操作会以 ROW 格式记录。
第二种情况:SQL 语句里包含了 UUID()函数。
第三种情况:自增长字段被更新了。
第四种情况:包含了 INSERT DELAYED 语句。
第五种情况:使用了用户定义函数 (UDF)。
第六种情况:使用了临时表。
下边看一个案例,主从都是 MySQL5.6,binlog_format 被设置为 MIXED 格式,看看会有什么样的问题。
主库:
点击 (此处) 折叠或打开
mysql select * from test01;
+——+——–+
| id | name |
+——+——–+
| 1 | steven |
| 2 | steven |
| 3 | steven |
| 4 | steven |
| 5 | steven |
| 6 | steven |
+——+——–+
从库:
点击 (此处) 折叠或打开
mysql select * from test01;
+——+——–+
| id | name |
+——+——–+
| 1 | steven |
| 2 | steven |
| 3 | steven |
| 4 | steven |
| 5 | steven |
+——+——–+
在 master 上执行如下 SQL:
点击 (此处) 折叠或打开
mysql update test01 set name= StevenBJ where id=6;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql select * from test01;
+——+———-+
| id | name |
+——+———-+
| 1 | steven |
| 2 | steven |
| 3 | steven |
| 4 | steven |
| 5 | steven |
| 6 | StevenBJ |
+——+———-+
查看二进制日志没有报错,原因是采用的是 mixed 模式,但是默认采用的 statement 格式记录。
修改 binlog_format=row 之后,在 master 执行刚才的语句,然后在 master 查看二进制日志:
[root@mysql data]# mysqlbinlog –no-defaults mysql-bin.000004
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170808 11:32:02 server id 1 end_log_pos 120 CRC32 0x078ce9f0 Start: binlog v 4, server v 5.6.36-log created 170808 11:32:02 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG
sjCJWQ8BAAAAdAAAAHgAAAABAAQANS42LjM2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACyMIlZEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAfDp
jAc=
/*!*/;
# at 120
#170808 11:45:20 server id 1 end_log_pos 192 CRC32 0x736e3ccf Query thread_id=2 exec_time=1 error_code=0
SET TIMESTAMP=1502163920/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 192
#170808 11:45:20 server id 1 end_log_pos 244 CRC32 0xda92178e Table_map: `test`.`test01` mapped to number 81
# at 244
#170808 11:45:20 server id 1 end_log_pos 310 CRC32 0x65485ceb Update_rows: table id 81 flags: STMT_END_F
BINLOG
0DOJWRMBAAAANAAAAPQAAAAAAFEAAAAAAAEABHRlc3QABnRlc3QwMQACAw8CHgADjheS2g==
0DOJWR8BAAAAQgAAADYBAAAAAFEAAAAAAAEAAgAC///8BgAAAAhTdGV2ZW5CSvwGAAAAClN0ZXZl
bkJlaWrrXEhl
/*!*/;
# at 310
#170808 11:45:20 server id 1 end_log_pos 341 CRC32 0xbeced65f Xid = 55
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@mysql data]# date
Tue Aug 8 11:47:01 CST 2017
感谢各位的阅读!关于“mysql 中如何设置 binlog_format=MIXED”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!