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 相比應用它們作為語句。