摘 要:提出了如何充分利用 MS SQL Server 2000 的數據庫管理特性,采用鏈接服務(wù)器、分布式分區視圖和存儲過(guò)程構建分布式數據庫,以及基于數據庫復制技術(shù)實(shí)現混合式的數據分布。實(shí)驗實(shí)現了分布式數據庫的水平分片、垂直分片和混合式數據分布。
隨著(zhù)網(wǎng)絡(luò )與數字通信技術(shù)的飛速發(fā)展,應用的數據再也不是存儲在一個(gè)單一的場(chǎng)地,而是可能分布在全球的任何位置。對這樣由多個(gè)分散數據庫組成的管理信息系統,如何以最小代價(jià)將其整合成分布式數據庫系統也就成為了迫切需要解決的問(wèn)題 [1] 。MS SQL Server 2000 分布式數據庫功能 [2] 允許用戶(hù)把多個(gè)不同場(chǎng)地的數據庫當作一個(gè)完整的數據庫看待,允許用戶(hù)透明地查詢(xún)和操作遠程數據庫實(shí)例的數據,并使應用程序看起來(lái)只有一個(gè)大型的集中式數據庫,用戶(hù)可以在任何一個(gè)場(chǎng)地執行全局應用,具有數據分布透明性和邏輯整體性等特點(diǎn)。
數據庫鏈接是定義一個(gè)從某一數據庫服務(wù)器到另一數據庫服務(wù)器的單向通信路徑指示器??梢允褂闷髽I(yè)管理器或者 T-SQL 代碼來(lái)建立鏈接服務(wù)器。鏈接服務(wù)器可以是 SQL Server或者任何其他的 OLE DB 和 ODBC 數據源,只要相應的驅動(dòng)程序支持,分布式查詢(xún)就可以檢索和修改相應數據源中的數據。使用創(chuàng )建好的鏈接服務(wù)器,對用戶(hù)來(lái)說(shuō),數據分布就是透明的,用戶(hù)就好像使用本地集中式數據庫一樣,同時(shí)使用鏈接服務(wù)器的查詢(xún)代碼具有更好的移植性,也更加易于維護。
將表分區就是將表按照分區鍵劃分為兩個(gè)或兩個(gè)以上更小的分段。分區鍵通常選擇一個(gè)經(jīng)常被用來(lái)選取特定范圍的數據字段,這樣分區的效率最高。通過(guò)創(chuàng )建分區視圖合并所有分區表,實(shí)現對整個(gè)數據集的訪(fǎng)問(wèn)。SQL Server 支持兩種類(lèi)型的分區視圖 [2] :本地的和分布的。分布式分區視圖,也稱(chēng)為聯(lián)合數據庫,將分區表分布在多個(gè)場(chǎng)地的服務(wù)器上。使用鏈接服務(wù)器和分布式分區視圖方法可以構建以水平分片的分布式數據庫系統。
分布式數據庫系統必須以最小的代價(jià)保持各冗余副本的一致性,即對一個(gè)數據庫的邏輯對象的修改,必須傳播到該對象的所有副本,同時(shí)做相同的修改。SQL Server 使用數據庫復制技術(shù)來(lái)解決這一復雜問(wèn)題。SQL Server 復制是按照出版業(yè)的運作模式來(lái)工作的,它包括 3 個(gè)代理——分發(fā)者、發(fā)布者和訂閱者。本文采用事務(wù)復制保持各冗余副本的數據一致性。
以學(xué)校計算機系(CS),外語(yǔ)系(FD),數理系(MP),教務(wù)處(JW)為例,具體構建水平和垂直分片的混合分布的分布式數據庫系統。四個(gè) SQL Server 數據庫實(shí)例位于各個(gè)系處,前三個(gè)系各自保存本系的學(xué)生信息表,如計算機系 info_student_cs,教務(wù)處保存三個(gè)系的學(xué)生信息副本。
create database dbcs
go
use dbcs
create table info_student_cs
(
sno nvarchar(10) not null,
sname nvarchar(40) not null,
sdept nvarchar(2) not null,
sex nvarchar(2) not null,
age int not null,
constraint pk_info_student_cs
primary key(sno,sdept),
constraint uq_info_student_cs_sno
unique(sno),
constraint chk_info_student_cs_sdept
check(sdept='CS'))
(2)在外語(yǔ)系、數理系數據庫實(shí)例上分別創(chuàng )建數據庫 dbfd,dbmp,學(xué)生信息表info_student_fd,info_student_mp,分區鍵仍是 sdept,檢查約束分別改為 check(sdept='FD')和 check(sdept='MP')。在教務(wù)處數據庫實(shí)例上創(chuàng )建 dbjw。
分別在四臺服務(wù)器上建立雙向的數據庫鏈接,以創(chuàng )建計算機系到外語(yǔ)系的鏈接服務(wù)器(CS_FD)為例。
exec sp_addlinkedserver 'FD', ' ', 'SQLOLEDB ', '192.168.5.9'exec sp_addlinkedsrvlogin 'FD', 'false ',null, 'sa', 'wzdq@01'
分別在三個(gè)系服務(wù)器上創(chuàng )建分布式分區視圖,以計算機系為例。
create view info_student
as
select * from info_student_cs
union all
select * from fd.dbfd.dbo.info_student_fd;
到這里,整個(gè)水平分片的分布式數據庫系統已經(jīng)建立完畢。
現在可以在三個(gè)系的任何位置,只要訪(fǎng)問(wèn)本地 info_student 分布式分區視圖,就實(shí)現了所有分布式數據庫的操作。
此時(shí),對數據庫的全局操作和局部操作就如同操作本地集中式數據庫一樣。
①插入數據。若當前客戶(hù)端連接在外語(yǔ)系服務(wù)器上,執行 insert into info_student values('S006128','LIUJ','CS','F','20'),由于 sdept=’CS’,所以系統會(huì )自動(dòng)將這條記錄插入到計算機系的學(xué)生信息表 info_student_cs 中。
插入數據遇到問(wèn)題:
問(wèn)題一、MSDTC不可用解決辦法
http://blog.csdn.net/bobwu/article/details/4392616
問(wèn)題二、鏈接服務(wù)器"fd"的 OLE DB 訪(fǎng)問(wèn)接口 "SQLNCLI10" 返回了消息 "該伙伴事務(wù)管理器已經(jīng)禁止了它對遠程/網(wǎng)絡(luò )事務(wù)的支持。"
http://blog.csdn.net/apollokk/article/details/51543349
問(wèn)題三、OLE DB 訪(fǎng)問(wèn)接口 "SQLNCLI10" 返回了消息 "無(wú)法在此會(huì )話(huà)中啟動(dòng)更多的事務(wù)。"
set XACT_ABORT on
BEGIN DISTRIBUTED TRANSACTION
insert into info_student values('S006129','LIUJ','CS','F','20')
COMMIT TRANSACTION
②修改數據。若客戶(hù)端連接在數理系服務(wù)器上,執行 update info_student set sdept='FD'where sno='S006128',由于執行前sdept=’CS’,執行后 sdept=’FD’,所以系統會(huì )自動(dòng)將這條記錄從計算機系移動(dòng)到外語(yǔ)系的學(xué)生信息表 info_student_fd 中,實(shí)現了學(xué)生改專(zhuān)業(yè)、換院系的功能。
③刪除數據。若客戶(hù)端連接在計算機系服務(wù)器上,執行 delete from info_student where
sno=’S006128’,由于這條記錄 sdept=’FD’,所以系統會(huì )自動(dòng)將這條記錄從外語(yǔ)系服務(wù)器上刪除。
設表 info_student 存儲學(xué)校所有學(xué)生信息,進(jìn)行垂直分片后生成兩張表 info_student1(sno,sname,sdept)保存在 A 服務(wù)器的數據庫 DB1 上,info_student2(sno,sex,age)保存在 B服務(wù)器的數據庫 DB2 上,在 A 與 B 上建立存儲過(guò)程 add_student,并相互建立數據庫鏈接。
下面僅以插入數據為例,介紹如何保持分布式事務(wù)的一致性。在 A 上建立存儲過(guò)程add_student,執行
create proc add_student
(
@sno char(10),
@sname char(40),
@sdept char(2),
@sex char(2),
@age int
)
as
set XACT_ABORT on
BEGIN DISTRIBUTED TRANSACTION
insert into info_student1
values(@sno,@sname,@sdept);
insert into a_b.db2.dbo.info_student2
values(@sno,@sex,@age);COMMIT TRANSACTION
教務(wù)處需要保存三個(gè)系的學(xué)生信息表副本,為了將事務(wù)一致性保持在令人滿(mǎn)意的范圍內,本文采用事務(wù)復制方式。將三個(gè)系(發(fā)布服務(wù)器)的初始快照傳播到教務(wù)處(訂閱服務(wù)器),當三個(gè)系服務(wù)器上發(fā)生數據修改時(shí),捕獲個(gè)別事務(wù)并傳播到教務(wù)處,從而得以在訂閱服務(wù)器間維護事務(wù)的一致性。
本文論述了在 SQL Server 2000 的數據庫系統中,采用鏈接服務(wù)器、分布式分區視圖和存儲過(guò)程相結合的方法來(lái)架構分布式數據庫系統,并基于數據庫復制技術(shù)實(shí)現混合式的數據分布。同時(shí)也深入探討了設計和實(shí)現方法,取得了令人滿(mǎn)意的實(shí)驗效果。提出的架構分布式數據庫方法實(shí)現了數據分布的透明性,簡(jiǎn)化了數據訪(fǎng)問(wèn)、降低了維護復雜度,在應用中具有一定的優(yōu)勢。
聯(lián)系客服