1. 程式人生 > >mysql資料庫同步時資料一致性的配置優化

mysql資料庫同步時資料一致性的配置優化

據丟失,而在生產環境中, 每一資料都是要儘量不等丟失,所以,為了提高主從資料一致性和穩定性,降低丟失資料的可能,就需要進行一些配置優化,使用一些特別的設定,使得資料安全更好,但是同時也會影響到mysql資料庫的效能,所以就需要在安全和效能之間進行取捨。根據使用的具體環境,選擇最適合自身的資料庫安全設定。
下面就一一介紹和列舉幾個對主從資料複製安全比較重要的幾個配置引數:
MySQL版本為5.6
1.master主庫上設定:
innodb_flush_log_at_trx_commit
=0: log buffer將每秒一次地寫入log file中,並且log file的flush(刷到磁碟)操作同時進行.該模式下,在事務提  交的時候,不會主動觸發寫入磁碟的操作。
=1: 每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去.
=2: 每次事務提交時MySQL都會把log buffer的資料寫入log file.但是flush(刷到磁碟)操作並不會同時進行。該  模式下,MySQL會每秒執行一次 flush(刷到磁碟)操作。
注意:由於程序排程策略問題,這個“每秒執行一次 flush(刷到磁碟)操作”並不是保證100%的“每秒”。
sync_binlog
=0   ,像作業系統刷其他檔案的機制一樣,MySQL不會同步到磁碟中去而是依賴作業系統來重新整理binary log。
=N (N>0)    ,MySQL 在每寫 N次 二進位制日誌binary log時,會使用fdatasync()函式將它的寫二進位制日誌 binary log同步到磁碟中去。
注:如果啟用了autocommit,那麼每一個語句statement就會有一次寫操作;否則每個事務對應一個寫操作。
最好的安全設定為:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
但這樣的效能也是最低,每次寫入都會造成大量的磁碟IO,適合資料安全性要求非常高,而且磁碟IO寫能力足夠支援業務,比如訂單,交易,充值,支付消費系統等。
反之,如果壓力較大,推薦的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N為500 或1000) 且使用帶蓄電池後備電源的快取cache,防止系統斷電異常。
binlog_format=row
資料庫複製的模式,主要有三種模式:
① STATEMENT模式(SBR)
每一條會修改資料的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的資料變化,減少了binlog日誌量,節約IO,提高效能。缺點是在某些情況下會導致master-slave中的資料不一致(如sleep()函式, last_insert_id(),以及user-defined functions(udf)等會出現問題)
② ROW模式(RBR)
不記錄每條sql語句的上下文資訊,僅需記錄哪條資料被修改了,修改成什麼樣了。而且不會出現某些特定情況下的儲存過程、或function、或trigger的呼叫和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是alter table的時候會讓日誌暴漲。
③ MIXED模式(MBR)
以上兩種模式的混合使用,一般的複製使用STATEMENT模式儲存binlog,對於STATEMENT模式無法複製的操作使用ROW模式儲存binlog,MySQL會根據執行的SQL語句選擇日誌儲存方式。
在生產環境中,對資料安全比較看重,普遍使用row模式,任何情況都可以被複制,這對複製來說是最安全可靠
雙主互為主備的情況下:
log_slave_updates=1
預設是關閉的,這樣在雙主的情況下會出現複製問題:
M01同步從M02同步資料過來的時候,log_slave_updates引數用來控制M01是否把所有的操作寫入到binary log,預設的情況下mysql是關閉的;
R01資料的更新需要通過讀取到M01的binary log才能進行更新,這個時候M01是沒有寫binary log的,所以當資料從M02寫入的時候,R01也就沒有更新了。。
2.slave從庫上設定:
master_info_repository = “TABLE”
relay_log_info_repository = “TABLE”
relay_log_recovery = 1
這樣設定,保證了從機不管怎麼宕機,重啟後都能保準資料一致性,不會導致從庫已經插入資料,但還沒寫入到relay-log.info檔案記錄,而導致重啟後重新重複插入資料的出錯的情況。
最後,總結配置:
master:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
binlog_format=row
slave:
master_info_repository = “TABLE”
relay_log_info_repository = “TABLE”
relay_log_recovery = 1
上面的配置是以資料安全為主進行的配置,如果要更改,請根據實際情況進行與效能的取捨。
———————