MSSQL 資料同步主要透過資料庫複寫技術實現,該技術能將一組資料從單一來源複製到多個目標,確保分散在不同位置的資料自動同步更新,維持資料一致性。複寫架構包含五大核心元素:發行伺服器、訂閱伺服器、散發伺服器、發行集與發行項。
採用「發行/訂閱」模式:資料來源為發行伺服器,負責發布資料變更;散發伺服器內含散發資料庫,接收並暫存所有變更,再分發給訂閱伺服器。SQL Server 提供三種複寫類型:
展開發行伺服器 → 複寫 → 發行集 → 右鍵屬性 → 狀態 → 立即執行代理程式。排程設為每分鐘執行一次。檢查 C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\ 目錄下是否每分鐘產生以時間命名的資料夾,並確認訂閱端資料庫出現已發行的資料表。
適用於需精細控制同步邏輯或跨版本環境。核心步驟:
CREATE TABLE [user] (
id INT IDENTITY(1,1),
number VARCHAR(4),
name VARCHAR(10),
state BIT -- NULL=新增, 1=修改, 0=已同步
)
CREATE TRIGGER t_state ON [user]
AFTER UPDATE
AS
UPDATE [user] SET state = 1
FROM [user] a JOIN inserted b ON a.id = b.id
WHERE a.state IS NOT NULL
EXEC sp_addlinkedserver 'srv_lnk', '', 'SQLOLEDB', 'xz'
EXEC sp_addlinkedsrvlogin 'srv_lnk', 'false', NULL, 'sa', ''
CREATE PROC p_synchro
AS
-- 同步刪除
DELETE FROM srv_lnk.test.dbo.[user]
WHERE id NOT IN (SELECT id FROM [user])
-- 同步新增
INSERT INTO srv_lnk.test.dbo.[user]
SELECT id, number, name FROM [user] WHERE state IS NULL
-- 同步修改
UPDATE srv_lnk.test.dbo.[user] SET
number = b.number, name = b.name
FROM srv_lnk.test.dbo.[user] a
JOIN [user] b ON a.id = b.id
WHERE b.state = 1
-- 重設本地旗標
UPDATE [user] SET state = 0 WHERE ISNULL(state, 1) = 1
EXEC msdb..sp_add_job @job_name = '資料同步'
EXEC msdb..sp_add_jobstep @job_name = '資料同步', @step_name = '執行同步',
@subsystem = 'TSQL', @command = 'EXEC p_synchro',
@retry_attempts = 5, @retry_interval = 5
EXEC msdb..sp_add_jobschedule @job_name = '資料同步', @name = '每分鐘',
@freq_type = 4, @freq_interval = 1, @active_start_time = 0
此方案透過 state 欄位追蹤變更,配合連結伺服器跨伺服器操作,適合無法使用原生複寫或需自訂衝突解決邏輯的場景。