環境:windowsserver2012+ sqlserver2014
發布機 192.168.1.43 KC-DB01
訂閱機 192.168.1.218 DB-Sync
SqlServer發布訂閱
基礎知識
經驗建議:
1.在裝系統后先把機器主機名、用戶名修改好(裝完數據庫后修改會嚴重影響發布訂閱),然后再安裝數據庫;ps:血與淚的教訓!
2.多個需要設置發布訂閱的的數據庫的sa用戶名密碼設置相同;(后來推送訂閱測試不需要)
一、准備工作
1.確保發布機、訂閱機器 Sql Server 代理 已經在運行並設置為自啟動;
2.保證 SqlServer的主機名和物理機的主機名相同;若不同請看后面問題記錄
3.確保發布機、訂閱機1433端口能相互連接(互通);
4.添加域名解析,一般配置文件在C:\Windows\System32\drivers\etc 在最后面添加解析,兩台機器都需要添加同樣的解析
192.168.1.43 KC-DB01
192.168.1.218 DB-Sync
最后通過ping KC-DB01測試是否能正常解析到前面的43IP;
二、創建發布
建立測試表
CREATE TABLE TB_1(Id int primary key,Name char(200),InsertTime datetime default getdate()) insert into TB_1 select isnull(max(id),0)+1,'a'+ltrim(isnull(max(id),0)+1),getdate() from TB_1 select * from TB_1
發布數據庫表增加sa權限
USE [KCMirrorDB] GO sp_changedbowner 'sa'
1、發布
選擇發布類型,自行選擇,區別下面有介紹,我們這里選擇“事物發布”
選擇要發布的項目
可以勾選一些表,也可以發布存儲過程視圖等,但是下面的這些不能發布,原因也有說明
右鍵表格屬性
其他選項默認
如果需要訂閱過去的表有索引和默認值:復制非聚集索引、復制默認值規范、復制默認值綁定同一改為True,如果沒有更改為True這樣訂閱服務器同步不了這些索引和默認值。
根據情況,勾選自己要發布的部分表后執行下一步,進入篩選表行選項,可以篩選以上選擇的表中不想同步的一些列,這里我們不篩選,直接下一步
取消立即創建快照並使用快照對訂閱進行初始化
這里先進入“快照代理-安全設置”按如下設置賬號密碼,然后同樣的設置日志讀取器代理
最后更改快照的存儲位置
右鍵剛創建的發布-屬性
自此sqlserver的發布完成
驗證發布正確性
發布完成后,查看發布是否成功、是否有錯誤;先確保發布成功,便於后面有問題時分析;
正在生成快照,說明發布沒有問題,等待快照生成完成;
2、訂閱
訂閱的形式可以選擇推送訂閱或者請求訂閱,請求訂閱降低分發服務器處理工作的開銷。只有在有很多訂閱服務器的時候才比較明顯,推送訂閱與請求訂閱更大的區別是在管理方面的不同;
這里推薦使用“推送訂閱”
2.1、請求訂閱
注意:請求訂閱,需要訂閱服務器有訪問發布服務器快照目錄的權限;
遠程登錄192.168.1.91機器
創建一個數據庫,用於訂閱同步到這個庫里;
選擇同步類型,(經過測試兩次使用請求訂閱都不成功,問題多多)
選擇同步到本地的數據庫(這個庫可以是個空庫,但若不是同庫,里面不能有和要同步的表相同的表)
然后沒啥重要步驟 下一步默認“連續運行” 下一步默認初始化時間“立即” 下一步 點擊完成
右鍵訂閱---查看同步狀態:
2.2、推送訂閱
推送訂閱與請求訂閱 下面的選項是不同的,注意
驗證訂閱是否成功
到發布機上查看發布訂閱狀態
然后再到訂閱機器上就可以看到剛才創建的訂閱了
在訂閱服務器上查看同步狀態
問題記錄
同步部分表時,如果同步視圖可能會導致同步失敗,因為視圖中可能有沒有同步的表,導致整體同步失敗;所以要注意同步視圖;
數據庫與主機名不一致
第一種情況下:
在SQL SERVER里面執行下面語句:
use master
go
select @@servername --查看數據庫里存的主機名
select serverproperty('servername')
使用上面的語句查詢服務器的名稱和實際計算機的名稱,如果兩者不一致,就需要修改。
不一致就執行下面的語句:
sp_dropserver 'WIN-43G4DVCEI6E'
go
sp_addserver 'WIN-F5','local'
修改完后,重啟SQL SERVER服務。
數據庫分離報錯“該數據庫正用於復制,不能刪除或不能分離”
解決辦法:到該數據庫下執行:sp_removedbreplication 'LiaoDB'
LiaoDB為該數據庫名;
發布報錯
錯誤消息
- 進程無法在“WIN-19G6EV4O1JP”上執行“sp_replcmds”。 (源: MSSQL_REPL,錯誤號: MSSQL_REPL20011)
獲取幫助: http://help/MSSQL_REPL20011 - 無法作為數據庫主體執行,因為主體 "dbo" 不存在、無法模擬這種類型的主體,或您沒有所需的權限。 (源: MSSQLServer,錯誤號: 15517)
獲取幫助: http://help/15517
進程無法在“WIN-19G6EV4O1JP”上執行“sp_replcmds”。 (源: MSSQL_REPL,錯誤號: MSSQL_REPL22037)
獲取幫助: http://help/MSSQL_REPL22037
解決辦法
https://www.cnblogs.com/gaizai/p/3305879.html
錯誤號:15517
進程無法在“WIN-XXX”上執行“sp_replcmds” 無法作為數據庫主體執行,因為主體 "dbo" 不存在、無法模擬這種類型的主體,或您沒有所需的權限。 (源: MSSQLServer,錯誤號: 15517
權限不夠,解決方法
ALTER AUTHORIZATION ON DATABASE::[數據庫名] TO [sa] ALTER AUTHORIZATION ON DATABASE::[數據庫名] TO [分發賬戶] USE 數據庫名 GO sp_changedbowner '分發賬戶'
ALTER AUTHORIZATION ON DATABASE::[LiaoDB] TO [sa] ALTER AUTHORIZATION ON DATABASE::[LiaoDB] TO [fabu] USE LiaoDB GO sp_changedbowner 'sa'
比如我的數據庫名稱為 test, 發布賬戶為sa,訂閱賬戶也為sa
ALTER AUTHORIZATION ON DATABASE::[test] TO [sa] USE test GO sp_changedbowner 'sa'
訂閱報錯
錯誤信息
2017-01-04 10:24:44.394 初始化
由於出現操作系統錯誤 3,進程無法讀取文件“E:\data_sync\unc\KC-DB01_KCMAINDB_FABU_KCMAINDB\20170104162525\GetMemberAccou4ce5f23b_109.pre”。
Category:OS
Source:
Number: 3
Message: 系統找不到指定的路徑。
解決辦法
主要原因就是訂閱服務器訪問訂閱目錄快照"D:\***假裝如上報錯路徑***_109.pre"失敗造成的。
解決方式:1
1.將存放快照的目錄設置為共享,並設置讀取的權限;
1)發布服務器設置:
在發布屬性中,點擊左側的快照,在右邊頁面中的快照文件的位置默認為E:\data_sync\把該文件夾設置為共享,並且在安全項里,設置用戶權限(我在系統添加了一個賬戶,並給這個賬戶訪問該文件夾權限)
2)訂閱服務器設置:
在訂閱服務器,右擊訂閱的服務名,選擇屬性,設置屬性參數如下
a.快照位置修改為備用文件夾
b.快照文件夾修改為 \\發布服務器的ip\repldata
然后通過命令輸入該路徑,回車會提示輸入賬戶密碼,輸入發布機創建的賬戶,並選擇記住密碼即可;最后在查看同步狀態中 停止同步,然后重新初始化,最后在同步狀態中啟動同步即可;
該方法參考鏈接:http://www.cnblogs.com/yf2011/p/5001326.html
解決辦法2.使用FTP驗證傳輸快照文件,之前步驟都一樣只是認證給訂閱服務器權限為ftp
參考鏈接:(測試過不好用,需要自己搭建ftp服務器)
https://help.aliyun.com/knowledge_detail/40772.html?spm=5176.7842542.2.14.Fqg2xX
解決方法3.請求訂閱改成推送訂閱;(該方式不需要訂閱機訪問發布機權限)
“此訂閱已存在”,但是在訂閱服務器上卻看不到該訂閱
解決:
到發布服務器的訂閱項目下,給當前訂閱刪除掉,再到訂閱服務器重新創建訂閱
單發布多訂閱
服務器A : testpush庫
服務器B、服務器C 訂閱服務器A 的testpush發布
在B、C上創建好訂閱之后,需要重啟服務器A 的 testpush庫的“日志快照”作業,以便生成新的發布快照
參考:
http://www.th7.cn/db/mssql/201802/263764.shtml
https://www.cnblogs.com/TeyGao/p/3521109.html
https://www.cnblogs.com/TeyGao/p/3521109.html