利用資料庫複製技術 實現資料同步更新
複製的概念
複製是將一組資料從一個資料源拷貝到多個資料源的技術,是將一份資料發佈到多個存儲站點上的有效方式。使用複製技術,用戶可以將一份資料發佈到多台伺服器上,從而使不同的伺服器用戶都可以在許可權的許可的範圍內共用這份資料。複製技術可以確保分佈在不同地點的資料自動同步更新,從而保證資料的一致性。
SQL複製的基本元素包括
出版伺服器、訂閱伺服器、分發伺服器、出版物、文章
SQL複製的工作原理
SQL SERVER 主要採用出版物、訂閱的方式來處理複製。源資料所在的伺服器是出版伺服器,負責發表資料。出版伺服器把要發表的資料的所有改變情況的拷貝複製到分發伺服器,分發伺服器包含有一個分發資料庫,可接收資料的所有改變,並保存這些改變,再把這些改變分發給訂閱伺服器
SQL SERVER複製技術類型
SQL SERVER提供了三種複製技術,分別是:
1、快照複製(呆會我們就使用這個)
2、事務複製
3、合併複製
只要把上面這些概念弄清楚了那麼對複製也就有了一定的理解。接下來我們就一步一步來實現複製的步驟。
第一先來配置出版伺服器
(1)選中指定[伺服器]節點
(2)從[工具]下拉功能表的[複製]子功能表中選擇[發佈、訂閱伺服器和分發]命令
(3)系統彈出一個對話方塊點[下一步]然後看著提示一直操作到完成。
(4)當完成了出版伺服器的設置以後系統會為該伺服器的樹形結構中添加一個複製監視器。同時也生成一個分發資料庫(distribution)
第二創建出版物
(1)選中指定的伺服器
(2)從[工具]功能表的[複製]子功能表中選擇[創建和管理發佈]命令。此時系統會彈出一個對話方塊
(3)選擇要創建出版物的資料庫,然後單擊[創建發佈]
(4)在[創建發佈嚮導]的提示對話方塊中單擊[下一步]系統就會彈出一個對話方塊。對話方塊上的內容是複製的三個類型。我們現在選第一個也就是默認的快照發佈(其他兩個大家可以去看看幫助) 
(5)單擊[下一步]系統要求指定可以訂閱該發佈的資料庫伺服器類型,SQLSERVER允許在不同的資料庫如 ORACLE或ACCESS之間進行資料複製。但是在這裏我們選擇運行"SQL SERVER 2000"的資料庫伺服器
(6)單擊[下一步]系統就彈出一個定義文章的對話方塊也就是選擇要出版的表
(7)然後[下一步]直到操作完成。當完成出版物的創建後創建出版物的資料庫也就變成了一個共用資料庫。
第三設計訂閱
(1)選中指定的訂閱伺服器
(2)從[工具]下拉功能表中選擇[複製]子功能表的[請求訂閱]
(3)按照單擊[下一步]操作直到系統會提示檢查SQL SERVER代理服務的運行狀態,執行複製操作的前提條件是SQL SERVER代理服務必須已經啟動。
(4)單擊[完成]。完成訂閱操作。
完成上面的步驟其實複製也就是成功了。但是如何來知道複製是否成功了呢?這裏可以通過這種方法來快速看是否成功。展開出版伺服器下面的複製——發佈內容——右鍵發佈內容——屬性——擊活——狀態然後點立即運行代理程式接著點代理程式屬性擊活調度把調度設置為每一天發生,每一分鐘,在0:00:00和23:59:59之間。接下來就是判斷複製是否成功了打開C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以時間做為檔案名的檔夾差不多一分中就產生一個。要是你還不信的話就打開你的資料庫看在訂閱的伺服器的指定訂閱資料庫下看是不是看到了你剛才所發佈的表
gt:
/*--資料庫資料複製
將一個資料庫中的資料複製到另一個資料庫
如果某列在目標資料庫中為標識列,將不會被複製適用範圍:資料庫結構發生了變化,想將舊資料庫進行升級
這樣就可以根據新的資料庫結構創建一個空庫,然後
將舊資料庫的所有資料複製到新庫中
/*--調用示例exec p_copydb '源資料庫','目標資料庫'
exec p_copydb 'acc_五醫','acc_演示資料8'
--*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_copydb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_copydb]
GOcreate proc p_copydb
@o_dbname sysname, --要複製資料的資料庫--源資料庫
@n_dbname sysname, --接收資料的資料庫--目標資料庫
@cleardb bit=0 --清空目標資料庫
as
declare @sql nvarchar(4000)--禁用約束,防止複製時的資料衝突
set @sql='declare #tbc cursor for select name,tbname=object_name(parent_obj)
from '+@n_dbname+'..sysobjects where xtype in(''C'',''F'')'
exec(@sql)
declare @name sysname,@tbname sysname
open #tbc
fetch next from #tbc into @name,@tbname
while @@fetch_status=0
begin
set @sql='alter table '+@n_dbname+'..['+@tbname+'] NOCHECK CONSTRAINT ['+@name+']'
exec(@sql)
fetch next from #tbc into @name,@tbname
end
close #tbc--複製資料
declare @sql1 varchar(8000)
set @sql='declare #tb cursor for select a.name from '
+@o_dbname+'..sysobjects a inner join '
+@n_dbname+'..sysobjects b on a.name=b.name
where a.xtype=''U'' and b.xtype=''U'''
exec(@sql)
open #tb
fetch next from #tb into @tbname
while @@fetch_status=0
begin
select @sql1=''
,@sql='select @sql1=@sql1+'',[''+a.name+'']'' from(
select name from '+@o_dbname+'..syscolumns where id in 
(select id from '+@o_dbname+'..sysobjects where name='''+@tbname+''')
) a inner join (
select name from '+@n_dbname+'..syscolumns where status<>0x80 and id in 
(select id from '+@n_dbname+'..sysobjects where name='''+@tbname+''')
) b on a.name=b.name'
exec sp_executesql @sql,N'@sql1 nvarchar(4000) out',@sql1 outselect @sql1=substring(@sql1,2,8000)
exec('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
+') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
if @@error<>0
print('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
+') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
fetch next from #tb into @tbname
end
close #tb
deallocate #tb--資料複製完成後啟用約束
open #tbc
fetch next from #tbc into @name,@tbname
while @@fetch_status=0
begin
set @sql='alter table '+@n_dbname+'..['+@tbname+'] CHECK CONSTRAINT ['+@name+']'
exec(@sql)
fetch next from #tbc into @name,@tbname
end
close #tbc
deallocate #tbc
go
backup database sys to disk='\\ip\共用目錄\a.bak' with init
許可權問題!!!
如:
SQLServer備到FileServer上
那你的SQLServer的啟動用戶必須在FileServer上有足夠的許可權!
--------------------^^^---------------------------------
1、SQLServer上新建一SQLUser用戶許可權大一點。
2、FileServer上建同一用戶對某一檔夾有足夠許可權。
3、兩機的SQLUser密碼相同(方便一點)
4、將SQLServer改為SQLUser啟動
(管理工具-->服務-->mssql項-->屬性-->指定用戶及密碼)
5、\\192.168.*.*\文件夾\ShareBak.Bak就可以了
-----------------------------------------------------------
簡單一點就是:
如果你兩台都是windows2ks
你的機器也用同樣的Administrator密碼,且sql伺服器用administrator啟動
那你寫設備時就可以寫:\\ip\.......如果對方是98那你要完全共用一下!
你寫設備時就可以寫:\\ip\.......

解决方案 »

  1.   

    如果你的两台电脑都要用,而且两台电脑的数据都在更新的话,就有SQL的发布/订阅吧.
      

  2.   

    如果你是一台服务器更新,另一台服务只是备查,不更新数据.也可以用SQL的日志传送功能,这样的好处是配置简单一点,对数据库没有要求.
    只是要求你的SQL中企业版的
    具体的参考:SQL Server 2000之日志传送功能    DigJim(原作)http://www.csdn.net/Develop/list_article.asp?author=digjim
      

  3.   

    用SQL的快照复制就很简单.如果两台服务器都要更新数据,那配置就比较麻烦,更新冲突是最主要要考虑的问题.
    对数据库的结构有一定要求. 具体的你配置一次就知道了.