真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

針對(duì)mysql不同binlog模式的示例分析

這篇文章主要為大家展示了“針對(duì)MySQL不同binlog模式的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“針對(duì)mysql不同binlog模式的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)的客戶來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。專業(yè)領(lǐng)域包括成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開(kāi)發(fā)。

我們都知道,mysql binlog有三種格式:

一:Statement:每一條會(huì)修改數(shù)據(jù)的sql語(yǔ)句都會(huì)記錄在binlog中。

優(yōu)點(diǎn):不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。(相比row能節(jié)約多少性能與日志量,這個(gè)取決于應(yīng)用的SQL情況,正常同一條記錄修改或者插入row格式所產(chǎn)生的日志量還小于Statement產(chǎn)生的日志量,但是考慮到如果帶條件的update操作,以及整表刪除,alter表等操作,ROW格式會(huì)產(chǎn)生大量日志,因此在考慮是否使用ROW格式日志時(shí)應(yīng)該跟據(jù)應(yīng)用的實(shí)際情況,其所產(chǎn)生的日志量會(huì)增加多少,以及帶來(lái)的IO性能問(wèn)題。)

缺點(diǎn):由于記錄的只是執(zhí)行語(yǔ)句,為了這些語(yǔ)句能在slave上正確運(yùn)行,因此還必須記錄每條語(yǔ)句在執(zhí)行的時(shí)候的一些相關(guān)信息,以保證所有語(yǔ)句能在slave得到和在master端執(zhí)行時(shí)候相同 的結(jié)果。另外mysql 的復(fù)制,像一些特定函數(shù)功能,slave可與master上要保持一致會(huì)有很多相關(guān)問(wèn)題(如sleep()函數(shù), last_insert_id(),以及user-defined functions(udf)會(huì)出現(xiàn)問(wèn)題).

使用以下函數(shù)的語(yǔ)句也無(wú)法被復(fù)制:

* LOAD_FILE()

* UUID()

* USER()

* FOUND_ROWS()

* SYSDATE() (除非啟動(dòng)時(shí)啟用了 --sysdate-is-now 選項(xiàng))

同時(shí)在INSERT ...SELECT 會(huì)產(chǎn)生比 RBR 更多的行級(jí)鎖

二:Row:不記錄sql語(yǔ)句上下文相關(guān)信息,僅保存哪條記錄被修改。

優(yōu)點(diǎn): binlog中可以不記錄執(zhí)行的sql語(yǔ)句的上下文相關(guān)的信息,僅需要記錄那一條記錄被修改成什么了。所以rowlevel的日志內(nèi)容會(huì)非常清楚的記錄下每一行數(shù)據(jù)修改的細(xì)節(jié)。而且不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過(guò)程,或function,以及trigger的調(diào)用和觸發(fā)無(wú)法被正確復(fù)制的問(wèn)題

缺點(diǎn):所有的執(zhí)行的語(yǔ)句當(dāng)記錄到日志中的時(shí)候,都將以每行記錄的修改來(lái)記錄,這樣可能會(huì)產(chǎn)生大量的日志內(nèi)容,比如一條update語(yǔ)句,修改多條記錄,則binlog中每一條修改都會(huì)有記錄,這樣造成binlog日志量會(huì)很大,特別是當(dāng)執(zhí)行alter table之類的語(yǔ)句的時(shí)候,由于表結(jié)構(gòu)修改,每條記錄都發(fā)生改變,那么該表每一條記錄都會(huì)記錄到日志中。

三:Mixed模式: 是以上兩種level的混合使用,一般的語(yǔ)句修改使用statment格式保存binlog,對(duì)于STATEMENT模式無(wú)法復(fù)制的操作使用ROW模式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的SQL語(yǔ)句選擇日志保存方式。

如一些函數(shù),statement無(wú)法完成主從復(fù)制的操作,則采用row格式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的每一條具體的sql語(yǔ)句來(lái)區(qū)分對(duì)待記錄的日志形式,也就是在Statement和Row之間選擇一種.新版本的MySQL中隊(duì)row level模式也被做了優(yōu)化,并不是所有的修改都會(huì)以row level來(lái)記錄,像遇到表結(jié)構(gòu)變更的時(shí)候就會(huì)以statement模式來(lái)記錄。至于update或者delete等修改數(shù)據(jù)的語(yǔ)句,還是會(huì)記錄所有行的變更。

