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