开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

mysql-binlog格式详解

简介:
+关注继续查看
MySQL 5.1 中,在復制(Replication)方面的改進就是引進了新的複制技術:基於行的複制。 簡言之,這種新技術就是關注表中發生變化的記錄,而非以前的照抄 binlog 模式。 從 MySQL 5.1.12 開始,可以用以下三種模式來實現:基於SQL語句的複制(statement-based replication, SBR),基於行的複制(row-based replication, RBR),混合模式複制(mixed-based replication, MBR)。 相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默認的。
在運行時可以動態低改變binlog的格式,除了以下幾種情況:
1. 存儲過程或者觸發器中間
2. 啟用了NDB
3. 當前會話試用 RBR 模式,並且已打開了臨時表
如果binlog採用了 MIXED 模式,那麼在以下幾種情況下會自動將binlog的模式由 SBR 模式改成 RBR 模式。
1. 當DML語句更新一個NDB表時
2. 當函數中包含 UUID() 時
3. 2個及以上包含 AUTO_INCREMENT 字段的表被更新時
4. 行任何 INSERT DELAYED 語句時
5. 用 UDF 時
6. 視圖中必須要求使用 RBR 時,例如創建視圖是使用了 UUID() 函數
設定主從復制(Replication)模式的方法非常簡單,只要在以前設定複製配置的基礎上,再加一個參數:
binlog_format=’STATEMENT’
#binlog_format=’ROW’
#binlog_format=’MIXED’
當然了,也可以在運行時動態修改binlog的格式。 例如
mysql> SET SESSION binlog_format = ‘STATEMENT’;
mysql> SET SESSION binlog_format = ‘ROW’;
mysql> SET SESSION binlog_format = ‘MIXED’;
mysql> SET GLOBAL binlog_format = ‘STATEMENT’;
mysql> SET GLOBAL binlog_format = ‘ROW’;
mysql> SET GLOBAL binlog_format = ‘MIXED’;
現在來比較以下 SBR 和 RBR 2中模式各自的優缺點
SBR 的優點:
1. 歷史悠久,技術成熟
2. binlog文件較小
3. binlog中包含了所有資料庫更改信息,可以據此來審核資料庫的安全等情況
4. binlog可以用於實時的還原,而不僅僅用於復制(Replication)
5. 主從版本可以不一樣,從服務器版本可以比主服務器版本高
SBR 的缺點:
1. 不是所有的UPDATE語句都能被複製,尤其是包含不確定操作的時候。
2. 調用具有不確定因素的 UDF 時復制(Replication)也可能出問題
3. 使用以下函數的語句也無法被複製:
* LOAD_FILE()
* UUID()
* USER()
* FOUND_ROWS()
* SYSDATE() (除非啟動時啟用了 –sysdate-is-now 選項)
4. INSERT … SELECT 會產生比 RBR 更多的行級鎖
5. 複製需要進行全表掃描(WHERE 語句中沒有使用到索引)的 UPDATE 時,需要比 RBR 請求更多的行級鎖
6. 對於有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 語句會阻塞其他 INSERT 語句
7. 對於一些複雜的語句,在從服務器上的耗資源情況會更嚴重,而 RBR 模式下,只會對那個發生變化的記錄產生影響
8. 存儲函數(不是存儲過程)在被調用的同時也會執行一次 NOW() 函數,這個可以說是壞事也可能是好事
9. 確定了的 UDF 也需要在從服務器上執行
10. 數據表必須幾乎和主服務器保持一致才行,否則可能會導致複製出錯
11. 執行複雜語句如果出錯的話,會消耗更多資源
RBR 的優點:
1. 任何情況都可以被複製,這對複制來說是最安全可靠的
2. 和其他大多數資料庫系統的複制技術一樣
3. 多數情況下,從服務器上的表如果有主鍵的話,複製就會快了很多
4. 複製以下幾種語句時的行鎖更少:
* INSERT … SELECT
* 包含 AUTO_INCREMENT 字段的 INSERT
* 沒有附帶條件或者並沒有修改很多記錄的 UPDATE 或 DELETE 語句
5. 執行 INSERT,UPDATE,DELETE 語句時鎖更少
6. 從服務器上採用多線程來執行複製成為可能
RBR 的缺點:
1. binlog 大了很多
2. 複雜的回滾時 binlog 中會包含大量的數據
3. 主服務器上執行 UPDATE 語句時,所有發生變化的記錄都會寫到 binlog 中,而 SBR 只會寫一次,這會導致頻繁發生
binlog 的並發寫問題
4. UDF 產生的大 BLOB 值會導致複製變慢
5. 無法從 binlog 中看到都複製了寫什麼語句
6. 當在非事務表上執行一段堆積的SQL語句時,最好採用 SBR 模式,否則很容易導致主從服務器的數據不一致情況發生
另外,針對系統庫 mysql 裡面的表發生變化時的處理規則如下:
1. 如果是採用 INSERT,UPDATE,DELETE 直接操作表的情況,則日誌格式根據 binlog_format 的設定而記錄
2. 如果是採用 GRANT,REVOKE,SET PASSWORD 等管理語句來做的話,那麼無論如何都採用 SBR 模式記錄
注:採用 RBR 模式後,能解決很多原先出現的主鍵重複問題




本文转自 fenghao.cn 51CTO博客,原文链接:http://blog.51cto.com/linuxguest/559849,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL binlog
binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中。
765 0
Mysql清理binlog
title: Mysql清理binlog date: 2019-07-26 11:37:39 categories: Mysql 速查 show master logs;PURGE BINARY LOGS TO 'mysql-bin.000001';PURGE BINARY LOGS BEFORE '2014-04-28 23:59:59';show variables like 'e
1099 0
mysql binlog的查询
查mysql bin-logbinlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中; 作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份...
1726 0
解析MYSQL BINLOG二进制格式(10)--问题解答
原创转发请注明出处 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作  http://blog.
834 0
+关注
20377
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载