兩台SQL Server伺服器同步問題

2021-04-07 13:15:13 字數 3952 閱讀 8257

--定時同步伺服器上的資料(伺服器上的資料修改同步到本地)  

--例子:  

--測試環境,sql server2000,遠端伺服器名:rserver,使用者名為:ruser,密碼:rpwd,  

測試資料庫:test  

--伺服器上的表(查詢分析器連線到伺服器上建立)  

--state欄位為輔助更新而設定的附加字段,字段值說明:null 表示新增記錄,1 表示修改過的記錄,0 表示無變化的記錄  

if exists (select * from dbo.sysobjects where id = object_id(n』[luser]』) and objectproperty(id, n』isusertable』) = 1)  

drop table [luser]  

go  

create table [luser](id int identity(1,1) primary key,[user] varchar(4),pwd varchar(10),address varchar(50),state bit)  

go  

--建立觸發器,維護state欄位的值  

create trigger t_state on [luser]  

after update  

as  

update [luser] set state=1  

from [luser] a join inserted b on a.id=b.id  

where a.state is not null  

go  

----以下在區域網(本機操作)  

if exists (select * from dbo.sysobjects where id = object_id(n』[luser]』) and objectproperty(id, n』isusertable』) = 1)  

drop table [luser]  

create table [luser](id int primary key,[user] varchar(4),pwd varchar(10),address varchar(50))  

go  

--為了方便同步處理,建立鏈結伺服器到要同步的伺服器  

--這裡的遠端伺服器名:rserver,使用者名為:ruser,密碼:rpwd  

if exists(select 1 from master..sysservers where srvname=』srv_lnk』)  

exec sp_dropserver 』srv_lnk』,』droplogins』  

go  

exec sp_addlinkedserver 』srv_lnk』,』』,』sqloledb』,』rserver』  

exec sp_addlinkedsrvlogin 』srv_lnk』,』false』,null,』ruser』,』rpwd』  

go  

--建立同步處理的儲存過程  

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  

/*--因為msdtc服務(分布式事務處理需要)工作不穩定,所以下面部分為選用內容  

--set xact_abort on  

--啟動遠端伺服器的msdtc服務  

--exec master..xp_cmdshell 』isql /s"rserver" /u"ruser" /p"rpwd" /q"exec master..xp_cmdshell 』』net start msdtc』』,no_output"』,no_output  

--啟動本機的msdtc服務  

--exec master..xp_cmdshell 』net start msdtc』,no_output  

--進行分布事務處理,如果錶用標識列做主鍵,用下面的方法  

--begin distributed transaction  

--*/  

--同步刪除的資料  

delete from [luser]  

where id not in(select id from srv_lnk.test.dbo.[luser])  

--同步新增的資料  

insert into [luser]  

select id,[user],pwd,address from srv_lnk.test.dbo.[luser]  

where state is null  

--同步修改的資料  

update [luser] set  

[user]=b.[user],pwd=b.pwd,address=b.address  

from [luser] a  

join srv_lnk.test.dbo.[user] b on a.id=b.id  

where b.state=1  

--同步後更新伺服器上的標誌  

update srv_lnk.test.dbo.[luser] set state=0 where isnull(state,1)=1  

--commit tran --如果啟用分布式事務處理,加上此句  

go  

--建立作業,定時執行資料同步的儲存過程  

if exists(select 1 from msdb..sysjobs where name=』資料處理』)  

execute msdb.dbo.sp_delete_job @job_name=』資料處理』  

exec msdb..sp_add_job @job_name=』資料處理』  

--建立作業步驟  

declare @sql varchar(800),@dbname varchar(250)  

select @sql=』exec p_synchro』 --資料處理的命令  

,@dbname=db_name() --執行資料處理的資料庫名  

exec msdb..sp_add_jobstep @job_name=』資料處理』,  

@step_name = 』資料同步』,  

@subsystem = 』tsql』,  

@database_name=@dbname,  

@command = @sql,  

@retry_attempts = 5, --重試次數  

@retry_interval = 5 --重試間隔  

--建立排程  

exec msdb..sp_add_jobschedule @job_name = 』資料處理』,  

@name = 』時間安排』,  

@freq_type=4, --4 每天,8 每週,16 每月  

@freq_interval=1, --作業執行的天數  

@freq_subday_type=0, --是否重複執行,0x1 在指定的時間, 0x4 分鐘, 0x8 小時  

@freq_subday_interval=1, --重複週期  

@freq_recurrence_factor=0, --重複執行,則設定為1,否則設定為0  

@active_start_time = 00000 --0點開始執行  

--新增目標伺服器  

exec msdb.dbo.sp_add_jobserver  

@job_name = @jobname ,  

@server_name = n』(local)』  

go  

也可以直接建立乙個資料庫的複製。  

即,出版伺服器和訂閱伺服器。  

連線兩台asterisk伺服器 CTI開發

有兩台asterisk伺服器,需要可以撥打註冊在對方伺服器上的分機號。假設有a b兩台伺服器,a上面分機號都以3開頭,如3000 b上面分機號都以8開頭,如8000。在a上新建iax trunk,命名 interoffice 配置如下 peer detail 項 host b的ip位址 qualif...

兩台windows伺服器 SVN的遷移

兩台伺服器,進行svn的遷移 系統平台 windows server 2003 版本庫 test 源伺服器 192.168.1.14 目標伺服器 192.168.1.12 源svn版本庫的path d svn test 要遷移到的path e svn test 第一種方法 推薦 首先說明 這個目標伺...

兩台Linux伺服器建立信任關係

如果在兩台linux伺服器之間經常需要互相訪問,但是需要經常手動輸入密碼,可以在兩台伺服器之間建立乙個信任連線,然後把鑑權檔案寫到乙個檔案裡 步驟1 先在主機a使用命令建立金鑰 步驟二 在 root ssh目錄裡面看到建立的金鑰 ls root ssh 步驟三 把id rsa.pub檔案複製到主機b...