Binlog日志格式選擇:

Mysql默認(rèn)是使用Statement日志格式,推薦使用MIXED.

由于一些特殊使用,可以考慮使用ROWED,如自己通過(guò)binlog日志來(lái)同步數(shù)據(jù)的修改,這樣會(huì)節(jié)省很多相關(guān)操作。對(duì)于binlog數(shù)據(jù)處理會(huì)變得非常輕松,相對(duì)mixed,解析也會(huì)很輕松(當(dāng)然前提是增加的日志量所帶來(lái)的IO開(kāi)銷在容忍的范圍內(nèi)即可)。

針對(duì)binlog的三種格式而產(chǎn)生相應(yīng)的主從復(fù)制的三種方式:

(1):基于語(yǔ)句(Statement)的復(fù)制:  在主服務(wù)器上執(zhí)行的SQL語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高。

(2):基于行(row)的復(fù)制:把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍. 從mysql5.0開(kāi)始支持

(3):混合類型(mixed)的復(fù)制: 默認(rèn)采用基于語(yǔ)句(Statement)的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句的無(wú)法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。

如果 binlog 采用了 Mixed 模式,那么在以下幾種情況下會(huì)自動(dòng)將 binlog 的模式由 statement 模式變?yōu)?row 模式(摘自網(wǎng)絡(luò))

1)當(dāng) DML 語(yǔ)句更新一個(gè)NDB存儲(chǔ)引擎的表時(shí);

2)當(dāng)函數(shù)中包含 UUID() 時(shí);

3)2 個(gè)及以上字段,并且包含 AUTO_INCREMENT 字段的表被更新時(shí);

4)執(zhí)行 INSERT DELAYED 語(yǔ)句時(shí);

5)用 UDF(user defined function) 時(shí);

6)視圖中必須要求運(yùn)用 row 時(shí),例如建立視圖時(shí)使用了 UUID() 函數(shù);

實(shí)驗(yàn)1 binlog 采用了Statement模式,導(dǎo)致主從兩邊不一樣。

192.168.0.144:

MariaDB [log]> show variables like 'binlog_format%';

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

| Variable_name | Value |

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

| binlog_format | MIXED |

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

1 row in set (0.00 sec)

MariaDB [log]> select count(*) from    pvlogs where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

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

| count(*) |

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

|  1462803 |

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

1 row in set (3.65 sec)

MariaDB [log]> insert into  pvlogs2  select * from    pvlogs where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

Query OK, 1462803 rows affected (31.69 sec)

Records: 1462803  Duplicates: 0  Warnings: 0

MariaDB [log]> select count(*) from  pvlogs2;

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

| count(*) |

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

|  1462803 |

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

1 row in set (0.00 sec)

192.168.0.143:

MariaDB [log]> select count(*) from    pvlogs where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

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

| count(*) |

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

|  111848 |

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

1 row in set (3.65 sec)

MariaDB [log]>  select count(*) from  pvlogs2;

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

| count(*) |

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

|   111848 |

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

1 row in set (0.00 sec)

實(shí)驗(yàn)1說(shuō)明:當(dāng)主庫(kù)binlog采用MIXED 模式的時(shí)候,默認(rèn)會(huì)使用Statement模式,由于Statement模式是僅僅是把執(zhí)行的sql記錄進(jìn)binlog中,然后傳給從庫(kù),然而由于本身主從兩邊pvlogs表不一樣,進(jìn)而導(dǎo)致pvlogs2表數(shù)據(jù)不一樣。

實(shí)驗(yàn)2:因?yàn)樯婕暗搅藆uid()函數(shù),導(dǎo)致mixed方式自動(dòng)轉(zhuǎn)換成row模式,來(lái)精確復(fù)制。

192.168.0.144:

MariaDB [log]> show variables like 'binlog_format%';

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

| Variable_name | Value |

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

| binlog_format | MIXED |

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

1 row in set (0.00 sec)

MariaDB [log]>insert into  test_log select uuid() id, member_id,jsession,ip,search_id,info_id,lastmodify,disc,status  from  pvlogs where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

