一、概念簡介
1.1、基本概念
1)讀寫分離概念:是把對數據庫的讀操作和寫操作分離開。在一定程度上,讀寫分離可以緩解讀寫操作並發時產生鎖的問題。
2)讀寫分離原理:是讓主數據庫處理事務性增、刪、改操作(INSERT、DELETE、UPDATE),而從數據庫處理查詢操作(SELECT)。
1.2、技術簡介
SQL Server提供了三種技術來實現讀寫分離,分別是:日志傳送、事務復制、Always On。以下是三種技術的比較:
日志傳送 | 事務復制 | Always On | |
原理 | 通過SQL Server Agent調度作業進行日志 的備份、復制、還原實現同步 |
由復制代理同步發布數據上的 增刪改操作到訂閱服務器 |
主數據庫的事務日志記錄發送並 運用到每個輔助數據庫 |
版本功能支持 | SQL Server 2000 企業版 SQL Server 2005 及以后標准版、企業版 |
標准版、企業版 | SQL Server 2012 企業版 |
操作系統要求 | 無限制 | 無限制 | Windows 企業版 故障轉移群集 |
限制 | 要求數據庫必須是完整恢復模式 | 要求表必須有主鍵 | 要求數據庫必須是完整恢復模式 |
同步粒度 | 數據庫級 | 表級 | 數據庫級 |
數據差異 | 取決於備份、復制、還原的作業設置 | 幾秒 | 幾秒 |
副本數量 | 無限制 | 無限制 | 4個 |
副本讀取 | 間歇性,在還原時會中斷查詢。 | 正常 | 正常 |
自動故障轉移 | 不支持 | 不支持 | 支持 |
事務復制沒有Always On的要求那么高,只需要主從服務器能通過TCP進行通訊即可,主從服務器操作系統和SQL Server版本可以不完全一致(生產環境建議一致),同時,主從服務器也不需要加入域。
注:本文主從同步實現方式采用事務復制方式。
二、實戰准備
2.1、網絡環境
1)主從服務器最好在同一個局域網內,而且要互相ping得通,可以是不同網段。
2)以下是本文的測試環境:
計算機名 | IP地址 | 操作系統 | 數據庫 | |
主服務器 | IT01 | 192.168.2.174 | Windows 10 | SQL Server 2016 |
從服務器 | HW01 | 192.168.2.242 | Windows Server 2012 | SQL Server 2016 |
2.2、數據庫主機名
1)SQL Server數據庫實例主機名需與本地服務器名稱一致:
--本地服務器名稱 SELECT @@SERVERNAME --數據庫實例主機名 SELECT SERVERPROPERTY('ServerName')
2)若出現SQL Server數據庫實例主機名與本地服務器名稱不一致的情況,可通過以下語句來更改:
IF (SERVERPROPERTY('SERVERNAME')<>@@SERVERNAME) BEGIN DECLARE @SERVER SYSNAME SET @SERVER=@@SERVERNAME EXEC SP_DROPSERVER @SERVER=@SERVER SET @SERVER=CAST(SERVERPROPERTY('SERVERNAME') AS SYSNAME) EXEC SP_ADDSERVER @SERVER=@SERVER,@LOCAL='LOCAL' END
更改完成后請重啟SQL Server服務:
2.3、同步賬號
主從服務器都需要建立一個賬號及密碼都相同的本地管理員用戶如sync:
2.4、SQL Server 代理
主從服務器都需要啟動SQL Server代理,另外登錄賬號都設為同步賬號如sync:
2.5、同步說明
1)以數據庫AdventureWorks為例。
2)在AdventureWorks上執行以下SQL語句,否則后續會出現【進程無法在“IT01”上執行“sp_replcmds”】報錯。
sys.sp_changedbowner 'sa'
3)主從搭建,實際是發布->分發->訂閱的過程。本文發布與分發使用的是同一台服務器IT01。
2.6、同步規則
1)新增的表一定要有主鍵,否則不能進行同步。
2)從庫上一定不能有任何的數據修改,這個原則一定要遵守。
三、實戰操作
3.1、分發配置
1)在IT01主服務器上,對着SQL Server的"復制"右鍵->點擊"配置分發"。
2)點擊"下一步"。
3)默認選擇,點擊"下一步"。
4)快照文件夾應使用網絡路徑,因此要先設置文件夾共享。
5)打開"D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL"->對着"repldata"文件夾"右鍵"->點擊"屬性"。
6)選擇"共享"頁簽->點擊"共享"。
7)添加"Everyone"用戶。
8)授予"Everyone"用戶"讀取/寫入"權限->點擊"共享"。
9)共享成功后,在快照文件夾中輸入網絡路徑"\\IT01\ReplData",點擊"下一步"。
10)默認選擇,點擊"下一步"。
11)默認選擇,點擊"下一步"。
12)默認選擇,點擊"下一步"。
13)點擊"完成"。
14)完成后,點擊"關閉"即可。
3.2、發布配置
1)在IT01主服務器上,點擊SQL Server的"復制"->對着"本地發布"右鍵->點擊"新建發布"。
2)點擊"下一步"。
3)選擇要發布的數據庫如"AdventureWorks"->點擊"下一步"。
4)選擇"事務發布"->點擊"下一步"。
5)選擇要發布的對象如"表"(也可以選擇某個具體表)->點擊"下一步"。
6)默認選擇,點擊"下一步"。
7)勾選"立即創建快照並使快照保持可用狀態,以初始化訂閱"->點擊"下一步"。
8)點擊"安全設置"。
9)由於本測試環境為非域環境,因此只能選擇"在 SQL Server 代理服務賬號下運行"。同時,錄入SQL Server登錄名及密碼,點擊"確定"。
10)點擊"下一步"。
11)默認選擇,點擊"下一步"。
12)起個發布名稱,點擊"完成"。
13)執行成功后,點擊"關閉"即可。
14)對着發布名稱"右鍵"->點擊"屬性"。
15)點擊"快照"->取消勾選"將文件放入默認文件夾",勾選"將文件放入下列文件夾",並錄入網絡地址"\\IT01\ReplData"->點擊"確定"。
3.3、訂閱配置
1)在HW01從服務器上打開運行->輸入"\\IT01"。
2)確保能正常訪問主服務上的共享文件夾"repldata"。
3)對着數據庫"右鍵"->選擇"新建數據庫"。
4)輸入數據庫名如"AdventureWorks"->點擊"確定"。
5)打開"復制",對着本地訂閱"右鍵"->點擊"新建訂閱"。
6)默認選擇,點擊"下一步"。
7)在下拉框中選擇"查找 SQL Server 發布服務器..."。
8)輸入主服務器名稱及身份驗證,同時勾選"記住密碼",最后點擊"連接"。
9)默認選擇,點擊"下一步"。
10)選擇"在其訂閱服務器上運行每個代理(請求訂閱)"->點擊"下一步"。
11)選擇訂閱數據庫"AdventureWorks"->點擊"下一步"。
12)點擊"..." 。
13)選擇"在 SQL Server 代理服務賬戶下運行"->輸入連接到分發服務器的登錄賬號及密碼->點擊"確定"。
14)點擊"下一步"。
15)選擇"連續運行"->點擊"下一步"。
16)初始化時間選擇"立即"->點擊"下一步"。
17)默認選擇,點擊"下一步"。
18)點擊完成。
19)創建成功后,點擊"關閉"。
20)對着訂閱名稱"右鍵"->點擊"屬性"。
22)在快照項中,快照位置選擇"備份文件夾"->快照文件夾輸入"\\IT01\repldata"->點擊"確定"。
四、異常檢查
1)對着發布名稱"右鍵"->點擊"啟動復制監視器"。
2)記錄行"右鍵",可以"停止代理"再"啟動代理",這樣就可以發現執行過程中的報錯。也可以點擊"查看詳細信息",查看執行的過程日志等。
五、新增項目內容
1)假如有新的表或其它新的項目內容需要同步,可以對着發布名稱"右鍵"->點擊"屬性"。
2)選擇"項目"->勾選新增的表等項目內容->點擊"確定"。
3)對着發布名稱"右鍵"->點擊"查看快照代理狀態"。
4)點擊"啟動"。
六、刪除發布服務器上的主從復制
1)先刪除發布服務器上的訂閱和發布。
2)執行以下命令,刪除distribution分發數據庫。
USE master GO EXEC sp_dropdistributiondb @database=N'distribution' GO EXEC sp_dropdistributor @no_checks=1,@ignore_distributor=1 GO