SQLServer的Replication技術從2005開始,已經變得非常成熟了,而且效果也很好,很多的公司在做讀寫分離時,都選擇了這項技術;Replication現在包括事務、
合并和快照三種,每項都有各自的應用優勢,大家用得最多的無疑是事物複製了,這種技術能保證我們發布端的資料的變更能及時傳輸到訂閱端,網路頻寬和伺服器配置
如果不差的話,兩台機器之間的資料延時是非常小的,這為我們的讀寫分離技術提供了有力的保障(很少出現使用者剛剛新加的資料查不到的現象),不僅分散了讀寫的壓
力,而且在做機器維護時也遊刃有餘,並且使用者體驗也得到了比較好的提升,下面我們以事務複製為例,來介紹下建立複製鏈的技巧。
建立Replication有三種方法:
方法一:使用備份還原的技術
這個方法對資料量比較大,而且停機時間要求非常緊的資料庫複寫是很好的選擇,實現方式很簡單,就是在停站的情況下,把我們的發布端的Database Backup,
然後還原到訂閱端,這樣發布端和訂閱端的資料是一致的;然後我們再將同步鏈建上即可。
不過,這個方法有個要求是,我們把資料還原到訂閱端後,需要檢查所有的表是否有自增列,如果有自增列,我們需要將自增列改為普通列,方式如下:
1. 在訂閱端還原的資料庫上尋找自增列:
--尋找資料庫自增列
SELECT
表名= D.NAME,
列名= A.NAME,
是否自增= CASE WHEN COLUMNPROPERTY( A.ID,A.NAME, 'ISIDENTITY ')=1 THEN '√'ELSE '' END,
主鍵= CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE XTYPE= 'PK ' AND PARENT_OBJ=A.ID AND NAME IN (
SELECT NAME FROM SYSINDEXES WHERE INDID IN(
SELECT INDID FROM SYSINDEXKEYS WHERE ID = A.ID AND COLID=A.COLID))) THEN '√' ELSE '' END
FROM SYSCOLUMNS A
LEFT JOIN SYSTYPES B ON A.XUSERTYPE=B.XUSERTYPE
INNER JOIN SYSOBJECTS D ON A.ID=D.ID AND D.XTYPE= 'U' AND D.NAME <> 'DTPROPERTIES '
where COLUMNPROPERTY( A.ID,A.NAME, 'ISIDENTITY ')=1
結果如下:
2. 將自增列修改成普通列:
方法是先重名了這些表,然後建立同名的表,表結構一樣,但是去掉自增列屬性,然後將重新命名的表資料匯入到新表中,完成後我們就得到了沒有自增列
的表,然後就可以建立同步鏈了。
方法二:BCP和TableDiff
BCP結合TableDiff在我們為已有的同步鏈添加新表,而且要求發布端必須保持線上,並對發布端業務影響最小時是非常好的方法,它的實現步驟如下:
1. 將需要新加到同步鏈的表結構建立到訂閱端;
2. 在發布端準備好BCP匯出匯入指令碼,並將要新加的表通過BCP匯出到檔案中;
3. 將新表加入到同步鏈中(可以通過指令碼,也可以直接通過可視化介面操作),暫停這條鏈上同步資料的JOB;
4. 運行BCP匯入指令碼,將資料匯入到訂閱端;
5. 用TableDiff比較新表在訂閱端和發布端的資料,並補齊差異資料(TableDiff 比較後會自動產生不起差異資料的指令碼,在訂閱端運行即可);
6. 開啟暫停同步鏈的JOB,這樣就完成了。
整個過程對系統業務影響非常小。
方法三:直接初始化快照
這種方式是最簡單的,但是對業務影響非常大,而且耗時也很長,基本不推薦(不過這個方法很多人在用,如果是很小的庫還是可以考慮)。