中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

binlog的三種模式

發布時間:2020-06-23 17:51:10 來源:網絡 閱讀:448 作者:Darren_Chen 欄目:MySQL數據庫

binlog的三種模式

statement模式

特點:

(1)此模式不支持RU,RC隔離級別;

(2)binglog日志文件中上一個事物的結束點是下一個事物的開始點;

(3)DML,DDL語句都會明文顯示;

(4)對一些系統函數不能準確復制或者不能復制,如load_file()、uuid()、user()、found_rows()、sysdate(),注意(now()可以復制; )

(5)主庫執行delete from t1 where c1=xxx limit 1,statement模式下,從庫也會這么執行,可能導致刪除的不是同一行數據

(6)主庫有id=1和id=10兩行數據,從庫有id=1,2,3,10這四行數據,主庫執行delete from t1 where id<10命令,從庫刪除過多數據;


什么場景會用到statement模式:

(1)一次更新大量數據,如二十萬數據,否則在復制的時候,從庫可能會追的太慢,導致延時;

(2)使用pt-table-checksum工具時會使用到statement模式;

例1:
set  tx_isolation='repeatable-read';
set  binlog_format='statement';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# mysqlbinlog mysql-bin.000022
......
create table t10(c1 int,c2 varchar(50))
BEGIN
/*!*/;
# at 532
#170408 14:40:49 server id 330622  end_log_pos 649 CRC32 0xe5cfc853     Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649/*!*/;  --先設置timestamp,從庫復制的時候也會執行這條SQL,這就是now()函數為什么可以復制的原因
insert into t10 values(1,now())     
insert into t10 values(2,now())
insert into t10 values(3,sysdate())
insert into t10 values(4,uuid())
/*!*/;
# at 1550
#170408 14:40:49 server id 330622  end_log_pos 1581 CRC32 0x5aaa5377    Xid = 1755
COMMIT/*!*/;
# at 1581
#170408 14:40:49 server id 330622  end_log_pos 1646 CRC32 0xc2da517f    GTID    last_committed=5        sequence_number=6
SET @@SESSION.GTID_NEXT= '83373570-fe03-11e6-bb0a-000c29c1b8a9:11328'/*!*/;
# at 1646
#170408 14:40:49 server id 330622  end_log_pos 1729 CRC32 0x943df058    Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649/*!*/;
BEGIN
/*!*/;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649/*!*/;
update t10 set c2='bbb' where c1=1
/*!*/;
# at 1841
#170408 14:40:49 server id 330622  end_log_pos 1872 CRC32 0xd06c40f5    Xid = 1756
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
主庫:
root@localhost [testdb]>select * from t10;
+------+--------------------------------------+
| c1   | c2                                   |
+------+--------------------------------------+
|    1 | bbb                                  |
|    2 | 2017-04-08 14:40:49                  |
|    3 | 2017-04-08 14:40:49                  |
|    4 | 4d76efa5-1c26-11e7-bc58-000c29c1b8a9 |
+------+--------------------------------------+
從庫:
root@localhost [testdb]>select * from t10;
+------+--------------------------------------+
| c1   | c2                                   |
+------+--------------------------------------+
|    1 | bbb                                  |
|    2 | 2017-04-08 14:40:49                  |
|    3 | 2017-04-14 13:12:19                  |
|    4 | ef119323-20d0-11e7-aef6-000c29565380 |
+------+--------------------------------------+
可以發現,statument日志格式下,由于使用了一些函數導致主從數據不一致;


例2:
update這個事物的開始是insert這個事物結束的點at1581;
update結束的點是commit之后的點at1842;
[root@Darren2 logs]# mysqlbinlog --start-position=1581 --stop-position=1842 mysql-bin.000022;
......
BEGIN
/*!*/;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
use `testdb`/*!*/;
SET TIMESTAMP=1491633649/*!*/;
update t10 set c2='bbb' where c1=1
/*!*/;
# at 1841
#170408 14:40:49 server id 330622  end_log_pos 1872 CRC32 0xd06c40f5    Xid = 1756
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


