當前位置:編程學習大全網 - 行動軟體 - 如何將mysql的壹個完整數據庫全部復制到另外壹個數據庫?

如何將mysql的壹個完整數據庫全部復制到另外壹個數據庫?

如果從庫上表 t 數據與主庫不壹致,導致復制錯誤,整個庫的數據量很大,重做從庫很慢,如何單獨恢復這張表的數據?通常認為是不能修復單表數據的,因為涉及到各表狀態不壹致的問題。下面就列舉備份單表恢復到從庫會面臨的問題以及解決辦法:

場景 1

如果復制報錯後,沒有使用跳過錯誤、復制過濾等方法修復主從復制。主庫數據壹直在更新,從庫數據停滯在報錯狀態(假設 GTID 為 aaaa:1-100)。

修復步驟:

在主庫上備份表 t (假設備份快照 GTID 為 aaaa:1-10000);

恢復到從庫;

啟動復制。

這裏的問題是復制起始位點是 aaaa:101,從庫上表 t 的數據狀態是領先其他表的。aaaa:101-10000 這些事務中只要有修改表 t 數據的事務,就會導致復制報錯 ,比如主鍵沖突、記錄不存在(而 aaaa:101 這個之前復制報錯的事務必定是修改表 t 的事務)

解決辦法:啟動復制時跳過 aaaa:101-10000 這些事務中修改表 t 的事務。

正確的修復步驟:

1. 在主庫上備份表 t (假設備份快照 GTID 為 aaaa:1-10000),恢復到從庫;

2. 設置復制過濾,過濾表 t:

CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db_name.t');

3. 啟動復制,回放到 aaaa:10000 時停止復制(此時從庫上所有表的數據都在同壹狀態,是壹致的);

START SLAVE UNTIL SQL_AFTER_GTIDS = 'aaaa:10000';

4. 刪除復制過濾,正常啟動復制。

註意事項:這裏要用 mysqldump --single-transaction --master-data=2,記錄備份快照對應的 GTID

場景 2

如果復制報錯後,使用跳過錯誤、復制過濾等辦法修復了主從復制。主、從庫數據壹直在更新。

修復步驟:

在主庫上備份表 t (假設備份快照 GTID為 aaaa:1-10000);

停止從庫復制,GTID為 aaaa:1-20000;

恢復表 t 到從庫;

啟動復制。

這裏的問題是復制起始位點是 aaaa:20001,aaaa:10000-20000 這些事務將不會在從庫上回放,如果這裏面有修改表 t 數據的事務,從庫上將丟失這部分數據。

解決辦法:從備份開始到啟動復制,鎖定表 t,保證 aaaa:10000-20000 中沒有修改表 t 的事務。

正確修復步驟:

對表 t 加讀鎖;

在主庫上備份表 t;

停止從庫復制,恢復表 t;

啟動復制;

解鎖表 t。

如果是大表,這裏可以用可傳輸表空間方式備份、恢復表,減少鎖表時間。

  • 上一篇:海莉阿特維爾聖殿春秋多少集出場
  • 下一篇:springboot與ssm的優點
  • copyright 2024編程學習大全網