經(jīng)過(guò)測(cè)試,可以順利實(shí)現(xiàn)數(shù)據(jù)庫(kù)結(jié)構(gòu)的初始化和數(shù)據(jù)的單向同步(也就是訂閱服務(wù)器的數(shù)據(jù)可以及時(shí)更新為發(fā)布服務(wù)器的數(shù)據(jù))。
準(zhǔn)備工作:
>>數(shù)據(jù)的同步中主要考慮的三部分,可以理解成三臺(tái)主機(jī)。發(fā)布服務(wù)器,分發(fā)服務(wù)器和訂閱服務(wù)器;可以從字面的意思理解,要實(shí)現(xiàn)的功能實(shí)際就是讓訂閱服務(wù)器通過(guò)分發(fā)服務(wù)器保持?jǐn)?shù)據(jù)及時(shí)地和發(fā)布服務(wù)器上的數(shù)據(jù)一致。整個(gè)執(zhí)行過(guò)程是這樣一來(lái)的:
a.訂閱服務(wù)器應(yīng)該有個(gè)初始化,一般來(lái)說(shuō)我們開(kāi)始做這個(gè)同步任務(wù)的時(shí)候,發(fā)布服務(wù)器已經(jīng)有了相當(dāng)?shù)臄?shù)據(jù)量了,而我們的訂閱服務(wù)器應(yīng)該是新建的服務(wù)。即使發(fā)布中沒(méi)有數(shù)據(jù),也需要把他的數(shù)據(jù)庫(kù)結(jié)構(gòu)初始化到訂閱服務(wù)器上。
b.我采用的是事物復(fù)制,發(fā)布服務(wù)器的數(shù)據(jù)發(fā)生變化后,相當(dāng)于觸發(fā)了一個(gè)更新操作,而事物復(fù)制可以在設(shè)定的時(shí)間把數(shù)據(jù)更新的操作更新到訂閱服務(wù)器中去。當(dāng)然,這個(gè)操作需要經(jīng)過(guò)分發(fā)服務(wù)器。在我的測(cè)試中,我是把發(fā)布服務(wù)器和分發(fā)服務(wù)器設(shè)置為同一臺(tái)主機(jī),可以順利實(shí)現(xiàn)數(shù)據(jù)在數(shù)分鐘內(nèi)同步。
>>在操作的起始,需要考慮訂閱服務(wù)器是否有和發(fā)布服務(wù)器相同結(jié)構(gòu)的數(shù)據(jù)庫(kù),如果有,需要做的就是使用代理把發(fā)布服務(wù)器現(xiàn)有的數(shù)據(jù)初始化過(guò)去;如果沒(méi)有對(duì)應(yīng)的相同結(jié)構(gòu)的數(shù)據(jù)庫(kù),就需要要把發(fā)布服務(wù)器當(dāng)前的數(shù)據(jù)庫(kù)結(jié)構(gòu)和當(dāng)前的數(shù)據(jù)都初始化到訂閱服務(wù)器中。當(dāng)然這里所說(shuō)的操作都是在下面的實(shí)施步驟中實(shí)現(xiàn),不需要單獨(dú)處理。
>>如果說(shuō)對(duì)Windows系統(tǒng)有所要求的話,就應(yīng)該保證這三個(gè)服務(wù)器(發(fā)布,分發(fā),訂閱)在同個(gè)域中,以同一個(gè)域管理員帳號(hào)身份運(yùn)行,操作如下:
a.進(jìn)入相應(yīng)的服務(wù)器,控制面板->服務(wù)->SQLSERVERAGENT,設(shè)置登錄,三臺(tái)服務(wù)器同樣設(shè)置。
b.操作前,也不允許這三臺(tái)服務(wù)器對(duì)應(yīng)的別名使用呢稱,比如"LOCAL",這樣的別名要?jiǎng)h除重建,可以采用主機(jī)名,比如:server02.
下面開(kāi)始執(zhí)行數(shù)據(jù)庫(kù)同步的操作:
>>配置發(fā)布服務(wù)器和分發(fā)服務(wù)器:
a.選中對(duì)應(yīng)服務(wù)器的注冊(cè)名->工具->復(fù)制->配置發(fā)布、訂閱和分發(fā),直接按照默認(rèn)設(shè)置向下執(zhí)行,直到完成。關(guān)閉。
b.再一次選中這個(gè)服務(wù)器服務(wù)器的注冊(cè)名->工具->復(fù)制->配置發(fā)布、訂閱和分發(fā),可以看到這次界面和步驟a中的界面有所不同,我們只需要配置一下 發(fā)布服務(wù)器,發(fā)布數(shù)據(jù)庫(kù),訂閱服務(wù)器。(我的發(fā)布數(shù)據(jù)庫(kù)采用的是事物性的)。點(diǎn)“確定”完成操作。<標(biāo)記P>
>>創(chuàng)建發(fā)布,可以選中相應(yīng)的注冊(cè),用工具->復(fù)制->創(chuàng)建和管理發(fā)布或者在該注冊(cè)下面的 復(fù)制->發(fā)布內(nèi)容 選中后,在右邊空白處,右鍵,新建發(fā)布,來(lái)創(chuàng)建你的發(fā)布。我選擇的是事物發(fā)布,按照默認(rèn)設(shè)置,選擇你要發(fā)布的表或其他對(duì)象,其他地方不需要修改,直到完成操作。
>>修改發(fā)布屬性:選擇“狀態(tài)”->立即運(yùn)行代理程序;代理程序?qū)傩?>設(shè)置你的調(diào)度,比如一分鐘一次。(調(diào)度->編輯->更改;通知->寫(xiě)入windows應(yīng)用程序事件日志),"確定"完成操作。
>>創(chuàng)建訂閱:選擇發(fā)布服務(wù)器對(duì)應(yīng)的注冊(cè),復(fù)制->發(fā)布內(nèi)容->在這個(gè)內(nèi)容上右鍵,強(qiáng)制新訂閱,->"下一步",選擇訂閱服務(wù)器(在標(biāo)記P那一步選擇的訂閱服務(wù)器)->“下一步”->選擇你有的數(shù)據(jù)庫(kù),或者新建一個(gè)數(shù)據(jù)庫(kù)
->"下一步"-> 修改你需要的調(diào)度->按照默認(rèn)設(shè)置,直到完成。
到這里就可以完成了,修改發(fā)布服務(wù)器數(shù)據(jù)庫(kù)中的內(nèi)容,等一兩分鐘,數(shù)據(jù)就同步到訂閱服務(wù)器中了。不過(guò)由于第一次執(zhí)行需要快照,如果發(fā)布庫(kù)中有一定的內(nèi)容,第一次執(zhí)行可能需要幾分鐘時(shí)間。如果數(shù)據(jù)不能同步過(guò)去,大家是調(diào)度設(shè)置時(shí)間太短(比如1分鐘)使快照不能完成,所以后面的步驟無(wú)法執(zhí)行,遇到這樣的情況的話,
選中你發(fā)布的內(nèi)容,設(shè)置屬性,在“狀態(tài)”中“立即運(yùn)行代理程序”,這樣的話,數(shù)據(jù)會(huì)馬上同步過(guò)去的。
利用數(shù)據(jù)庫(kù)復(fù)制技術(shù) 實(shí)現(xiàn)數(shù)據(jù)同步更新
復(fù)制的概念
復(fù)制是將一組數(shù)據(jù)從一個(gè)數(shù)據(jù)源拷貝到多個(gè)數(shù)據(jù)源的技術(shù),是將一份數(shù)據(jù)發(fā)布到多個(gè)存儲(chǔ)站點(diǎn)上的有效方式。使用復(fù)制技術(shù),用戶可以將一份數(shù)據(jù)發(fā)布到多臺(tái)服務(wù)器上,從而使不同的服務(wù)器用戶都可以在權(quán)限的許可的范圍內(nèi)共享這份數(shù)據(jù)。復(fù)制技術(shù)可以確保分布在不同地點(diǎn)的數(shù)據(jù)自動(dòng)同步更新,從而保證數(shù)據(jù)的一致性。
SQL復(fù)制的基本元素包括
出版服務(wù)器、訂閱服務(wù)器、分發(fā)服務(wù)器、出版物、文章
SQL復(fù)制的工作原理
SQL SERVER 主要采用出版物、訂閱的方式來(lái)處理復(fù)制。源數(shù)據(jù)所在的服務(wù)器是出版服務(wù)器,負(fù)責(zé)發(fā)表數(shù)據(jù)。出版服務(wù)器把要發(fā)表的數(shù)據(jù)的所有改變情況的拷貝復(fù)制到分發(fā)服務(wù)器,分發(fā)服務(wù)器包含有一個(gè)分發(fā)數(shù)據(jù)庫(kù),可接收數(shù)據(jù)的所有改變,并保存這些改變,再把這些改變分發(fā)給訂閱服務(wù)器
SQL SERVER復(fù)制技術(shù)類型
SQL SERVER提供了三種復(fù)制技術(shù),分別是:
1、快照復(fù)制(呆會(huì)我們就使用這個(gè))
2、事務(wù)復(fù)制
3、合并復(fù)制
只要把上面這些概念弄清楚了那么對(duì)復(fù)制也就有了一定的理解。接下來(lái)我們就一步一步來(lái)實(shí)現(xiàn)復(fù)制的步驟。
第一先來(lái)配置出版服務(wù)器
(1)選中指定[服務(wù)器]節(jié)點(diǎn)
(2)從[工具]下拉菜單的[復(fù)制]子菜單中選擇[發(fā)布、訂閱服務(wù)器和分發(fā)]命令
(3)系統(tǒng)彈出一個(gè)對(duì)話框點(diǎn)[下一步]然后看著提示一直操作到完成。
(4)當(dāng)完成了出版服務(wù)器的設(shè)置以后系統(tǒng)會(huì)為該服務(wù)器的樹(shù)形結(jié)構(gòu)中添加一個(gè)復(fù)制監(jiān)視器。同時(shí)也生成一個(gè)分發(fā)數(shù)據(jù)庫(kù)(distribution)
第二創(chuàng)建出版物
(1)選中指定的服務(wù)器
(2)從[工具]菜單的[復(fù)制]子菜單中選擇[創(chuàng)建和管理發(fā)布]命令。此時(shí)系統(tǒng)會(huì)彈出一個(gè)對(duì)話框
(3)選擇要?jiǎng)?chuàng)建出版物的數(shù)據(jù)庫(kù),然后單擊[創(chuàng)建發(fā)布]
(4)在[創(chuàng)建發(fā)布向?qū)的提示對(duì)話框中單擊[下一步]系統(tǒng)就會(huì)彈出一個(gè)對(duì)話框。對(duì)話框上的內(nèi)容是復(fù)制的三個(gè)類型。我們現(xiàn)在選第一個(gè)也就是默認(rèn)的快照發(fā)布(其他兩個(gè)大家可以去看看幫助)
(5)單擊[下一步]系統(tǒng)要求指定可以訂閱該發(fā)布的數(shù)據(jù)庫(kù)服務(wù)器類型,SQLSERVER允許在不同的數(shù)據(jù)庫(kù)如 Oracle或access之間進(jìn)行數(shù)據(jù)復(fù)制。但是在這里我們選擇運(yùn)行"SQL SERVER 2000"的數(shù)據(jù)庫(kù)服務(wù)器
(6)單擊[下一步]系統(tǒng)就彈出一個(gè)定義文章的對(duì)話框也就是選擇要出版的表
(7)然后[下一步]直到操作完成。當(dāng)完成出版物的創(chuàng)建后創(chuàng)建出版物的數(shù)據(jù)庫(kù)也就變成了一個(gè)共享數(shù)據(jù)庫(kù)。
第三設(shè)計(jì)訂閱
(1)選中指定的訂閱服務(wù)器
(2)從[工具]下拉菜單中選擇[復(fù)制]子菜單的[請(qǐng)求訂閱]
(3)按照單擊[下一步]操作直到系統(tǒng)會(huì)提示檢查SQL SERVER代理服務(wù)的運(yùn)行狀態(tài),執(zhí)行復(fù)制操作的前提條件是SQL SERVER代理服務(wù)必須已經(jīng)啟動(dòng)。
(4)單擊[完成]。完成訂閱操作。
完成上面的步驟其實(shí)復(fù)制也就是成功了。但是如何來(lái)知道復(fù)制是否成功了呢?這里可以通過(guò)這種方法來(lái)快速看是否成功。展開(kāi)出版服務(wù)器下面的復(fù)制——發(fā)布內(nèi)容——右鍵發(fā)布內(nèi)容——屬性——擊活——狀態(tài)然后點(diǎn)立即運(yùn)行代理程序接著點(diǎn)代理程序?qū)傩該艋钫{(diào)度把調(diào)度設(shè)置為每一天發(fā)生,每一分鐘,在0:00:00和23:59:59之間。接下來(lái)就是判斷復(fù)制是否成功了打開(kāi)C:/PRogram Files/Microsoft SQL Server/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面看是不是有一些以時(shí)間做為文件名的文件夾差不多一分中就產(chǎn)生一個(gè)。要是你還不信的話就打開(kāi)你的數(shù)據(jù)庫(kù)看在訂閱的服務(wù)器的指定訂閱數(shù)據(jù)庫(kù)下看是不是看到了你剛才所發(fā)布的表—
一個(gè)手工同步的方案
--定時(shí)同步服務(wù)器上的數(shù)據(jù)
--例子:
--測(cè)試環(huán)境,SQL Server2000,遠(yuǎn)程服務(wù)器名:xz,用戶名為:sa,無(wú)密碼,測(cè)試數(shù)據(jù)庫(kù):test
--服務(wù)器上的表(查詢分析器連接到服務(wù)器上創(chuàng)建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go
--以下在局域網(wǎng)(本機(jī)操作)
--本機(jī)的表,state說(shuō)明:null 表示新增記錄,1 表示修改過(guò)的記錄,0 表示無(wú)變化的記錄
if exists (select * from dbo.sysobjects where id = object_id(N’[user]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go
--創(chuàng)建觸發(fā)器,維護(hù)state字段的值
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
go
--為了方便同步處理,創(chuàng)建鏈接服務(wù)器到要同步的服務(wù)器
--這里的遠(yuǎn)程服務(wù)器名為:xz,用戶名為:sa,無(wú)密碼
if exists(select 1 from master..sysservers where srvname=’srv_lnk’)
exec sp_dropserver ’srv_lnk’,’droplogins’
go
exec sp_addlinkedserver ’srv_lnk’,’’,’SQLOLEDB’,’xz’
exec sp_addlinkedsrvlogin ’srv_lnk’,’false’,null,’sa’
go
--創(chuàng)建同步處理的存儲(chǔ)過(guò)程
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_synchro]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
--set XACT_ABORT on
--啟動(dòng)遠(yuǎn)程服務(wù)器的MSDTC服務(wù)
--exec master..xp_cmdshell ’isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ’’net start msdtc’’,no_output"’,no_output
--啟動(dòng)本機(jī)的MSDTC服務(wù)
--exec master..xp_cmdshell ’net start msdtc’,no_output
--進(jìn)行分布事務(wù)處理,如果表用標(biāo)識(shí)列做主鍵,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
--同步刪除的數(shù)據(jù)
delete from srv_lnk.test.dbo.[user]
where id not in(select id from [user])
--同步新增的數(shù)據(jù)
insert into srv_lnk.test.dbo.[user]
select id,number,name from [user] where state is null
--同步修改的數(shù)據(jù)
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
--同步后更新本機(jī)的標(biāo)志
update [user] set state=0 where isnull(state,1)=1
--COMMIT TRAN
修改這項(xiàng)參數(shù),需要重新啟動(dòng)MSSQLserver和Sqlserveragent服務(wù)才能生效。
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)18482、18483錯(cuò)誤了。
3、檢查SQL Server企業(yè)管理器里面相關(guān)的幾臺(tái)SQL Server注冊(cè)名是否和上面第二點(diǎn)里介紹的srvname一樣
不能用ip地址的注冊(cè)名。
(我們可以刪掉IP地址的注冊(cè),新建以SQL Server管理員級(jí)別的用戶注冊(cè)的服務(wù)器名)
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)14010、20084、18456、18482、18483錯(cuò)誤了。
4、檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器網(wǎng)絡(luò)是否能夠正常訪問(wèn)
如果ping主機(jī)IP地址可以,但ping主機(jī)名不通的時(shí)候,需要在
winnt/system32/drivers/etc/hosts (WIN2000)
windows/system32/drivers/etc/hosts (WIN2003)
文件里寫(xiě)入數(shù)據(jù)庫(kù)服務(wù)器IP地址和主機(jī)名的對(duì)應(yīng)關(guān)系。
或者在SQL Server客戶端網(wǎng)絡(luò)實(shí)用工具里建立別名,例如:
5、系統(tǒng)需要的擴(kuò)展存儲(chǔ)過(guò)程是否存在(如果不存在,需要恢復(fù)):
接下來(lái)就可以用SQL Server企業(yè)管理器里[復(fù)制]-> 右鍵選擇
->[配置發(fā)布、訂閱服務(wù)器和分發(fā)]的圖形界面來(lái)配置數(shù)據(jù)庫(kù)復(fù)制了。
下面是按順序列出配置復(fù)制的步驟:
一、建立發(fā)布和分發(fā)服務(wù)器
[歡迎使用配置發(fā)布和分發(fā)向?qū)->[選擇分發(fā)服務(wù)器]
->[使"@servername"成為它自己的分發(fā)服務(wù)器,SQL Server將創(chuàng)建分發(fā)數(shù)據(jù)庫(kù)和日志]
->[制定快照文件夾]-> [自定義配置] -> [否,使用下列的默認(rèn)配置] -> [完成]
上述步驟完成后, 會(huì)在當(dāng)前"@servername" SQL Server數(shù)據(jù)庫(kù)里建立了一個(gè)distribion庫(kù)和
一個(gè)distributor_admin管理員級(jí)別的用戶(我們可以任意修改密碼)
服務(wù)器上新增加了四個(gè)作業(yè):
[ 代理程序歷史記錄清除: distribution ]
[ 分發(fā)清除: distribution ]
[ 復(fù)制代理程序檢查 ]
[ 重新初始化存在數(shù)據(jù)驗(yàn)證失敗的訂閱 ]
SQL Server企業(yè)管理器里多了一個(gè)復(fù)制監(jiān)視器, 當(dāng)前的這臺(tái)機(jī)器就可以發(fā)布、分發(fā)、訂閱了。
我們?cè)俅卧赟QL Server企業(yè)管理器里[復(fù)制]-> 右鍵選擇
->[配置發(fā)布、訂閱服務(wù)器和分發(fā)],可以看到類似下圖:
我們可以在 [發(fā)布服務(wù)器和分發(fā)服務(wù)器的屬性] 窗口
-> [發(fā)布服務(wù)器] -> [新增] -> [確定]
-> [發(fā)布數(shù)據(jù)庫(kù)] -> [事務(wù)]/[合并] -> [確定]
-> [訂閱服務(wù)器] -> [新增] -> [確定]
把網(wǎng)絡(luò)上的其它SQL Server服務(wù)器添加成為發(fā)布或者訂閱服務(wù)器.
新增一臺(tái)發(fā)布服務(wù)器的選項(xiàng):
我這里新建立的JIN001發(fā)布服務(wù)器是用管理員級(jí)別的數(shù)據(jù)庫(kù)用戶test連接的,
到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框, 默認(rèn)的是選中的,
在新建的JIN001發(fā)布服務(wù)器上建立和分發(fā)服務(wù)器FENGYU/FENGYU的鏈接的時(shí)需要輸入distributor_admin用戶的密碼
到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框,也可以不選,
也就是不需要密碼來(lái)建立發(fā)布到分發(fā)服務(wù)器的鏈接(這當(dāng)然欠缺安全,在測(cè)試環(huán)境下可以使用)
二、新建立的網(wǎng)絡(luò)上另一臺(tái)發(fā)布服務(wù)器(例如JIN001)選擇分發(fā)服務(wù)器
[歡迎使用配置發(fā)布和分發(fā)向?qū)->[選擇分發(fā)服務(wù)器]
-> 使用下列服務(wù)器(選定的服務(wù)器必須已配置為分發(fā)服務(wù)器) -> [選定服務(wù)器](例如FENGYU/FENGYU)
-> [下一步] -> [輸入分發(fā)服務(wù)器(例如FENGYU/FENGYU)的distributor_admin用戶的密碼兩次]
-> [下一步] -> [自定義配置] -> [否,使用下列的默認(rèn)配置]
-> [下一步] -> [完成] -> [確定]
建立一個(gè)數(shù)據(jù)庫(kù)復(fù)制發(fā)布的過(guò)程:
[復(fù)制] -> [發(fā)布內(nèi)容] -> 右鍵選擇 -> [新建發(fā)布]
-> [下一步] -> [選擇發(fā)布數(shù)據(jù)庫(kù)] -> [選中一個(gè)待發(fā)布的數(shù)據(jù)庫(kù)]
-> [下一步] -> [選擇發(fā)布類型] -> [事務(wù)發(fā)布]/[合并發(fā)布]
-> [下一步] -> [指定訂閱服務(wù)器的類型] -> [運(yùn)行SQL Server 2000的服務(wù)器]
-> [下一步] -> [指定項(xiàng)目] -> [在事務(wù)發(fā)布中只可以發(fā)布帶主鍵的表] -> [選中一個(gè)有主鍵的待發(fā)布的表]
->[在合并發(fā)布中會(huì)給表增加唯一性索引和 ROWGUIDCOL 屬性的唯一標(biāo)識(shí)符字段[rowguid],默認(rèn)值是newid()]
(添加新列將: 導(dǎo)致不帶列列表的 INSERT 語(yǔ)句失敗,增加表的大小,增加生成第一個(gè)快照所要求的時(shí)間)
->[選中一個(gè)待發(fā)布的表]
-> [下一步] -> [選擇發(fā)布名稱和描述] ->
-> [下一步] -> [自定義發(fā)布的屬性] -> [否,根據(jù)指定方式創(chuàng)建發(fā)布]
-> [下一步] -> [完成] -> [關(guān)閉]
發(fā)布屬性里有很多有用的選項(xiàng):設(shè)定訂閱到期(例如24小時(shí))
設(shè)定發(fā)布表的項(xiàng)目屬性:
常規(guī)窗口可以指定發(fā)布目的表的名稱,可以跟原來(lái)的表名稱不一樣。
下圖是命令和快照窗口的欄目
( SQL Server 數(shù)據(jù)庫(kù)復(fù)制技術(shù)實(shí)際上是用insert,update,delete操作在訂閱服務(wù)器上重做發(fā)布服務(wù)器上的事務(wù)操作
看文檔資料需要把發(fā)布數(shù)據(jù)庫(kù)設(shè)成完全恢復(fù)模式,事務(wù)才不會(huì)丟失
但我自己在測(cè)試中發(fā)現(xiàn)發(fā)布數(shù)據(jù)庫(kù)是簡(jiǎn)單恢復(fù)模式下,每10秒生成一些大事務(wù),10分鐘后再收縮數(shù)據(jù)庫(kù)日志,
這期間發(fā)布和訂閱服務(wù)器上的作業(yè)都暫停,暫停恢復(fù)后并沒(méi)有丟失任何事務(wù)更改 )
發(fā)布表可以做數(shù)據(jù)篩選,例如只選擇表里面的部分列:
例如只選擇表里某些符合條件的記錄, 我們可以手工編寫(xiě)篩選的SQL語(yǔ)句:
發(fā)布表的訂閱選項(xiàng),并可以建立強(qiáng)制訂閱:
成功建立了發(fā)布以后,發(fā)布服務(wù)器上新增加了一個(gè)作業(yè): [ 失效訂閱清除 ]
分發(fā)服務(wù)器上新增加了兩個(gè)作業(yè):
[ JIN001-dack-dack-5 ] 類型[ REPL快照 ]
[ JIN001-dack-3 ] 類型[ REPL日志讀取器 ]
上面藍(lán)色字的名稱會(huì)根據(jù)發(fā)布服務(wù)器名,發(fā)布名及第幾次發(fā)布而使用不同的編號(hào)
REPL快照作業(yè)是SQL Server復(fù)制的前提條件,它會(huì)先把發(fā)布的表結(jié)構(gòu),數(shù)據(jù),索引,約束等生成到發(fā)布服務(wù)器的OS目錄下文件
(當(dāng)有訂閱的時(shí)候才會(huì)生成, 當(dāng)訂閱請(qǐng)求初始化或者按照某個(gè)時(shí)間表調(diào)度生成)
REPL日志讀取器在事務(wù)復(fù)制的時(shí)候是一直處于運(yùn)行狀態(tài)。(在合并復(fù)制的時(shí)候可以根據(jù)調(diào)度的時(shí)間表來(lái)運(yùn)行)
建立一個(gè)數(shù)據(jù)庫(kù)復(fù)制訂閱的過(guò)程:
[復(fù)制] -> [訂閱] -> 右鍵選擇 -> [新建請(qǐng)求訂閱]
-> [下一步] -> [查找發(fā)布] -> [查看已注冊(cè)服務(wù)器所做的發(fā)布]
-> [下一步] -> [選擇發(fā)布] -> [選中已經(jīng)建立發(fā)布服務(wù)器上的數(shù)據(jù)庫(kù)發(fā)布名]
同步兩個(gè)Sql server (三)
-> [下一步] -> [指定同步代理程序登錄](méi) -> [當(dāng)代理程序連接到代理服務(wù)器時(shí):使用SQL Server身份驗(yàn)證](輸入發(fā)布服務(wù)器上distributor_admin用戶名和密碼)
-> [下一步] -> [選擇目的數(shù)據(jù)庫(kù)] -> [選擇在其中創(chuàng)建訂閱的數(shù)據(jù)庫(kù)名]/[也可以新建一個(gè)庫(kù)名]
-> [下一步] -> [允許匿名訂閱] -> [是,生成匿名訂閱]
-> [下一步] -> [初始化訂閱] -> [是,初始化架構(gòu)和數(shù)據(jù)]
-> [下一步] -> [快照傳送] -> [使用該發(fā)布的默認(rèn)快照文件夾中的快照文件]
(訂閱服務(wù)器要能訪問(wèn)發(fā)布服務(wù)器的REPLDATA文件夾,如果有問(wèn)題,可以手工設(shè)置網(wǎng)絡(luò)共享及共享權(quán)限)
-> [下一步] -> [快照傳送] -> [使用該發(fā)布的默認(rèn)快照文件夾中的快照文件]
-> [下一步] -> [設(shè)置分發(fā)代理程序調(diào)度] -> [使用下列調(diào)度] -> [更改] -> [例如每五分鐘調(diào)度一次]
-> [下一步] -> [啟動(dòng)要求的服務(wù)] -> [該訂閱要求在發(fā)布服務(wù)器上運(yùn)行SQLServerAgent服務(wù)]
-> [下一步] -> [完成] -> [確定]
成功建立了訂閱后,訂閱服務(wù)器上新增加了一個(gè)類別是[REPL-分發(fā)]作業(yè)(合并復(fù)制的時(shí)候類別是[REPL-合并])
它會(huì)按照我們給的時(shí)間調(diào)度表運(yùn)行數(shù)據(jù)庫(kù)同步復(fù)制的作業(yè)
三、SQL Server復(fù)制配置好后, 可能出現(xiàn)異常情況的實(shí)驗(yàn)日志:
1.發(fā)布服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制沒(méi)有多大影響
中斷期間,分發(fā)和訂閱都接收到?jīng)]有復(fù)制的事務(wù)信息
2.分發(fā)服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制有一些影響
中斷期間,發(fā)布服務(wù)器的事務(wù)排隊(duì)堆積起來(lái)(如果設(shè)置了較長(zhǎng)時(shí)間才刪除過(guò)期訂閱的選項(xiàng), 繁忙發(fā)布數(shù)據(jù)庫(kù)的事務(wù)日志可能會(huì)較快速膨脹),
訂閱服務(wù)器會(huì)因?yàn)樵L問(wèn)不到發(fā)布服務(wù)器,反復(fù)重試
我們可以設(shè)置重試次數(shù)和重試的時(shí)間間隔(最大的重試次數(shù)是9999, 如果每分鐘重試一次,可以支持約6.9天不出錯(cuò))
分發(fā)服務(wù)器sql server服務(wù)啟動(dòng),網(wǎng)絡(luò)接通以后,發(fā)布服務(wù)器上的堆積作業(yè)將按時(shí)間順序作用到訂閱機(jī)器上:
會(huì)需要一個(gè)比較長(zhǎng)的時(shí)間(實(shí)際上是生成所有事務(wù)的insert,update,delete語(yǔ)句,在訂閱服務(wù)器上去執(zhí)行)
我們?cè)谄胀ǖ腜C機(jī)上實(shí)驗(yàn)的58個(gè)事務(wù)100228個(gè)命令執(zhí)行花了7分28秒.
3.訂閱服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制影響比較大,可能需要重新初試化
我們實(shí)驗(yàn)環(huán)境(訂閱服務(wù)器)從18:46分意外停機(jī)以, 第二天8:40分重啟動(dòng)后,
已經(jīng)設(shè)好的復(fù)制在8:40分以后又開(kāi)始正常運(yùn)行了, 發(fā)布服務(wù)器上的堆積作業(yè)將按時(shí)間順序作用到訂閱機(jī)器上
但復(fù)制管理器里出現(xiàn)快照的錯(cuò)誤提示, 快照可能需要重新初試化,復(fù)制可能需要重新啟動(dòng).
(我們實(shí)驗(yàn)環(huán)境的機(jī)器并沒(méi)有進(jìn)行快照初試化,復(fù)制仍然是成功運(yùn)行的)
四、刪除已經(jīng)建好的發(fā)布和定閱可以直接用delete刪除按鈕
我們最好總是按先刪定閱,再刪發(fā)布,最后禁用發(fā)布的順序來(lái)操作。
如果要徹底刪去SQL Server上面的復(fù)制設(shè)置, 可以這樣操作:
[復(fù)制] -> 右鍵選擇 [禁用發(fā)布] -> [歡迎使用禁用發(fā)布和分發(fā)向?qū)
-> [下一步] -> [禁用發(fā)布] -> [要在"@servername"上禁用發(fā)布]
-> [下一步] -> [完成禁用發(fā)布和分發(fā)向?qū) -> [完成]
我們也可以用T-SQL命令來(lái)完成復(fù)制中發(fā)布及訂閱的創(chuàng)建和刪除, 選中已經(jīng)設(shè)好的發(fā)布和訂閱, 按屬標(biāo)右鍵
可以[生成SQL腳本]。(這里就不詳細(xì)講了, 后面推薦的網(wǎng)站內(nèi)有比較詳細(xì)的內(nèi)容)
當(dāng)你試圖刪除或者變更一個(gè)table時(shí),出現(xiàn)以下錯(cuò)誤
Server: Msg 3724, Level 16, State 2, Line 1
Cannot drop the table 'object_name' because it is being used for replication.
比較典型的情況是該table曾經(jīng)用于復(fù)制,但是后來(lái)又刪除了復(fù)制
處理辦法:
select * from sysobjects where replinfo >'0'
sp_configure 'allow updates', 1
go
reconfigure with override
go
begin transaction
update sysobjects set replinfo = '0' where replinfo >'0'
commit transaction
go
rollback transaction
go
sp_configure 'allow updates', 0
go
reconfigure with override
go
Sql server雙機(jī)數(shù)據(jù)庫(kù)同步實(shí)驗(yàn)步驟
第一步測(cè)試網(wǎng)絡(luò)連接
?1.實(shí)驗(yàn)環(huán)境(因人而異)
服務(wù)器:
機(jī)器名稱:CHENPENG
操作系統(tǒng):Windows xp-sp2
數(shù)據(jù)庫(kù)版本:SQL 2000 Server 企業(yè)版
客戶端
機(jī)器名稱:PHOENIX
操作系統(tǒng):Windows XP-sp2
數(shù)據(jù)庫(kù)版本:SQL 2000 Server企業(yè)版
(注:實(shí)驗(yàn)中的兩機(jī)在一個(gè)局域網(wǎng)中!)
2.測(cè)試網(wǎng)絡(luò)
2.1 將SQL 2000升級(jí)為SP4(sp3以上即可)
2.2 測(cè)試步驟:
2.2.1關(guān)閉雙方防火墻
2.2.2在命令提示符中運(yùn)行命令netstat -a -n,在結(jié)果列表里檢查是否有類似 tcp 0.0.0.0 1433 listening 的項(xiàng)。
2.2.3運(yùn)行命令 telnet 用戶名(或IP) 1433 測(cè)試對(duì)方端口是否暢通
第二步連接客戶端
1.建用戶帳號(hào)
在服務(wù)器端建立域用戶帳號(hào)(名稱為客戶端機(jī)器名)
?? 右擊我的電腦->管理->本地用戶和組->用戶->右擊選“新用戶”
這里新建的用戶名為:PHOENIX(應(yīng)為客房端機(jī)器名) 密碼:a(這里要設(shè)個(gè)密碼,若為空可能連不上)
2.重新啟動(dòng)服務(wù)器MSSQLServer
我的電腦->控制面版->管理工具->服務(wù)->MSSQLServer 服務(wù)->右擊,“停止”
在登錄屬性頁(yè)中更改為:域用戶帳號(hào)PHOENIX
用戶 ./ phoenix
密碼:a
->再啟動(dòng)服務(wù)
3.注冊(cè)客戶端
SQL企業(yè)管理器->SQL Server組->右鍵->新建SQL注冊(cè)->下一步->可用的服務(wù)器中選”P(pán)HOENIX”添加->下一步->管理員給我分配的……->下一步->登錄名:sa;密碼:空->下一步….下一步->完成
4.安裝分發(fā)服務(wù)器
4.1配置分發(fā)服務(wù)器
工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->下一步 (所有的均采用默認(rèn)配? 置)……->完成
?
4.2配置發(fā)布服務(wù)器
4.2.1工具->復(fù)制->創(chuàng)建和管理發(fā)布->選擇要發(fā)布的數(shù)據(jù)庫(kù)(pubs)->創(chuàng)建發(fā)布 ->下一步(pubs) ->下一步->合并發(fā)布->下一步->選擇要發(fā)布的內(nèi)容(要發(fā)布的表,存儲(chǔ)過(guò)程等)->下一步(所有的均采用默認(rèn)配置)……>完成
4.2.2成功后會(huì)返回剛才的窗口:選中剛才發(fā)布的名稱,點(diǎn)”強(qiáng)制新訂閱” ->下一步->選”P(pán)HOENIX”,下一步->下一步->選"連續(xù)地...",下一步->下一步....->完成
至此,全部的操作步驟就完成了!可以在兩機(jī)之間同步選定的表等。
在SQL Server 2000里設(shè)置和使用數(shù)據(jù)庫(kù)復(fù)制之前,應(yīng)先檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器下面幾點(diǎn)是否滿足:
1、MSSQLserver和Sqlserveragent服務(wù)是否是以域用戶身份啟動(dòng)并運(yùn)行的(./administrator用戶也是可以的)
如果登錄用的是本地系統(tǒng)帳戶local,將不具備網(wǎng)絡(luò)功能,會(huì)產(chǎn)生以下錯(cuò)誤:
進(jìn)程未能連接到Distributor '@Server name'
(如果您的服務(wù)器已經(jīng)用了SQL Server全文檢索服務(wù), 請(qǐng)不要修改MSSQLserver和Sqlserveragent服務(wù)的local啟動(dòng)。
會(huì)照成全文檢索服務(wù)不能用。請(qǐng)換另外一臺(tái)機(jī)器來(lái)做SQL Server 2000里復(fù)制中的分發(fā)服務(wù)器。)
修改服務(wù)啟動(dòng)的登錄用戶,需要重新啟動(dòng)MSSQLserver和Sqlserveragent服務(wù)才能生效。
2、檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器是否改過(guò)名稱(需要srvid=0的本地機(jī)器上srvname和datasource一樣)
在查詢分析器里執(zhí)行:
use master
select srvid,srvname,datasource from sysservers
如果沒(méi)有srvid=0或者srvid=0(也就是本機(jī)器)但srvname和datasource不一樣, 需要按如下方法修改:
USE master
GO
-- 設(shè)置兩個(gè)變量
DECLARE @serverproperty_servername varchar(100),
@servername varchar(100)
-- 取得Windows NT 服務(wù)器和與指定的 SQL Server 實(shí)例關(guān)聯(lián)的實(shí)例信息
SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))
-- 返回運(yùn)行 Microsoft SQL Server 的本地服務(wù)器名稱
SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
-- 顯示獲取的這兩個(gè)參數(shù)
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因?yàn)槟愀倪^(guò)計(jì)算機(jī)名字),再運(yùn)行下面的
--刪除錯(cuò)誤的服務(wù)器名
EXEC sp_dropserver @server=@servername
--添加正確的服務(wù)器名
EXEC sp_addserver @server=@serverproperty_servername, @local='local'
修改這項(xiàng)參數(shù),需要重新啟動(dòng)MSSQLserver和Sqlserveragent服務(wù)才能生效。
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)18482、18483錯(cuò)誤了。
3、檢查SQL Server企業(yè)管理器里面相關(guān)的幾臺(tái)SQL Server注冊(cè)名是否和上面第二點(diǎn)里介紹的srvname一樣
不能用IP地址的注冊(cè)名。
(我們可以刪掉IP地址的注冊(cè),新建以SQL Server管理員級(jí)別的用戶注冊(cè)的服務(wù)器名)
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)14010、20084、18456、18482、18483錯(cuò)誤了。
4、檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器網(wǎng)絡(luò)是否能夠正常訪問(wèn)
如果ping主機(jī)IP地址可以,但ping主機(jī)名不通的時(shí)候,需要在
winnt/system32/drivers/etc/hosts (WIN2000)
windows/system32/drivers/etc/hosts (WIN2003)
文件里寫(xiě)入數(shù)據(jù)庫(kù)服務(wù)器IP地址和主機(jī)名的對(duì)應(yīng)關(guān)系。
例如:
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.65 fengyu02 fengyu02
202.84.10.193 bj_db bj_db
或者在SQL Server客戶端網(wǎng)絡(luò)實(shí)用工具里建立別名,例如:
5、系統(tǒng)需要的擴(kuò)展存儲(chǔ)過(guò)程是否存在(如果不存在,需要恢復(fù)):
sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
go
sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
接下來(lái)就可以用SQL Server企業(yè)管理器里[復(fù)制]-> 右鍵選擇
->[配置發(fā)布、訂閱服務(wù)器和分發(fā)]的圖形界面來(lái)配置數(shù)據(jù)庫(kù)復(fù)制了。
下面是按順序列出配置復(fù)制的步驟:
一、建立發(fā)布和分發(fā)服務(wù)器
[歡迎使用配置發(fā)布和分發(fā)向?qū)->[選擇分發(fā)服務(wù)器]
->[使"@servername"成為它自己的分發(fā)服務(wù)器,SQL Server將創(chuàng)建分發(fā)數(shù)據(jù)庫(kù)和日志]
->[制定快照文件夾]-> [自定義配置] -> [否,使用下列的默認(rèn)配置] -> [完成]
上述步驟完成后, 會(huì)在當(dāng)前"@servername" SQL Server數(shù)據(jù)庫(kù)里建立了一個(gè)distribion庫(kù)和
一個(gè)distributor_admin管理員級(jí)別的用戶(我們可以任意修改密碼)
服務(wù)器上新增加了四個(gè)作業(yè):
[ 代理程序歷史記錄清除: distribution ]
[ 分發(fā)清除: distribution ]
[ 復(fù)制代理程序檢查 ]
[ 重新初始化存在數(shù)據(jù)驗(yàn)證失敗的訂閱 ]
SQL Server企業(yè)管理器里多了一個(gè)復(fù)制監(jiān)視器, 當(dāng)前的這臺(tái)機(jī)器就可以發(fā)布、分發(fā)、訂閱了。
我們?cè)俅卧赟QL Server企業(yè)管理器里[復(fù)制]-> 右鍵選擇
->[配置發(fā)布、訂閱服務(wù)器和分發(fā)],可以看到類似下圖:
我們可以在 [發(fā)布服務(wù)器和分發(fā)服務(wù)器的屬性] 窗口
-> [發(fā)布服務(wù)器] -> [新增] -> [確定]
-> [發(fā)布數(shù)據(jù)庫(kù)] -> [事務(wù)]/[合并] -> [確定]
-> [訂閱服務(wù)器] -> [新增] -> [確定]
把網(wǎng)絡(luò)上的其它SQL Server服務(wù)器添加成為發(fā)布或者訂閱服務(wù)器.
新增一臺(tái)發(fā)布服務(wù)器的選項(xiàng):
我這里新建立的JIN001發(fā)布服務(wù)器是用管理員級(jí)別的數(shù)據(jù)庫(kù)用戶test連接的,
到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框, 默認(rèn)的是選中的,
在新建的JIN001發(fā)布服務(wù)器上建立和分發(fā)服務(wù)器FENGYU/FENGYU的鏈接的時(shí)需要輸入distributor_admin用戶的密碼
到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框,也可以不選,
也就是不需要密碼來(lái)建立發(fā)布到分發(fā)服務(wù)器的鏈接(這當(dāng)然欠缺安全,在測(cè)試環(huán)境下可以使用)
新增一臺(tái)訂閱服務(wù)器的選項(xiàng):
二、新建立的網(wǎng)絡(luò)上另一臺(tái)發(fā)布服務(wù)器(例如JIN001)選擇分發(fā)服務(wù)器
[歡迎使用配置發(fā)布和分發(fā)向?qū)->[選擇分發(fā)服務(wù)器]
-> 使用下列服務(wù)器(選定的服務(wù)器必須已配置為分發(fā)服務(wù)器) -> [選定服務(wù)器](例如FENGYU/FENGYU)
-> [下一步] -> [輸入分發(fā)服務(wù)器(例如FENGYU/FENGYU)的distributor_admin用戶的密碼兩次]
-> [下一步] -> [自定義配置] -> [否,使用下列的默認(rèn)配置]
-> [下一步] -> [完成] -> [確定]
建立一個(gè)數(shù)據(jù)庫(kù)復(fù)制發(fā)布的過(guò)程:
[復(fù)制] -> [發(fā)布內(nèi)容] -> 右鍵選擇 -> [新建發(fā)布]
-> [下一步] -> [選擇發(fā)布數(shù)據(jù)庫(kù)] -> [選中一個(gè)待發(fā)布的數(shù)據(jù)庫(kù)]
-> [下一步] -> [選擇發(fā)布類型] -> [事務(wù)發(fā)布]/[合并發(fā)布]
-> [下一步] -> [指定訂閱服務(wù)器的類型] -> [運(yùn)行SQL Server 2000的服務(wù)器]
-> [下一步] -> [指定項(xiàng)目] -> [在事務(wù)發(fā)布中只可以發(fā)布帶主鍵的表] -> [選中一個(gè)有主鍵的待發(fā)布的表]
->[在合并發(fā)布中會(huì)給表增加唯一性索引和 ROWGUIDCOL 屬性的唯一標(biāo)識(shí)符字段[rowguid],默認(rèn)值是newid()]
(添加新列將: 導(dǎo)致不帶列列表的 INSERT 語(yǔ)句失敗,增加表的大小,增加生成第一個(gè)快照所要求的時(shí)間)
->[選中一個(gè)待發(fā)布的表]
-> [下一步] -> [選擇發(fā)布名稱和描述] ->
-> [下一步] -> [自定義發(fā)布的屬性] -> [否,根據(jù)指定方式創(chuàng)建發(fā)布]
-> [下一步] -> [完成] -> [關(guān)閉]
發(fā)布屬性里有很多有用的選項(xiàng):設(shè)定訂閱到期(例如24小時(shí))
設(shè)定發(fā)布表的項(xiàng)目屬性:
常規(guī)窗口可以指定發(fā)布目的表的名稱,可以跟原來(lái)的表名稱不一樣。
下圖是命令和快照窗口的欄目
( SQL Server 數(shù)據(jù)庫(kù)復(fù)制技術(shù)實(shí)際上是用insert,update,delete操作在訂閱服務(wù)器上重做發(fā)布服務(wù)器上的事務(wù)操作
看文檔資料需要把發(fā)布數(shù)據(jù)庫(kù)設(shè)成完全恢復(fù)模式,事務(wù)才不會(huì)丟失
但我自己在測(cè)試中發(fā)現(xiàn)發(fā)布數(shù)據(jù)庫(kù)是簡(jiǎn)單恢復(fù)模式下,每10秒生成一些大事務(wù),10分鐘后再收縮數(shù)據(jù)庫(kù)日志,
這期間發(fā)布和訂閱服務(wù)器上的作業(yè)都暫停,暫停恢復(fù)后并沒(méi)有丟失任何事務(wù)更改 )
發(fā)布表可以做數(shù)據(jù)篩選,例如只選擇表里面的部分列:
例如只選擇表里某些符合條件的記錄, 我們可以手工編寫(xiě)篩選的SQL語(yǔ)句:
發(fā)布表的訂閱選項(xiàng),并可以建立強(qiáng)制訂閱:
成功建立了發(fā)布以后,發(fā)布服務(wù)器上新增加了一個(gè)作業(yè): [ 失效訂閱清除 ]
分發(fā)服務(wù)器上新增加了兩個(gè)作業(yè):
[ JIN001-dack-dack-5 ] 類型[ REPL快照 ]
[ JIN001-dack-3 ] 類型[ REPL日志讀取器 ]
上面藍(lán)色字的名稱會(huì)根據(jù)發(fā)布服務(wù)器名,發(fā)布名及第幾次發(fā)布而使用不同的編號(hào)
REPL快照作業(yè)是SQL Server復(fù)制的前提條件,它會(huì)先把發(fā)布的表結(jié)構(gòu),數(shù)據(jù),索引,約束等生成到發(fā)布服務(wù)器的OS目錄下文件
(當(dāng)有訂閱的時(shí)候才會(huì)生成, 當(dāng)訂閱請(qǐng)求初始化或者按照某個(gè)時(shí)間表調(diào)度生成)
REPL日志讀取器在事務(wù)復(fù)制的時(shí)候是一直處于運(yùn)行狀態(tài)。(在合并復(fù)制的時(shí)候可以根據(jù)調(diào)度的時(shí)間表來(lái)運(yùn)行)
建立一個(gè)數(shù)據(jù)庫(kù)復(fù)制訂閱的過(guò)程:
[復(fù)制] -> [訂閱] -> 右鍵選擇 -> [新建請(qǐng)求訂閱]
-> [下一步] -> [查找發(fā)布] -> [查看已注冊(cè)服務(wù)器所做的發(fā)布]
-> [下一步] -> [選擇發(fā)布] -> [選中已經(jīng)建立發(fā)布服務(wù)器上的數(shù)據(jù)庫(kù)發(fā)布名]
-> [下一步] -> [指定同步代理程序登錄](méi) -> [當(dāng)代理程序連接到代理服務(wù)器時(shí):使用SQL Server身份驗(yàn)證]
(輸入發(fā)布服務(wù)器上distributor_admin用戶名和密碼)
-> [下一步] -> [選擇目的數(shù)據(jù)庫(kù)] -> [選擇在其中創(chuàng)建訂閱的數(shù)據(jù)庫(kù)名]/[也可以新建一個(gè)庫(kù)名]
-> [下一步] -> [允許匿名訂閱] -> [是,生成匿名訂閱]
-> [下一步] -> [初始化訂閱] -> [是,初始化架構(gòu)和數(shù)據(jù)]
-> [下一步] -> [快照傳送] -> [使用該發(fā)布的默認(rèn)快照文件夾中的快照文件]
(訂閱服務(wù)器要能訪問(wèn)發(fā)布服務(wù)器的REPLDATA文件夾,如果有問(wèn)題,可以手工設(shè)置網(wǎng)絡(luò)共享及共享權(quán)限)
-> [下一步] -> [快照傳送] -> [使用該發(fā)布的默認(rèn)快照文件夾中的快照文件]
-> [下一步] -> [設(shè)置分發(fā)代理程序調(diào)度] -> [使用下列調(diào)度] -> [更改] -> [例如每五分鐘調(diào)度一次]
-> [下一步] -> [啟動(dòng)要求的服務(wù)] -> [該訂閱要求在發(fā)布服務(wù)器上運(yùn)行SQLServerAgent服務(wù)]
-> [下一步] -> [完成] -> [確定]
成功建立了訂閱后,訂閱服務(wù)器上新增加了一個(gè)類別是[REPL-分發(fā)]作業(yè)(合并復(fù)制的時(shí)候類別是[REPL-合并])
它會(huì)按照我們給的時(shí)間調(diào)度表運(yùn)行數(shù)據(jù)庫(kù)同步復(fù)制的作業(yè)
查看它的歷史記錄運(yùn)行情況,例圖:
在分發(fā)服務(wù)器的[復(fù)制監(jiān)視器]->[發(fā)布服務(wù)器]->[發(fā)布名稱]->[日志讀取器]->右鍵選擇->[代理程序歷史記錄](méi), 例圖:
三、SQL Server復(fù)制配置好后, 可能出現(xiàn)異常情況的實(shí)驗(yàn)日志:
1.發(fā)布服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制沒(méi)有多大影響
中斷期間,分發(fā)和訂閱都接收到?jīng)]有復(fù)制的事務(wù)信息
2.分發(fā)服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制有一些影響
中斷期間,發(fā)布服務(wù)器的事務(wù)排隊(duì)堆積起來(lái)
(如果設(shè)置了較長(zhǎng)時(shí)間才刪除過(guò)期訂閱的選項(xiàng), 繁忙發(fā)布數(shù)據(jù)庫(kù)的事務(wù)日志可能會(huì)較快速膨脹),
訂閱服務(wù)器會(huì)因?yàn)樵L問(wèn)不到發(fā)布服務(wù)器,反復(fù)重試
我們可以設(shè)置重試次數(shù)和重試的時(shí)間間隔(最大的重試次數(shù)是9999, 如果每分鐘重試一次,可以支持約6.9天不出錯(cuò))
分發(fā)服務(wù)器sql server服務(wù)啟動(dòng),網(wǎng)絡(luò)接通以后,發(fā)布服務(wù)器上的堆積作業(yè)將按時(shí)間順序作用到訂閱機(jī)器上:
會(huì)需要一個(gè)比較長(zhǎng)的時(shí)間(實(shí)際上是生成所有事務(wù)的insert,update,delete語(yǔ)句,在訂閱服務(wù)器上去執(zhí)行)
我們?cè)谄胀ǖ腜C機(jī)上實(shí)驗(yàn)的58個(gè)事務(wù)100228個(gè)命令執(zhí)行花了7分28秒.
3.訂閱服務(wù)器斷網(wǎng),sql server服務(wù)關(guān)閉,重啟動(dòng),關(guān)機(jī)的時(shí)候,對(duì)已經(jīng)設(shè)置好的復(fù)制影響比較大,可能需要重新初試化
我們實(shí)驗(yàn)環(huán)境(訂閱服務(wù)器)從18:46分意外停機(jī)以, 第二天8:40分重啟動(dòng)后,
已經(jīng)設(shè)好的復(fù)制在8:40分以后又開(kāi)始正常運(yùn)行了, 發(fā)布服務(wù)器上的堆積作業(yè)將按時(shí)間順序作用到訂閱機(jī)器上
但復(fù)制管理器里出現(xiàn)快照的錯(cuò)誤提示, 快照可能需要重新初試化,復(fù)制可能需要重新啟動(dòng).
(我們實(shí)驗(yàn)環(huán)境的機(jī)器并沒(méi)有進(jìn)行快照初試化,復(fù)制仍然是成功運(yùn)行的)
四、刪除已經(jīng)建好的發(fā)布和定閱可以直接用delete刪除按鈕
我們最好總是按先刪定閱,再刪發(fā)布,最后禁用發(fā)布的順序來(lái)操作。
如果要徹底刪去SQL Server上面的復(fù)制設(shè)置, 可以這樣操作:
[復(fù)制] -> 右鍵選擇 [禁用發(fā)布] -> [歡迎使用禁用發(fā)布和分發(fā)向?qū)
-> [下一步] -> [禁用發(fā)布] -> [要在"@servername"上禁用發(fā)布]
-> [下一步] -> [完成禁用發(fā)布和分發(fā)向?qū) -> [完成]
我們也可以用T-SQL命令來(lái)完成復(fù)制中發(fā)布及訂閱的創(chuàng)建和刪除, 選中已經(jīng)設(shè)好的發(fā)布和訂閱, 按屬標(biāo)右鍵
可以[生成SQL腳本]。(這里就不詳細(xì)講了, 后面推薦的網(wǎng)站內(nèi)有比較詳細(xì)的內(nèi)容)
當(dāng)你試圖刪除或者變更一個(gè)table時(shí),出現(xiàn)以下錯(cuò)誤
Server: Msg 3724, Level 16, State 2, Line 1
Cannot drop the table 'object_name' because it is being used for replication.
比較典型的情況是該table曾經(jīng)用于復(fù)制,但是后來(lái)又刪除了復(fù)制
處理辦法:
select * from sysobjects where replinfo >'0'
sp_configure 'allow updates', 1
go
reconfigure with override
go
begin transaction
update sysobjects set replinfo = '0' where replinfo >'0'
commit transaction
go
rollback transaction
go
sp_configure 'allow updates', 0
go
經(jīng)過(guò)兩天的查找和實(shí)踐,終于對(duì)-如何同步兩個(gè)sql server的數(shù)據(jù)有了一個(gè)比較粗略的了解。
不是使用寫(xiě)sql 的方式來(lái)實(shí)現(xiàn),而是采用-強(qiáng)制訂閱實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步操作,大量和批量的數(shù)據(jù)可以用數(shù)據(jù)庫(kù)的同步機(jī)制處理。
說(shuō)明:
為方便操作,所有操作均在發(fā)布服務(wù)器(分發(fā)服務(wù)器)上操作,并使用推模式,在客戶機(jī)器使用強(qiáng)制訂閱方式。
測(cè)試通過(guò):
==1:環(huán)境
服務(wù)器環(huán)境:
機(jī)器名稱: serverDB
操作系統(tǒng):Windows 2000 Server
數(shù)據(jù)庫(kù)版本:SQL 2000 Server 企業(yè)版
客戶端
機(jī)器名稱:Joy
操作系統(tǒng):Windows 2000 Server
數(shù)據(jù)庫(kù)版本:SQL 2000 Server 企業(yè)版
==2:建用戶帳號(hào)
在服務(wù)器端建立域用戶帳號(hào)
我的電腦管理->本地用戶和組->用戶->建立
UserName:Joy
UserPwd:Joy
==3:重新啟動(dòng)服務(wù)器MSSQLServer
我的電腦->控制面版->管理工具->服務(wù)->MSSQLServer 服務(wù)
(更改為:域用戶帳號(hào),我們新建的joy用戶 ./joy,密碼:joy)
==4:安裝分發(fā)服務(wù)器
A:配置分發(fā)服務(wù)器
工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->下一步->下一步(所有的均采用默認(rèn)配置)
B:配置發(fā)布服務(wù)器
工具->復(fù)制->創(chuàng)建和管理發(fā)布->選擇要發(fā)布的數(shù)據(jù)庫(kù)(pubs)->下一步->快照發(fā)布->下一步->
選擇要發(fā)布的內(nèi)容->下一步->下一步->下一步->完成
C:強(qiáng)制配置訂閱服務(wù)器(推模式,拉模式與此雷同)
工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->訂閱服務(wù)器->新建->SQL Server數(shù)據(jù)庫(kù)->輸入客戶端服務(wù)器名稱(joy)->使用SQL Server 身份驗(yàn)證(sa,sa)->確定->應(yīng)用->確定
D:初始化訂閱
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(serverDB)->雙擊訂閱->強(qiáng)制新建->下一步->選擇啟用的訂閱服務(wù)器->joy->
下一步->下一步->下一步->下一步->完成
==6:測(cè)試數(shù)據(jù)
--在服務(wù)器執(zhí)行:
選擇表stores,手動(dòng)或者通過(guò)sql語(yǔ)句修改其中的數(shù)據(jù),insert ,update ,delete均可。
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(serverDB)->->快照->啟動(dòng)代理程序->ZLP:SZ(強(qiáng)制)->啟動(dòng)同步處理
去查看同步的 joy:stores 是否插入了一條新的記錄
測(cè)試完畢,通過(guò)。
==7修改數(shù)據(jù)庫(kù)的同步時(shí)間,一般選擇夜晚執(zhí)行數(shù)據(jù)庫(kù)同步處理
(具體操作略) :D
〔注意說(shuō)明〕
服務(wù)器一端不能以(local)進(jìn)行數(shù)據(jù)的發(fā)布與分發(fā),需要先刪除注冊(cè),然后新建注冊(cè)本地計(jì)算機(jī)名稱
卸載方式:工具->復(fù)制->禁止發(fā)布->是在"ZehuaDb"上靜止發(fā)布,卸載所有的數(shù)據(jù)庫(kù)同步配置服務(wù)器
注意:發(fā)布服務(wù)器、分發(fā)服務(wù)器中的SQLServerAgent服務(wù)必須啟動(dòng)
采用推模式: "D:/Microsoft SQL Server/MSSQL/REPLDATA/unc" 目錄文件可以不設(shè)置共享
拉模式:則需要共享~!
少量數(shù)據(jù)庫(kù)同步可以采用觸發(fā)器實(shí)現(xiàn),同步單表即可。
===========================================
配置過(guò)程中可能出現(xiàn)的問(wèn)題
在SQL Server 2000里設(shè)置和使用數(shù)據(jù)庫(kù)復(fù)制之前,應(yīng)先檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器下面幾點(diǎn)是否滿足:
1、MSSQLserver和Sqlserveragent服務(wù)是否是以域用戶身份啟動(dòng)并運(yùn)行的(./administrator用戶也是可以的)
如果登錄用的是本地系統(tǒng)帳戶local,將不具備網(wǎng)絡(luò)功能,會(huì)產(chǎn)生以下錯(cuò)誤:
進(jìn)程未能連接到Distributor '@Server name'
(如果您的服務(wù)器已經(jīng)用了SQL Server全文檢索服務(wù), 請(qǐng)不要修改MSSQLserver和Sqlserveragent服務(wù)的local啟動(dòng)。
會(huì)照成全文檢索服務(wù)不能用。請(qǐng)換另外一臺(tái)機(jī)器來(lái)做SQL Server 2000里復(fù)制中的分發(fā)服務(wù)器。)
修改服務(wù)啟動(dòng)的登錄用戶,需要重新啟動(dòng)MSSQLserver和Sqlserveragent服務(wù)才能生效。
2、檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器是否改過(guò)名稱(需要srvid=0的本地機(jī)器上srvname和datasource一樣)
在查詢分析器里執(zhí)行:
use master
select srvid,srvname,datasource from sysservers
如果沒(méi)有srvid=0或者srvid=0(也就是本機(jī)器)但srvname和datasource不一樣, 需要按如下方法修改:
USE master
GO
-- 設(shè)置兩個(gè)變量
DECLARE @serverproperty_servername varchar(100),
@servername varchar(100)
-- 取得Windows NT 服務(wù)器和與指定的 SQL Server 實(shí)例關(guān)聯(lián)的實(shí)例信息
SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))
-- 返回運(yùn)行 Microsoft SQL Server 的本地服務(wù)器名稱
SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
-- 顯示獲取的這兩個(gè)參數(shù)
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因?yàn)槟愀倪^(guò)計(jì)算機(jī)名字),再運(yùn)行下面的
--刪除錯(cuò)誤的服務(wù)器名
EXEC sp_dropserver @server=@servername
--添加正確的服務(wù)器名
EXEC sp_addserver @server=@serverproperty_servername, @local='local'
修改這項(xiàng)參數(shù),需要重新啟動(dòng)MSSQLserver和Sqlserveragent服務(wù)才能生效。
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)18482、18483錯(cuò)誤了。
3、檢查SQL Server企業(yè)管理器里面相關(guān)的幾臺(tái)SQL Server注冊(cè)名是否和上面第二點(diǎn)里介紹的srvname一樣
不能用IP地址的注冊(cè)名。
(我們可以刪掉IP地址的注冊(cè),新建以SQL Server管理員級(jí)別的用戶注冊(cè)的服務(wù)器名)
這樣一來(lái)就不會(huì)在創(chuàng)建復(fù)制的過(guò)程中出現(xiàn)14010、20084、18456、18482、18483錯(cuò)誤了。
4、檢查相關(guān)的幾臺(tái)SQL Server服務(wù)器網(wǎng)絡(luò)是否能夠正常訪問(wèn)
如果ping主機(jī)IP地址可以,但ping主機(jī)名不通的時(shí)候,需要在
winnt/system32/drivers/etc/hosts (WIN2000)
windows/system32/drivers/etc/hosts (WIN2003)
文件里寫(xiě)入數(shù)據(jù)庫(kù)服務(wù)器IP地址和主機(jī)名的對(duì)應(yīng)關(guān)系。
例如:
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.65 fengyu02 fengyu02
202.84.10.193 bj_db bj_db
或者在SQL Server客戶端網(wǎng)絡(luò)實(shí)用工具里建立別名,例如:
5、系統(tǒng)需要的擴(kuò)展存儲(chǔ)過(guò)程是否存在(如果不存在,需要恢復(fù)):
sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
go
sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
接下來(lái)就可以用SQL Server企業(yè)管理器里[復(fù)制]-> 右鍵選擇
->[配置發(fā)布、訂閱服務(wù)器和分發(fā)]的圖形界面來(lái)配置數(shù)據(jù)庫(kù)復(fù)制了。
sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
go
sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
go
--創(chuàng)建作業(yè),定時(shí)執(zhí)行數(shù)據(jù)同步的存儲(chǔ)過(guò)程
if exists(SELECT 1 from msdb..sysjobs where name=’數(shù)據(jù)處理’)
EXECUTE msdb.dbo.sp_delete_job @job_name=’數(shù)據(jù)處理’
exec msdb..sp_add_job @job_name=’數(shù)據(jù)處理’
--創(chuàng)建作業(yè)步驟
declare @sql varchar(800),@dbname varchar(250)
select @sql=’exec p_synchro’ --數(shù)據(jù)處理的命令
,@dbname=db_name() --執(zhí)行數(shù)據(jù)處理的數(shù)據(jù)庫(kù)名
exec msdb..sp_add_jobstep @job_name=’數(shù)據(jù)處理’,
@step_name = ’數(shù)據(jù)同步’,
@subsystem = ’TSQL’,
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, --重試次數(shù)
@retry_interval = 5 --重試間隔
--創(chuàng)建調(diào)度
EXEC msdb..sp_add_jobschedule @job_name = ’數(shù)據(jù)處理’,
@name = ’時(shí)間安排’,
@freq_type = 4, --每天
@freq_interval = 1, --每天執(zhí)行一次
@active_start_time = 00000 --0點(diǎn)執(zhí)行
go
同步兩個(gè)Sql server (一)
如何同步兩個(gè)SQLServer數(shù)據(jù)庫(kù)的內(nèi)容?
程序代碼可以有版本管理CVS進(jìn)行同步管理,可是數(shù)據(jù)庫(kù)同步就非常麻煩,只能自己改了一個(gè)后再去改另一個(gè),如果忘記了更改另一個(gè)經(jīng)常造成兩個(gè)數(shù)據(jù)庫(kù)的結(jié)構(gòu)或內(nèi)容上不一致。各位有什么好的方法嗎?
分發(fā)與復(fù)制
用強(qiáng)制訂閱實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步操作
大量和批量的數(shù)據(jù)可以用數(shù)據(jù)庫(kù)的同步機(jī)制處理:
//
說(shuō)明:
為方便操作,所有操作均在發(fā)布服務(wù)器(分發(fā)服務(wù)器)上操作,并使用推模式
在客戶機(jī)器使用強(qiáng)制訂閱方式。
有疑問(wèn)聯(lián)系作者:zlp321001@hotmail.com
測(cè)試通過(guò)
//
--1:環(huán)境
服務(wù)器環(huán)境:
機(jī)器名稱: ZehuaDb
操作系統(tǒng):Windows 2000 Server
數(shù)據(jù)庫(kù)版本:SQL 2000 Server 個(gè)人版
客戶端
機(jī)器名稱:Zlp
操作系統(tǒng):Windows 2000 Server
數(shù)據(jù)庫(kù)版本:SQL 2000 Server 個(gè)人版
--2:建用戶帳號(hào)
在服務(wù)器端建立域用戶帳號(hào)
我的電腦管理->本地用戶和組->用戶->建立
UserName:zlp
UserPwd:zlp
--3:重新啟動(dòng)服務(wù)器MSSQLServer
我的電腦->控制面版->管理工具->服務(wù)->MSSQLServer 服務(wù)
(更改為:域用戶帳號(hào),我們新建的zlp用戶 ./zlp,密碼:zlp)
--4:安裝分發(fā)服務(wù)器
A:配置分發(fā)服務(wù)器
工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->下一步->下一步(所有的均采用默認(rèn)配置)
B:配置發(fā)布服務(wù)器
工具->復(fù)制->創(chuàng)建和管理發(fā)布->選擇要發(fā)布的數(shù)據(jù)庫(kù)(SZ)->下一步->快照發(fā)布->下一步->
選擇要發(fā)布的內(nèi)容->下一步->下一步->下一步->完成
C:強(qiáng)制配置訂閱服務(wù)器(推模式,拉模式與此雷同)
工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->訂閱服務(wù)器->新建->SQL Server數(shù)據(jù)庫(kù)->輸入客戶端服務(wù)器名稱(ZLP)->使用SQL Server 身份驗(yàn)證 (sa,空密碼)->確定->應(yīng)用->確定
D:初始化訂閱
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->雙擊訂閱->強(qiáng)制新建->下一步->選擇啟用的訂閱服務(wù)器->ZLP->
下一步->下一步->下一步->下一步->完成
--5:測(cè)試配置是否成功
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->雙擊SZ:SZ->點(diǎn)狀態(tài)->點(diǎn)立即運(yùn)行代理程序
查看:
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->SZ:SZ->選擇ZLP:SZ(類型強(qiáng)制)->鼠標(biāo)右鍵->啟動(dòng)同步處理
如果沒(méi)有錯(cuò)誤標(biāo)志(紅色叉),恭喜您配置成功
--6:測(cè)試數(shù)據(jù)
--在服務(wù)器執(zhí)行:
選擇一個(gè)表,執(zhí)行如下SQL
insert into WQ_NEWSGROUP_S select '測(cè)試成功',5
復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->SZ:SZ->快照->啟動(dòng)代理程序->ZLP:SZ(強(qiáng)制)->啟動(dòng)同步處理
去查看同步的 WQ_NEWSGROUP_S 是否插入了一條新的記錄
測(cè)試完畢,通過(guò)。
--7修改數(shù)據(jù)庫(kù)的同步時(shí)間,一般選擇夜晚執(zhí)行數(shù)據(jù)庫(kù)同步處理
(具體操作略) :D
USE master
GO
-- 設(shè)置兩個(gè)變量
DECLARE @serverproperty_servername varchar(100),
@servername varchar(100)
-- 取得Windows NT 服務(wù)器和與指定的 SQL Server 實(shí)例關(guān)聯(lián)的實(shí)例信息
SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))
-- 返回運(yùn)行 Microsoft SQL Server 的本地服務(wù)器名稱
SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
-- 顯示獲取的這兩個(gè)參數(shù)
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因?yàn)槟愀倪^(guò)計(jì)算機(jī)名字),再運(yùn)行下面的
--刪除錯(cuò)誤的服務(wù)器名
EXEC sp_dropserver @server=@servername
--添加正確的服務(wù)器名
EXEC sp_addserver @server=@serverproperty_servername, @local='local'
http://blog.csdn.net/kension/archive/2007/01/30/1497875.aspx
新聞熱點(diǎn)
疑難解答
圖片精選