如果從庫上表 t 數(shù)據(jù)與主庫不一致,導(dǎo)致復(fù)制錯(cuò)誤,整個(gè)庫的數(shù)據(jù)量很大,重做從庫很慢,如何單獨(dú)恢復(fù)這張表的數(shù)據(jù)?通常認(rèn)為是不能修復(fù)單表數(shù)據(jù)的,因?yàn)樯婕暗礁鞅頎顟B(tài)不一致的問題。下面就列舉備份單表恢復(fù)到從庫會面臨的問題以及解決辦法:
成都創(chuàng)新互聯(lián)是一家專業(yè)提供靈武企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為靈武眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
場景 1
如果復(fù)制報(bào)錯(cuò)后,沒有使用跳過錯(cuò)誤、復(fù)制過濾等方法修復(fù)主從復(fù)制。主庫數(shù)據(jù)一直在更新,從庫數(shù)據(jù)停滯在報(bào)錯(cuò)狀態(tài)(假設(shè) GTID 為 aaaa:1-100)。
修復(fù)步驟:
在主庫上備份表 t (假設(shè)備份快照 GTID 為 aaaa:1-10000);
恢復(fù)到從庫;
啟動復(fù)制。
這里的問題是復(fù)制起始位點(diǎn)是 aaaa:101,從庫上表 t 的數(shù)據(jù)狀態(tài)是領(lǐng)先其他表的。aaaa:101-10000 這些事務(wù)中只要有修改表 t 數(shù)據(jù)的事務(wù),就會導(dǎo)致復(fù)制報(bào)錯(cuò) ,比如主鍵沖突、記錄不存在(而 aaaa:101 這個(gè)之前復(fù)制報(bào)錯(cuò)的事務(wù)必定是修改表 t 的事務(wù))
解決辦法:啟動復(fù)制時(shí)跳過 aaaa:101-10000 這些事務(wù)中修改表 t 的事務(wù)。
正確的修復(fù)步驟:
1. 在主庫上備份表 t (假設(shè)備份快照 GTID 為 aaaa:1-10000),恢復(fù)到從庫;
2. 設(shè)置復(fù)制過濾,過濾表 t:
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db_name.t');
3. 啟動復(fù)制,回放到 aaaa:10000 時(shí)停止復(fù)制(此時(shí)從庫上所有表的數(shù)據(jù)都在同一狀態(tài),是一致的);
START SLAVE UNTIL SQL_AFTER_GTIDS = 'aaaa:10000';
4. 刪除復(fù)制過濾,正常啟動復(fù)制。
注意事項(xiàng):這里要用 mysqldump --single-transaction --master-data=2,記錄備份快照對應(yīng)的 GTID
場景 2
如果復(fù)制報(bào)錯(cuò)后,使用跳過錯(cuò)誤、復(fù)制過濾等辦法修復(fù)了主從復(fù)制。主、從庫數(shù)據(jù)一直在更新。
修復(fù)步驟:
在主庫上備份表 t (假設(shè)備份快照 GTID為 aaaa:1-10000);
停止從庫復(fù)制,GTID為 aaaa:1-20000;
恢復(fù)表 t 到從庫;
啟動復(fù)制。
這里的問題是復(fù)制起始位點(diǎn)是 aaaa:20001,aaaa:10000-20000 這些事務(wù)將不會在從庫上回放,如果這里面有修改表 t 數(shù)據(jù)的事務(wù),從庫上將丟失這部分?jǐn)?shù)據(jù)。
解決辦法:從備份開始到啟動復(fù)制,鎖定表 t,保證 aaaa:10000-20000 中沒有修改表 t 的事務(wù)。
正確修復(fù)步驟:
對表 t 加讀鎖;
在主庫上備份表 t;
停止從庫復(fù)制,恢復(fù)表 t;
啟動復(fù)制;
解鎖表 t。
如果是大表,這里可以用可傳輸表空間方式備份、恢復(fù)表,減少鎖表時(shí)間。
我的想法是:用Union all
你試一下,我沒數(shù)據(jù),沒辦法測試:
select id, sum(num)
from ((select id, sum(num) num from tables1 group by id) union all (select id, sum(num) num from tables2 group by id)) a group by id
操作方法如下:
1、首先需要在mysql管理工具上面新建一個(gè)表,也可以用mysql命令創(chuàng)建,表建立完成之后,需要將表中的字段名字告訴給填寫excel表的人員。
2、打開excel表,按照程序提供的字段填寫相應(yīng)的數(shù)據(jù),需要跟程序提供的一樣,其他的描述。.
3、使用的mysql管理工具Navicatfor MySQL,打開工具,選擇表所在的數(shù)據(jù)庫,然后點(diǎn)擊數(shù)據(jù)庫名字,右鍵數(shù)據(jù),出來下拉菜單選擇import wizard ,有漢化版本的更明確.彈出一個(gè)選擇界面,選擇excel file文件。
4、點(diǎn)擊next(下一步),選擇對應(yīng)的excel文件就行,然后再下面選文件內(nèi)容在哪一個(gè)sheet中,也就是內(nèi)容寫在excel什么地方,這點(diǎn)需要注意,也是關(guān)鍵的地方。
5、點(diǎn)擊next (此步驟也是關(guān)鍵步驟),需要注意2點(diǎn): 1:filedname row 就是字段所在excel中的位置,也就是第幾行(簡單辦法,一般就是英文對應(yīng)的那一列).2:first data row(從哪一行開始執(zhí)行),數(shù)據(jù)從哪一行開始。.
6、點(diǎn)擊next選擇 targettable 目標(biāo)對應(yīng)的數(shù)據(jù)庫,選擇要導(dǎo)入到哪個(gè)數(shù)據(jù)庫中表中。
7、如果到上面一步?jīng)]有問題的話,默認(rèn)next到最后 就行了.然后打開表就能看到數(shù)據(jù)跟excel表中的一樣。