一、數據庫復制涉及
1、發布服務器:
數據的來源服務器,維護源數據,決定哪些數據將被分發,檢測哪些數據發生了修改,並將這些信息提交給分發服務器。
2、分發服務器:
分發服務器負責把從發布服務器拿來的數據傳送至訂閱服務器。
3、訂閱服務器:
訂閱服務器就是發布服務器數據的副本,接收維護數據。
4、訂閱類型
推訂閱
推訂閱是指由發布服務器將所有發生修改過的數據復制給訂閱者,這種在數據同步性價比較高的場合,推薦使用推訂閱。
拉訂閱
拉訂閱是指訂閱服務器在經過一段時間就會向發布服務器要求復制出版數據庫發生的變化的數據。
發布,分發,訂閱可以部署在獨立的服務器上面也可以部署在一台sql server 上面,然而分開部署肯定能提高性能。
二、復制代理:
1、快照代理
快照代理在分發者上創建並存儲快照文件,任務是:在分發數據庫中准備已發布表的架構和初始數據以及其他對象、存儲快照文件並記錄出版數據庫和訂閱服務器之間的同步信息,快照代理運行在分發者服務器上,並與出版者相連接。每一個出版物都有自己的快照代理。與各種類型的復制一起使用。
2、日志閱讀代理
日志讀取器代理與事務性復制一起使用。它將發布服務器上的事務日志中標記為復制的事務移至分發數據庫中。使用事務性復制發布的每個數據庫都有自己的日志讀取器代理,該代理運行於分發服務器上並與發布服務器連接(分發服務器與發布服務器可以是同一台計算機)。
3、分發代理
分發代理與快照復制和事務性復制一起使用。它將初始快照應用於訂閱服務器,並將分發數據庫中保存的事務移至訂閱服務器。分發代理既可以運行於分發服務器(對於推送訂閱),也可運行於訂閱服務器(對於請求訂閱)。
4、合並代理
合並代理與合並復制一起使用。它將初始快照應用於訂閱服務器,並移動和協調所發生的增量數據更改。每個合並訂閱都有自己的合並代理,該代理同時連接到發布服務器和訂閱服務器並對它們進行更新。合並代理既可以運行於分發服務器(對於推送訂閱),也可以運行於訂閱服務器(對於請求訂閱)。默認情況下,合並代理將訂閱服務器上的更改上載到發布服務器,然后將發布服務器上的更改下載到訂閱服務器。
5、隊列閱讀代理
隊列讀取器代理與包含排隊更新選項的事務性復制一起使用。該代理運行於分發服務器,並將訂閱服務器上所做更改移回至發布服務器。與分發代理和合並代理不同,只有一個隊列讀取器代理的實例為給定分發數據庫的所有發布服務器和發布提供服務。
三、復制類型:
SQL SEVER提供了三大類復制類型:快照復制、事務復制、合並復制。可以在實際應用中使用相應的復制類型,每一種復制類型都在不同程序上實現數據的一致性。
1、快照復制
如其名字所言,快照復制指在某一時刻給出版數據庫中的出版數據照相,然后將數據復制到訂閱者服務器。快照復制實現較為簡單,其所復制的只是某一時刻數據庫的瞬間數據,
快照復制是將整個出版物傳送給訂閱者,就是在某一時刻將出版數據進行一次“照相”,生成一個描述出版數據庫中數據的當前狀態的一個文件,然后在相應的時間將其復制到訂閱都的數據庫上,快照復制並不是不停的監視出版數據庫中發生的變化情況,它是對出版數據庫進行一次掃描,把所有出版數據中的數據從源數據庫送至目標數據庫,而不僅僅是變化的數據。如果數據量很大,那么要復制的數據就很多。因此對網絡資源要求很高,不僅要有較快的傳輸速度,而且要保證傳輸的可靠性。
快照復制是最為簡單的一種復制類型,能夠在出版者和訂閱者之間保證數據的一致性。快照復制通常使用在以下場合:
在一定時間內出現大量的更改的操作,但數據總量不大,變化周期較長。
2、 事務復制
快照復制是將整個數據集發送給訂閱服務器,由於體積大而造成復制周期較長,會形成復制滯后問題。那么事務復制使用事務日志來生成將復制到訂閱服務器的事務,因為它只復制事務也就是變化,所以滯后也比快照復制低得多,因為將不斷地在訂閱服務器處得到及時應用。
事務復制有三個組件:
快照代理,它生成架構,數據以及跟蹤復制過程所需的數據;
分發代理:它分發快照和隨后的命令;
日志讀取器代理:它讀取發布數據的事務日志。
在事務復制中,當出版數據庫發生變化時,這種變化就會立即傳遞給訂閱者。並在較短時間內完成(幾秒),而不是像快照復制那樣要經過很長一段時間間隔。因此,事務復制是一種接近實時地從源到目標分發數據的方法。由於某種原因事務復制的頻率較高。所以必須保證在訂閱者與出版者之間要有可靠的網絡連接。
3、合並復制
合並復制是為移動用戶設計的,可以在發布服務器或是訂閱服務器處執行修改,在合並代理運行時,這些修改將同步,多用於發布服務器與訂閱服務都修改數據的情況下。工作原理如下:在要復制的每個表上實現觸發器,並使用包含GUID列唯一標識要復制的表中的每一行。對其中的任何一個表進行修改時,都會將更改將記錄一個數據表中,在合並代理運行時,它收集數據表中的GUID,這些GUID指出了在發布服務器和訂閱服務器處修改過的行。對於只在發布服務器或是訂閱端修改的數據則直接進行相應操作,如INSERT,UPDATE,DELETE,如果雙方都有GUID則按照用戶指定的方式解決沖突,默認發布服務器伏先。
配置復制:
無論是快照復制,事務性復制還是合並復制,創建復制都要經過以下幾個步驟:
1. 創建發布服務器。選擇要發布的服務器。如果有條件的,也可以分發服務器,在這里我們就將發布服務器和分發服務器設置在同一台計算機上。
2. 不論是發布服務器還是訂閱服務器必須開啟代理服務。
3. 創建一個發布。即將需要的數據庫及對象發布出來。
4. 選擇一個適合自己的發布類型。
5. 設置復制代理及安全,即指定可以運行代理的用戶帳號。
創建可以使用此發布的訂閱服務器。
四、發布的具體過程如下:
發布訂閱用來做數據庫的讀寫分離,還是很好用的
當單台數據庫的壓力太大時,可以考慮這種方案,一主多從,主服務器的數據庫只管寫入,其他的數據庫都是只讀也是一種很好的方案
開始
我們選擇A服務器做為發布的服務器,
B服務器做為訂閱的服務器,
第一部分A服務器
選擇要A服務器,選擇 “復制”,“本地發布”,右鍵本地發布
如果是第一次會有如下,一直點下一步
注意:..\ ReplData這個文件夾是發布所在的文件夾,要保持訪問權限,當在c盤時,有時可能會出現無法訪問,我這里一般會給ReplData這個文件夾加上everyone權限
選擇要發布的數據庫
注意:這個數據庫要有過完整備份
選擇發布類型
注意:實時性高,數據量大的一般選擇事務發布比較好
一直點下一步
注意,這一步很關鍵
注意:1,不要用sa賬戶,單獨再新建一個sqlserver賬戶,而且要有該數據庫的db_owner權限,
我們來添加一個test賬戶 找到“安全性”,右鍵“登錄名”
點擊“用戶映射”更改一下test賬戶權限
這個test賬戶一定要有你即將要發布的數據庫的public和db_owner權限
然后:在B服務器上進行一模一樣添加test賬戶的操作,后面會用到
添加完成之后繼續發布,加上我們添加的Test賬戶
有個警告,說代理沒運行
找到sqlserver管理器,將代理運行起來,
,B服務器也進行相同的操作,保證sqlserver代理都是開着的
到這里還不夠
下一步,配置host,找到 A服務器文件 c:\windows\system32\drivers\etc下的hosts文件
在最后一行填上B服務器的ip 和主機名, 注意,ip和名字之間隔空格,這個ip可是是內網,也可以是公網
然后A服務器就完備了,沒啥事了,接下來配置B服務器,
第二部分,B服務器
在B服務器進行相同的操作主機上進行相同的添加host操作
將A服務器的ip 和主機名 添加到B服務器的hosts文件下面,
然后開始創建訂閱
選擇查找SqlServer服務器,這里服務器名稱寫A服務器的名稱,不能用ip,用剛才在hosts文件里面那個A服務器的主機名
使用sa或者剛才創建的test賬戶登錄,登錄成功后,會看到A服務器的發布
選擇上面的,推送訂閱,好處是便於集中管理
賬戶還用剛才創建的那個test
然后一直下一步,直到完成
創建完成
測試一下,在A服務器添加一條數據
可以看到,B服務器馬上也有了,刪除修改也會同步,到這里就全部成功
其他
在A服務器上面查看訂閱的狀況
右鍵當前的發布,“啟動復制監視器”
可以看到當前的狀況,
如果訂閱沒有成功,或者數據沒能同步,可以在這里看看日志,查找原因。
常見問題
1, 兩台主機的 1433端口互相不通
2, SqlServer Agent 代理沒有開啟
3, 沒有配置 hosts 文件中的ip和主機名映射
4, ReplData文件夾權限不足
轉自:
https://www.cnblogs.com/zhengcheng/p/4492423.html
https://www.cnblogs.com/jimsfriend/p/10436038.html
https://www.cnblogs.com/xuefy/p/12357194.html