SQLServer的Replication技術(shù)從2005開始,已經(jīng)變得非常成熟了,而且效果也很好,很多的公司在做讀寫分離時,都選擇了這項技術(shù);Replication現(xiàn)在包括事務(wù)、合并和快照三種,每項都有各自的應(yīng)用優(yōu)勢,大家用得最多的無疑是事物復(fù)制了,這種技術(shù)能保證我們發(fā)布端的數(shù)據(jù)的變更能及時傳輸?shù)接嗛喍耍W(wǎng)絡(luò)帶寬和服務(wù)器配置
如果不差的話,兩臺機(jī)器之間的數(shù)據(jù)延時是非常小的,這為我們的讀寫分離技術(shù)提供了有力的保障(很少出現(xiàn)用戶剛剛新加的數(shù)據(jù)查不到的現(xiàn)象),不僅分散了讀寫的壓力,而且在做機(jī)器維護(hù)時也游刃有余,并且用戶體驗也得到了比較好的提升,下面我們以事務(wù)復(fù)制為例,來介紹下創(chuàng)建復(fù)制鏈的技巧。
創(chuàng)建Replication有三種方法:
方法一:使用備份還原的技術(shù)
這個方法對數(shù)據(jù)量比較大,而且停機(jī)時間要求非常緊的數(shù)據(jù)庫復(fù)制是很好的選擇,實現(xiàn)方式很簡單,就是在停站的情況下,把我們的發(fā)布端的數(shù)據(jù)庫備份,
然后還原到訂閱端,這樣發(fā)布端和訂閱端的數(shù)據(jù)是一致的;然后我們再將同步鏈建上即可。
不過,這個方法有個要求是,我們把數(shù)據(jù)還原到訂閱端后,需要檢查所有的表是否有自增列,如果有自增列,我們需要將自增列改為普通列,方式如下:
1. 在訂閱端還原的數(shù)據(jù)庫上查找自增列:
結(jié)果如下:
2. 將自增列修改成普通列:
方法是先重名了這些表,然后新建同名的表,表結(jié)構(gòu)一樣,但是去掉自增列屬性,然后將重命名的表數(shù)據(jù)導(dǎo)入到新表中,完成后我們就得到了沒有自增列
的表,然后就可以創(chuàng)建同步鏈了。
方法二:BCP和TableDiff
BCP結(jié)合TableDiff在我們?yōu)橐延械耐芥溙砑有卤恚乙蟀l(fā)布端必須保持在線,并對發(fā)布端業(yè)務(wù)影響最小時是非常好的方法,它的實現(xiàn)步驟如下:
1. 將需要新加到同步鏈的表結(jié)構(gòu)新建到訂閱端;
2. 在發(fā)布端準(zhǔn)備好BCP導(dǎo)出導(dǎo)入腳本,并將要新加的表通過BCP導(dǎo)出到文件中;
3. 將新表加入到同步鏈中(可以通過腳本,也可以直接通過可視化界面操作),暫停這條鏈上同步數(shù)據(jù)的JOB;
4. 運(yùn)行BCP導(dǎo)入腳本,將數(shù)據(jù)導(dǎo)入到訂閱端;
5. 用TableDiff比較新表在訂閱端和發(fā)布端的數(shù)據(jù),并補(bǔ)齊差異數(shù)據(jù)(TableDiff 比較后會自動生成不起差異數(shù)據(jù)的腳本,在訂閱端運(yùn)行即可);
6. 開啟暫停的同步鏈的JOB,這樣就完成了。
整個過程對系統(tǒng)業(yè)務(wù)影響非常小。
方法三:直接初始化快照
這種方式是最簡單的,但是對業(yè)務(wù)影響非常大,而且耗時也很長,基本不推薦(不過這個方法很多人在用,如果是很小的庫還是可以考慮)。