分享

基于 SQL SERVER 的分布式数据库设计与实现

 远方 2018-06-02

     摘 要:提出了如何充分利用 MS SQL Server 2000 的数据库管理特性,采用链接服务器、分布式分区视图和存储过程构建分布式数据库,以及基于数据库复制技术实现混合式的数据分布。实验实现了分布式数据库的水平分片、垂直分片和混合式数据分布。


     关键词: 分布式数据库分布式分区视图链接服务器存储过程



一.  引言

       随着网络与数字通信技术的飞速发展,应用的数据再也不是存储在一个单一的场地,而是可能分布在全球的任何位置。对这样由多个分散数据库组成的管理信息系统,如何以最小代价将其整合成分布式数据库系统也就成为了迫切需要解决的问题 [1] 。MS SQL Server 2000 分布式数据库功能 [2] 允许用户把多个不同场地的数据库当作一个完整的数据库看待,允许用户透明地查询和操作远程数据库实例的数据,并使应用程序看起来只有一个大型的集中式数据库,用户可以在任何一个场地执行全局应用,具有数据分布透明性和逻辑整体性等特点。


二.  分布式数据库系统的设计

1.创建和使用数据库链接(链接服务器

      数据库链接是定义一个从某一数据库服务器到另一数据库服务器的单向通信路径指示器。可以使用企业管理器或者 T-SQL 代码来建立链接服务器。链接服务器可以是 SQL Server或者任何其他的 OLE DB 和 ODBC 数据源,只要相应的驱动程序支持,分布式查询就可以检索和修改相应数据源中的数据。使用创建好的链接服务器,对用户来说,数据分布就是透明的,用户就好像使用本地集中式数据库一样,同时使用链接服务器的查询代码具有更好的移植性,也更加易于维护。


2.采用分布式分区视图实现水平分片 [3]

      将表分区就是将表按照分区键划分为两个或两个以上更小的分段。分区键通常选择一个经常被用来选取特定范围的数据字段,这样分区的效率最高。通过创建分区视图合并所有分区表,实现对整个数据集的访问。SQL Server 支持两种类型的分区视图 [2] :本地的和分布的。分布式分区视图,也称为联合数据库,将分区表分布在多个场地的服务器上。使用链接服务器和分布式分区视图方法可以构建以水平分片的分布式数据库系统。


3.采用存储过程实现垂直分片(一条记录存在多个表中)
      SQL Server 没有提供现成的技术实现垂直分片的分布式数据库系统,但可以使用链接服务器和存储过程相结合的方法,将用户提交的全局操作转变为对多个场地的垂直分片表的局部操作,使用存储过程可以保证分布式事务的 ACID 特性。存储过程是存储在服务器上的预编译好的 SQL 语句集。使用存储过程将对多个场地的垂直分片表的操作放在一个分布式事务内,要么全部提交,要么全部回退,保证了分布式数据库系统数据的一致性。



4.采用数据库复制技术实现混合式数据分布 [2,4]

      分布式数据库系统必须以最小的代价保持各冗余副本的一致性,即对一个数据库的逻辑对象的修改,必须传播到该对象的所有副本,同时做相同的修改。SQL Server 使用数据库复制技术来解决这一复杂问题。SQL Server 复制是按照出版业的运作模式来工作的,它包括 3 个代理——分发者、发布者和订阅者。本文采用事务复制保持各冗余副本的数据一致性。


三.  使用 SQL Server 2000  构建分布式数据库

      以学校计算机系(CS),外语系(FD),数理系(MP),教务处(JW)为例,具体构建水平和垂直分片的混合分布的分布式数据库系统。四个 SQL Server 数据库实例位于各个系处,前三个系各自保存本系的学生信息表,如计算机系 info_student_cs,教务处保存三个系的学生信息副本。


1. 创建数据库和表

(1)计算机系数据库 dbcs,学生信息表 info_student_cs,分区键 sdept,分区键必须是主键的一部分。
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)在外语系、数理系数据库实例上分别创建数据库 dbfd,dbmp,学生信息表info_student_fd,info_student_mp,分区键仍是 sdept,检查约束分别改为 check(sdept='FD')和 check(sdept='MP')。在教务处数据库实例上创建 dbjw。