例3:
當查看commit之前的position點時,會看到rollback狀態,說明這個截取的事物不完整:
[root@Darren2 logs]# mysqlbinlog --start-position=1581 --stop-position=1841 mysql-bin.000022;
BEGIN
/*!*/;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
use `testdb`/*!*/;
SET TIMESTAMP=1491633649/*!*/;
update t10 set c2='bbb' where c1=1
/*!*/;
ROLLBACK /* added by mysqlbinlog */ /*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

row模式

(1)相對statement更加安全;

(2)在表有主鍵的情況下復制更加快;

(3)系統的特殊函數也能復制;

(4)更少的鎖,只有行鎖;

(5)binlog文件比較大,如單語句更新20萬行數據,可能要半小時,也有可能把主庫跑掛;

(6)無法從binog看見用戶執行的SQL語句(mysql 5.6后通過設置binlog_rows_query_log_events=on,日志格式為row中的binlog日志中看到執行過得SQL語句。)

(7)5.7默認的日志模式為row;

(8)DDL語句明文顯示,DML語句加密顯示;

(9)DML經過base64加密,需要使用參數--base64-output=decode-rows --verbose;

(10)update修改的語句可以看到歷史舊數據;

例1:
set  tx_isolation='repeatable-read';
set  binlog_format='row';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;

不加參數只能看到create,alter,drop等DDL語句:
mysqlbinlog mysql-bin.000023

帶參數查看:
[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000023
......
create table t10(c1 int,c2 varchar(50))
### INSERT INTO `testdb`.`t10`
### SET
###   @1=1
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=2
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=3
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=4
###   @2='9d96b424-1c2a-11e7-bc58-000c29c1b8a9'
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1
###   @2='2017-04-08 15:11:41'
### SET
###   @1=1
###   @2='bbb'


例2:開啟binlog_rows_query_log_events參數,會顯示執行的SQL語句,這個參數默認關閉,不顯示執行的SQL
root@localhost [testdb]>set binlog_rows_query_log_events=on;

[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000024
......
create table t10(c1 int,c2 varchar(50))

# insert into t10 values(1,now())
### INSERT INTO `testdb`.`t10`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='2017-04-08 15:26:09' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
# insert into t10 values(2,now())

### INSERT INTO `testdb`.`t10`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2='2017-04-08 15:26:09' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
# at 1033

# insert into t10 values(3,sysdate())

### INSERT INTO `testdb`.`t10`
### SET
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
###   @2='2017-04-08 15:26:09' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
# insert into t10 values(4,uuid())
### INSERT INTO `testdb`.`t10`
### SET
###   @1=4 /* INT meta=0 nullable=1 is_null=0 */
###   @2='a2b570b8-1c2c-11e7-bc58-000c29c1b8a9' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
# update t10 set c2='bbb' where c1=1
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='2017-04-08 15:26:09' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bbb' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */


mixed模式

特點:

(1)innodb引擎,如果隔離級別是RU、RC,則mixed模式會轉成Row模式存儲;

(2)mixed模式下,在以下幾種情況會自動將binlog的模式有SBR轉化成RBR模式:

當更新一個NDB表時;

當函數包含uuid()函數時;

2個及以上包含auto_increment字段的表被更新時;

視圖中必須要求使用RBR時,如創建視圖時使用了uuid()函數;

例1:當隔離級別是read-committed時,mixed模式會轉化成row模式存儲:
set  tx_isolation='read-committed';
set  binlog_format='mixed';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000028
......
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='2017-04-08 18:34:08' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='bbb' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
......
例2:當隔離級別是repeatable-read時,mixed模式會轉化成statement模式存儲
set  tx_isolation='repeatable-read';
set  binlog_format='mixed';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# mysqlbinlog mysql-bin.000029
......
update t10 set c2='bbb' where c1=1
......


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

法库县| 邵阳县| 尚义县| 鹰潭市| 射洪县| 米林县| 永昌县| 察哈| 渭源县| 资中县| 东阳市| 体育| 商丘市| 曲阳县| 莒南县| 丽江市| 嘉荫县| 湖南省| 南和县| 庐江县| 灵台县| 马边| 沙河市| 涡阳县| 湖南省| 昭通市| 丹寨县| 县级市| 张掖市| 天全县| 若尔盖县| 类乌齐县| 温宿县| 陇南市| 雷州市| 子洲县| 临清市| 镇沅| 绥江县| 于都县| 深圳市|