天天看點

17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication 基于語句和行的複制的優勢和劣勢

17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication  基于語句和行的複制的優勢和劣勢


每個binary logging格式有優勢和劣勢,對于很多使用者, mixed replication 格式提供了最好的資料完整性和性能的組合。

如果,然而, 你需要利用特定功能基于語句的或者基于行格式的 當執行某個人物,

你可以使用這個章節的資訊,提供了他們的優勢和劣勢的一個總結,




    Advantages of statement-based replication

    Disadvantages of statement-based replication

    Advantages of row-based replication

    Disadvantages of row-based replication 


基于語句複制的優點:


1.成熟的技術

2.更少的資料寫入到Log files.當更新或者删除 影響很多行,這個導緻更少的存儲空間需要對于日志檔案。

這也意者着從備份恢複可以迅速的完成


3.日志檔案包含所有改變的語句,可以用于審計資料庫



statement-based replication 的缺點

1. 語句是不安全的對于SBR,并不是所有修改語句(比如INSERT DELETE, UPDATE, and REPLACE statements) 

可以被複制使用基于語句複制。

任何不确定行為是很難被複制使用基于語句的,比如DML包含如下:


一個語句取決于一個UDF 或者存儲過程 是不确定的,


因為這樣的UDF或者存儲程式或者依賴的因素傳回的值不同于參數提供的值。


行格式複制,然而, 簡單的複制UDF或者存儲過程傳回的值


DELEET 和UPDATE 語句使用一個LIMIT 子句沒有一個ORDER BY 是不确定的


語句使用下面的函數不能被正确的複制使用基于語句選項:




    LOAD_FILE()

    UUID(), UUID_SHORT()

    USER()

    FOUND_ROWS()

    SYSDATE() (unless both the master and the slave are started with the --sysdate-is-now option)

    GET_LOCK()

    IS_FREE_LOCK()

    IS_USED_LOCK()

    MASTER_POS_WAIT()

    RAND()

    RELEASE_LOCK()

    SLEEP()

    VERSION() 

1. INSERT ... SELECT  需要大量的row-level locks 相比基于行的複制

2.UPDATE語句 需要一個表掃描(沒有index是被使用在WHERE子句)必須鎖住大量的行,相比基于行複制

3.對于InnoDB:一個INSERT 語句使用 AUTO_INCREMENT  堵塞其他不沖突的INSERT 語句

4.對于複雜語句,語句必須被評估和被執行在slave上在記錄被更新或者插入前。


1.在基于行的複制, slave隻需要修改影響的行,不是執行整個語句



2.如果這裡有個錯誤在slave上評估的時候,特别是當執行複雜的語句,基于語句的複制可能緩慢的增加錯誤的幅度根據影響的行


3.存儲過程執行相同的NOW()值作為調用語句,然而, 這是不正确的過程


Advantages of row-based replication 基于記錄的複制的優點


所有的改變可以被複制,這是最安全的複制形式

注意:

 語句 更新資訊在mysql 資料庫 比如GRANT, REVOKE和觸發器操作,存儲函數(包含存儲過程)


和事務 都被複制到slaves 使用基于語句的複制


對于語句比如CREATE TABLE ... SELECT ,一個CREATE 語句是生成一個表定義和複制使用基于語句複制,

記錄插入時複制使用基于記錄的格式。




這個技術是和很多書其他資料庫管理系統相似



很少的row locks 是需要的在master上, 進而實作高并發,對于以下類型的語句:



    INSERT ... SELECT

    INSERT statements with AUTO_INCREMENT

    UPDATE or DELETE statements with WHERE clauses that do not use keys or do not change most of the examined rows. 


基于行的複制缺點:

RBR 可以産生更多以的資料 必須被記錄,複制一個DML 語句(比如一個UPDATE或者DELETE 語句).


基于語句的複制隻寫語句到Binary log.

與之相反,  row-based replication 寫每個changed 記錄到每個binary log.


如果語句改變很多記錄,基于行複制可能寫很多的資料到binary log.


這是真的即使語句被復原。


這也意味着從備份恢複需要更久的時間。此外, binary log 是鎖住很多時間來寫資料,

這個可能會導緻并發問題。使用 binlog_row_image=minimal


mysql> show variables like '%binlog_row_image%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| binlog_row_image | FULL  |
+------------------+-------+
1 row in set (0.00 sec)



2. 确定UDFs産生大量的BLOB 值 花費很長時間來複制基于行的格式相比基于語句的。

這是以為BLOB 列值是記錄的,相比語句産生的資料

3.對于表使用MyISAM 存儲引擎,一個很強的lock 是需要的在slave上對于INSERT 語句當應用他們作為

基于行的events 到binary log 相比應用它們作為語句。