MariaDB [log]> select count(*) from  pvlogs2 where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

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

| count(*) |

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

|  1462803 |

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

1 row in set (0.00 sec)

MariaDB [log]> select count(*) from  test_log;

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

| count(*) |

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

|  1462803 |

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

1 row in set (1.29 sec)

192.168.0.143:

MariaDB [log]> select count(*) from    pvlogs where lastmodify>'2017-07-19' and  lastmodify<'2017-07-20';

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

| count(*) |

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

|  111848 |

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

1 row in set (3.65 sec)

MariaDB [log]> select count(*) from  test_log;

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

| count(*) |

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

|  1462803 |

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

1 row in set (1.29 sec)

實(shí)驗(yàn)2說(shuō)明:當(dāng)主庫(kù)binlog采用MIXED 模式的時(shí)候,雖然默認(rèn)會(huì)使用Statement模式,但是當(dāng)遇到uuid()函數(shù)的時(shí)候,因?yàn)镾tatement模式不能準(zhǔn)確復(fù)制,所以會(huì)自動(dòng)轉(zhuǎn)換成使用row模式,這樣把具體的變化寫(xiě)進(jìn)binlog,傳給從庫(kù),實(shí)現(xiàn)準(zhǔn)確復(fù)制;

實(shí)驗(yàn)3:自增導(dǎo)致mixed轉(zhuǎn)換成rowed;

192.168.0.144:

MariaDB [log]> show variables like 'binlog_format%';

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

| Variable_name | Value |

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

| binlog_format | MIXED |

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

1 row in set (0.00 sec)

MariaDB [log]>  select count(*) from pvlogs_back where lastmodify>'2017-08-20' and  lastmodify<'2017-08-22';

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

| count(*) |

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

|  2638555 |

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

1 row in set (4.24 sec)

MariaDB [log]> insert into  test_log select '' , member_id,jsession,ip,search_id,info_id,lastmodify,disc,status  from  pvlogs_back where lastmodify>'2017-08-20' and  lastmodify<'2017-08-22';

Query OK, 2638555 rows affected, 65535 warnings (1 min 27.18 sec)

Records: 2638555  Duplicates: 0  Warnings: 2638555

MariaDB [log]> select count(*) from  test_log;

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

| count(*) |

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

|  2638555 |

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

1 row in set (0.93 sec)

192.168.0.143:

MariaDB [log]>  select count(*) from pvlogs_back where lastmodify>'2017-08-20' and  lastmodify<'2017-08-22';

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

| count(*) |

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

|  111848 |

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

1 row in set (4.24 sec)

MariaDB [log]> select count(*) from  test_log;

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

| count(*) |

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

|  2638555 |

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

1 row in set (0.93 sec)

實(shí)驗(yàn)3說(shuō)明:當(dāng)主庫(kù)binlog采用MIXED 模式的時(shí)候,雖然默認(rèn)會(huì)使用Statement模式,但2 個(gè)及以上字段,并且包含 AUTO_INCREMENT 字段的表被更新時(shí),因?yàn)镾tatement模式不能準(zhǔn)確復(fù)制,所以會(huì)自動(dòng)轉(zhuǎn)換成使用row模式,這樣把具體的變化寫(xiě)進(jìn)binlog,傳給從庫(kù),實(shí)現(xiàn)準(zhǔn)確復(fù)制;

總結(jié):mysql的binlog三種模式,各有優(yōu)缺點(diǎn),row下可能會(huì)產(chǎn)生大量的日志內(nèi)容,但是可以做到任何情況都可以被復(fù)制,這對(duì)復(fù)制來(lái)說(shuō)是最安全可靠的,并且執(zhí)行 INSERT,UPDATE,DELETE 語(yǔ)句時(shí)鎖更少;Statement模式下產(chǎn)生的binlog大部分情況下比較小,但是有的一些情況是不能被準(zhǔn)確復(fù)制的,推薦使用MIXED模式。

以上是“針對(duì)mysql不同binlog模式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)頁(yè)標(biāo)題:針對(duì)mysql不同binlog模式的示例分析
本文網(wǎng)址:http://weahome.cn/article/igicgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部