程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL主主復制,在線修改表結構

MySQL主主復制,在線修改表結構

編輯:MySQL綜合教程

MySQL主主復制,在線修改表結構   一直以為雙主架構能解決mysql的表在線DDL的需求,但沒有實際測試經驗。後來發現一直的想法還是有問題的。這裡做一個測試。 雙主架構,在線DDL的實現步驟是:   www.2cto.com   1,首先搭建主主復制架構,只有一台提供服務,這裡設為A庫,另一台B庫空閒 2,A庫停止復制stop slave 3,在B庫上修改表結構,如加字段 B庫完成表修改後,因為A庫暫停了復制,所以DDL語句不會復制到A庫。對A庫沒影響 4,切換讀寫到B庫。B庫提供讀寫服務,A庫空閒 5,開啟A庫復制。 首先A庫會復制剛才的DDL語句,實現表結構修改,然後復制數據   大致一看,上面的步驟沒有問題。A/B庫修改表結構,都沒有影響數據庫對外服務。其實隱藏著一個問題。假設修改的表為X,在步驟3 B庫修改X表時,A庫上X表數據有更新,這些更新復制到B庫,會等待鎖,因為X表在進行DDL操作。B庫修改完成以後,這些更新語句可能會執行失敗,因為表結構改變可能導致更新語句出錯。現實際測試如下:  www.2cto.com     測試1: A庫上建表,插入數據,停止復制 mysql> create table tbl_testonlineddl(id int);sss mysql> insert into tbl_testonlineddl values(1); mysql> stop slave; mysql> select * from tbl_testonlineddl; +------+ | id   | +------+ |    1 | +------+   B庫上增加字段id2 mysql> alter table tbl_testonlineddl add id2 int; mysql> select * from tbl_testonlineddl; +------+------+ | id   | id2  | +------+------+ |    1 | NULL | +------+------+   A庫上再插入一條數據,這裡不指定字段列表 mysql> insert into tbl_testonlineddl values(2); mysql> select * from tbl_testonlineddl; +------+ | id   | +------+ |    1 | |    2 | +------+   B庫復制報錯Last_Errno: 1136,字段數目不匹配。這個錯誤很好理解,但如果A庫指定字段列表insert會怎樣呢? mysql> show slave status\G Last_Errno: 1136 Last_Error: Error 'Column count doesn't match value count at row 1' on query.  Default database: 'test'. Query: 'insert into tbl_testonlineddl values(2)'     測試2:dml語句指定字段名 A庫上,指定字段名插入數據 mysql> insert into tbl_testonlineddl(id) values(3); mysql> select * from tbl_testonlineddl; +------+ | id   | +------+ |    1 | |    2 | |    3 | +------+ B庫上,新插入數據同步成功 mysql> select * from tbl_testonlineddl; +------+------+ | id   | id2  | +------+------+ |    1 | NULL | +------+------+ mysql> select * from tbl_testonlineddl; +------+------+ | id   | id2  | +------+------+ |    1 | NULL | |    3 | NULL | +------+------+   結論:只要業務中的sql語句,感知不到新增字段存在,並且顯示指定需要的字段名進行數據更新,那麼雙主架構互切輪流加字段的方法,是可行。對於修改字段或者刪除字段,猜測也是一樣的道理。   mysql 5.1版本增加了對主從表異構的復制支持,簡要規則如下 異構復制出現版本5.1.21 主從表異構分兩種情況: 1,主從表字段數目不同 滿足以下條件時,主從復制可以進行: 主從表相同的字段部分,字段順序要一樣 主從表相同的字段部分,所有字段必須位於其他字段之前 主從表相同的字段部分之外,每個字段必須有default值 前兩條可以簡單理解為,主從表,字段少的表,它的字段是字段多的表的前綴,是一種包含被包含的關系。 2,主從表字段類型不同 簡單來說,只要從庫表的字段定義能夠容納主庫表的字段定義,就可以在不同數據類型之間復制。另外主從表字段類型不同的復制,與binlog格式有關。 SBR:基於語句的復制,簡單的規則是,只要在主庫執行的語句,在從庫也能成功執行,則支持主從表字段類型不同 RBR:基於行的復制,規則相對復雜,因為binlog中的數據類型與服務器的數據類型映射可能有差異 支持的數據類型轉換為: From (Master) To (Slave) BINARY CHAR BLOB TEXT CHAR BINARY DECIMAL NUMERIC NUMERIC DECIMAL TEXT BLOB VARBINARY VARCHAR VARCHAR VARBINARY 如果字段類型轉換後,精度不夠,會發生數據截斷。轉換結果與轉換模式有關:slave_type_convertions。具體規則這裡就不列出了。   5.1版本中,主從表字段數目不一樣的測試 A庫 mysql> create table tbl_testmsdiff(id1 int,id2 int); mysql> insert into tbl_testmsdiff (id1,id2)values(1,1); mysql> select * from tbl_testmsdiff; +------+------+ | id1  | id2  | +------+------+ |    1 |    1 | +------+------+ B庫 mysql> alter table tbl_testmsdiff drop column id2; mysql> select * from tbl_testmsdiff; +------+ | id1  | +------+ |    1 | +------+ A庫 mysql> set binlog_format=statement; mysql> insert into tbl_testmsdiff (id1,id2)values(2,2); mysql> select * from tbl_testmsdiff; +------+------+ | id1  | id2  | +------+------+ |    1 |    1 | |    2 |    2 | +------+------+ssss B庫復制報錯 Last_Errno: 1054 Last_Error: Error 'Unknown column 'id2' in 'field list'' on q uery. Default database: 'test'. Query: 'insert into tbl_testmsdiff (id1,id2)valu es(2,2)'   測試row模式復制 A庫 mysql> set binlog_format=row; mysql> insert into tbl_testmsdiff (id1,id2)values(3,3); mysql> select * from tbl_testmsdiff; +------+------+ | id1  | id2  | +------+------+ |    1 |    1 | |    2 |    2 | |    3 |    3 | +------+------+ B庫復制成功 mysql> select * from tbl_testmsdiff; +------+ | id1  | +------+ |    1 | |    3 |    +------+  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved