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