2.创建链接服务器

分别在四台服务器上建立双向的数据库链接,以创建计算机系到外语系的链接服务器(CS_FD)为例。


exec sp_addlinkedserver   'FD', ' ', 'SQLOLEDB ', '192.168.5.9' 

exec sp_addlinkedsrvlogin  'FD', 'false ',null, 'sa', 'wzdq@01' 



3. 采用分布式分区视图实现水平分片

        分别在三个系服务器上创建分布式分区视图,以计算机系为例。


create view info_student
as
select * from info_student_cs
union all
select * from fd.dbfd.dbo.info_student_fd;


         到这里,整个水平分片的分布式数据库系统已经建立完毕。

        现在可以在三个系的任何位置,只要访问本地 info_student 分布式分区视图,就实现了所有分布式数据库的操作。

       此时,对数据库的全局操作和局部操作就如同操作本地集中式数据库一样。


①插入数据。若当前客户端连接在外语系服务器上,执行 insert into info_student values('S006128','LIUJ','CS','F','20'),由于 sdept=’CS’,所以系统会自动将这条记录插入到计算机系的学生信息表 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


②修改数据。若客户端连接在数理系服务器上,执行 update info_student set sdept='FD'where sno='S006128',由于执行前sdept=’CS’,执行后 sdept=’FD’,所以系统会自动将这条记录从计算机系移动到外语系的学生信息表 info_student_fd 中,实现了学生改专业、换院系的功能。


③删除数据。若客户端连接在计算机系服务器上,执行 delete from info_student where
sno=’S006128’,由于这条记录 sdept=’FD’,所以系统会自动将这条记录从外语系服务器上删

除。


4. 采用存储过程实现垂直分片

        设表 info_student 存储学校所有学生信息,进行垂直分片后生成两张表 info_student1(sno,sname,sdept)保存在 A 服务器的数据库 DB1 上,info_student2(sno,sex,age)保存在 B服务器的数据库 DB2 上,在 A 与 B 上建立存储过程 add_student,并相互建立数据库链接。


  下面仅以插入数据为例,介绍如何保持分布式事务的一致性。在 A 上建立存储过程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


         接着执行存储过程 EXEC ADD_STUDENT 'S005129','CWK','MP','M',24,这样系统就会分别在 A 和 B 服务器上的垂直分片后的学生信息表内插入对应的数据。类似可解决修改和删除操作,本文不再具体阐述。


5. 采用复制技术实现混合式数据分布

       教务处需要保存三个系的学生信息表副本,为了将事务一致性保持在令人满意的范围内,本文采用事务复制方式。将三个系(发布服务器)的初始快照传播到教务处(订阅服务器),当三个系服务器上发生数据修改时,捕获个别事务并传播到教务处,从而得以在订阅服务器间维护事务的一致性。


四.  结论

    本文论述了在 SQL Server 2000 的数据库系统中,采用链接服务器、分布式分区视图和存储过程相结合的方法来架构分布式数据库系统,并基于数据库复制技术实现混合式的数据分布。同时也深入探讨了设计和实现方法,取得了令人满意的实验效果。提出的架构分布式数据库方法实现了数据分布的透明性,简化了数据访问、降低了维护复杂度,在应用中具有一定的优势。




参考文献
[1] 邵佩英. 分布式数据库系统及其应用(第二版). 北京:科学出版社,2005
[2] Paul Nielsen,刘瑞等译. Microsoft SQL Server 2000 宝典[M]. 北京:中国铁道出版社,2004
[3] 曾文全. 基于 SQL Server 2000 的分布式数据库的架构[J]. 教育信息化,2006-1,24~25
[4] 杜杏菁. 分布式数据库中复制技术的研究[J]. 华北科技学院学报,2004,1(3),88~91

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多