1数据库复制的原理
数据库复制是在分布式数据库系统中使用非常广泛的技术。分布式数据库系统由多个相同或不同的数据库组成,它们通过局域网或广域网相连,不同数据库的数据之间有非常紧密的关系。在分布式数据库系统中应用可访问本地和远程的数据库,使用客户服务器体系结构处理信息请求。不同物理数据库之间使用数据库链路连接,使得客户端对它们的访问就象访问一个逻辑数据库一样。分布式数据库系统中各个数据库协同工作,但每个数据库节点是个独立的数据库,可由不同部门分别进行管理和数据库的升级,一个数据库出现故障不会影响其它数据库的使用。在分布式数据库系统中的每个独立的数据库一般被称为站点或数据库站点。
在应用中,采用数据库复制的原因是需定期地将信息传播出去,或定期地从某地获得信息。
可以Oracle数据库为例来说明数据库工作的基本原理。Oracle数据库的复制是采用数据库的后台进程自动实现的。负责复制工作的后台进程个数和它们被激活的时间是由数据库参数确定的。数据库的后台进程是由系统进程进行管理,经过设定的时间间隔执行它们预定的工作,以实现数据定期地从源站点到目标站点的传播。Oracle数据库具有基本复制和高级复制方法。所谓基本复制是指从主表到复制点生成的数据是只读的,用户不能对复制生成的数据实施修改操作,这种实体被称为快照。快照的信息将不断地按照设计时定义的时间间隔从主表进行更新,间隔的设定可根据应用对信息要求的实时性而定。高级复制相对基本复制而言各复制点都可对数据进行修改,每个数据库站点进行的修改都可传播到其它站点,每个站点都可看到其它站点输入或修改的数据。数据的一致性是采用高级复制时须全面考虑的问题。
数据库的复制用途很大,但不同的应用有不同的要求,Oracle提供的复制方法能满足大多数的需要,但有的实际问题,如带有统计汇总计算功能的复制,只有利用Oracle提供的思想方法自行开发复制软件,将复制和汇总合二为一。理解了复制工作的基本原理后,自行开发复制软件也就是轻而易举的事了。
2数据库复制的用途
复制是在分布式数据库系统中获得多个数据库信息的方法,如在部队的数据库系统中用于上级机关了解和获得下属各部队的武器、弹药、物资等的状态情况的数据。还可用于没条件一直处于连接的环境、信息的分布使用、信息汇总、提高性能、备份、平衡应用的负载、大批数据传输等,如连锁店的总店为了统一零售价格、及时将商品的价格发布给各零售店是非常重要的,为达到此目的,每个零售店的数据库拥有价格列表的复制品,每天晚上从总店的主表更新,这是信息的分布使用的典型例子。大批数据传输主要用于从别的数据库系统中导入数据,如从联机事务处理系统中将信息复制到决策支持系统中等。
一般说来,应用只存取本地数据库的数据,而限制对远程数据库数据的存取,以减少网络的负担,提高性能;另一方面,如果重要的数据已被复制到其它服务器,那么在本地服务器出现故障时,系统仍然可用。使用复制技术还能提高数据库存取的性能、数据的安全性和加强应用的限制。
利用数据库复制的方法有利于及时获得最新信息,有利于减少用户的重复劳动,有利于及时维护数据库的一致性。
3数据库复制设计的基本步骤
数据库复制的基本工作方式是,定义一个查询,使用数据库的作业管理机制,自动地、定期地从主表更新数据。
3.1基本复制
基本复制的设计主要包括以下步骤:
(1)建立复制环境,确定哪些主表将被复制,复制到哪些站点的数据库;
(2)在复制的各站点,建立复制用户和复制的数据库链路;
(3)在被复制的数据库中建立所有主表的更新日志,更新日志是支持快速更新的关键;
(4)在复制的各站点,使用数据库链路建立快照;
(5)在复制的各站点,建立快照的更新组,定义更新时间和更新间隔,将需同时更新的快照加入一个更新组中;
(6)授予需使用快照的用户对快照的查询权限。
3.1.1复制环境
在设计一个分布式数据库系统时,确定哪些主表将被复制,检查每个参加复制的表,确认每个表都有主键。确定每个表中哪些信息以什么形式复制到哪些站点的数据库。将需复制的主表根据其数据关系、应用关系、应用对数据的实时性要求等进行分组。
建议不同服务器中需复制的表在不同的数据库位于相同的用户名下,对应的用户采用相同的口令,以便于操作。而采用高级复制的具有数据复制关系的表的结构在各站点应一致。
3.1.2建立用户和数据库链路
在参加复制的主站点和复制点建立对应的用户以包含复制对象。建立主表所在的数据库到各复制站点的数据库链路。虽然复制一般是在不同数据库的相同用户之间进行,但建立数据库链路时还是需显式地指定连接的用户名和口令。不要建立公共的数据库链路,一般建立属于直接连接的复制用户的私有链路。
3.1.3建立日志
日志是为了记录对主表数据的输入、更新、删除操作,有了日志,系统可识别哪些数据是新产生的需要复制的数据,哪些数据是已经被复制过了的,因此每次更新只需复制那些最新的信息,以减少数据的复制量,降低网络流量,缩短复制的时间。
在被复制的数据库中建立所有主表的更新日志,更新日志只需建立一次即可支持一个站点到多个站点的复制。
3.1.4建立快照
在每个复制站点,建立所需的快照。复制端的快照的逻辑结构是从一个或多个主表中进行查询的SQL语句定义的,同时该SQL语句也定义快照所含的来自主表的那部分信息,它不能包含合计、分组、连接、集合功能。
3.1.5更新
根据对主表的分组情况在复制的各站点建立快照的更新组,根据需要定义更新时间和更新间隔,将需同时更新的快照加入一个更新组中。
必须设定怎样和什么时候更新复制端的数据。可选用完全更新、快速更新、手工更新和自动更新方式。更新时间的设置需遵循以下原则:
·下次更新时间为未来时间;
·更新间隔大于完成一次更新所需时间;
·可指定一具体时间进行手工更新。
出现网络问题或系统错误时,更新将暂时被中断,一旦问题解决,更新将恢复正常。
3.1.6权限
对于使用简单复制方法生成的快照,只需授予用户查询权限,因为快照是只读的;对于使用高级复制方法生成的复制品,可视需求设置不同权限,但由于权限越大,用户可执行的操作越多,产生复制冲突的可能性越大,因此权限还需有限制地授予。
3.2高级复制
高级复制又分为多站点复制和可更新快照复制。其设计原理和步骤与基本复制相似,简述如下。多站点复制包括以下步骤:
(1)设计并建立复制环境,确定哪些站点作为高级复制的站点,哪些主表将参与复制;
(2)使用复制管理器,定义参加复制的站点,在复制的各站点,建立包含复制实体的用户和复制的数据库链路,建立复制的管理用户,配置数据更新的计划;
(3)建立主复制组,不同的需参与复制的实体可加入不同的组中;
(4)授予需使用复制信息的用户以适当的权限。
可更新快照复制包括以下步骤:
(1)设计并建立复制环境,确定哪些站点作为复制的主站点,哪些主表和实体将参与复制,确定哪些为可更新快照的设置站点;
(2)在复制的各站点建立快照管理用户,建立包含可更新快照实体的用户和复制的数据库链路,配置数据更新的时间和间隔;
(3)在主站点建立快照日志;
(4)在复制点建立必要的更新组;
(5)建立快照组,快照组可包含表、存储过程、包、函数、同义词、视图等实体;
(6)授予需使用复制信息的用户以适当的权限。
4数据库复制的设计
4.1数据库的分布
如何分布和设计数据库需视具体工程应用的地理分布、组织关系、数据量、资金和对数据的安全性等情况而定。
数据库复制的设计要尽可能简单,数据关系尽可能简化,只要满足需求即可。尽可能减少维护管理的工作量。
应用存取频繁的数据尽量位于本地数据库,如果这些数据由远程数据库进行管理,则需考虑将其复制到本地,这样既可简化应用程序的设计,又可提高数据的安全性、降低网络流量、提高性能。如果应用程序需要同时存取本地和远程的数据库,设计时一定要通过事务的同时提交或回滚以保证数据的一致性。
如果采用高级复制,因为可能出现多个站点同时修改或输入相同数据的可能,所以数据复制需考虑的首要问题是数据冲突问题。设计中要尽可能避免数据冲突的产生。而设计时不可避免的数据冲突要在设计时确定解决方法,在运行时将其配置于复制环境以利于在冲突产生时数据库能及时解决问题,不致于影响整个复制的工作进程。
4.2数据冲突的解决
数据的冲突是设计人员设计分布式数据库系统的数据库复制时主要解决的问题,数据冲突主要出现在高级复制环境。
4.2.1唯一性约束冲突
如果复制的数据将破坏完整性约束(如当不同站点的事务向参加复制的表中插入主键相同的记录时)将导致唯一性约束冲突。
如果复制方在插入或修改时出现违反唯一性约束问题,则复制方检测到唯一性约束冲突。
多站点复制时网络上不同数据库上的用户同时修改或删除同一记录或同时插入主键相同的记录的矛盾,在设计时要考虑充分,可用以下方法避免:
(1)尽量减少需同时更新数据的站点数;
(2)建立不同取值范围的序列生成器生成主键,避免主键重复的矛盾。但对于站点很多的情况这种方法不合适。避免主键重复的另一方法是在每一站点采用相同的全范围的序列生成器,将其与站点的唯一标识结合作为复合主键;
(3)在应用中不允许修改主键。
4.2.2删除冲突
如果复制方在执行删除和更新操作时,主键不存在,复制方将检测到一个删除冲突。如果一个事务试图删除已经被别的用户删除了的或正被别的用户修改的记录时将出现删除冲突。删除冲突在复制环境中必须避免。可采用异步删除方法,即在应用程序中不采用删除命令,而采用标记需删除的记录,然后系统定期地统一执行删除操作以避免删除冲突。
4.2.3更新冲突
当不同站点的事务在几乎同一时间修改同一记录时将导致更新冲突。
在设计时需尽可能避免更新冲突,但不能彻底杜绝。设计时不能避免的冲突,在设计时要全部理出,针对不同情况配置数据库提供的冲突解决方法解决。但数据库内建的冲突解决功能不能解决删除冲突、对主键的修改、违反参考一致性等冲突,这些需要通过应用的设计解决。
4.3参数的设置
要使复制能自动、正常工作,需在参数文件中适当设置和调整以下参数:
它们决定复制进程启动的时间间隔和复制进程的个数,它们的设置需与复制的作业的多少和间隔进行协调。
一般第一个参数为2(必须大于0)即可,如果数据库中配置的作业非常多、有多个同时更新的作业,需增大此参数。其取值范围为0~9,A~Z。
第二个参数单位为秒,定义唤醒服务器后台进程的时间间隔,使用缺省值60。
如果二者设置不协调,将导致数据库不能及时更新数据或后台进程死锁。
5数据库复制的管理
数据库复制的设计主要由研制方完成,而其管理主要是指系统投入使用后的日常管理工作,主要由使用方的数据库管理员来完成。
5.1参数的修改
在设计时,设计者会综合考虑各种因素以设置参数,但随着用户业务的发展,数据量的增大,在数据库还未出现问题时,数据库管理员应及时地对
JOBQUEUEPROCESS,JOBQUEUE
INTERVAL参数进行调整。如果所设置的参数不能满足应用的需要,数据的复制将出现问题。这可查看快照和数据库的日志文件,如果出现错误,日志中有记录,并且生成CORE文件。后台进程出现的问题数据库自己能解决,但CORE文件需要数据库管理员及时删除,否则由于它增长迅速,将很快占满整个硬盘。
5.2更改复制更新的间隔
复制作业执行的时间和触发的时间间隔也是管理员经常需调整的因素。
数据库管理员能根据需要更改复制间隔时间,以满足需求的变化。每个用户只能更改属于自己的作业执行间隔。
作业间隔的设定一定不能小于执行一次数据更新所需的时间。
5.3取消复制作业
由于某种原因不需继续执行复制操作时可取消复制作业。有两种选择:暂时终止和彻底删除。暂时终止的复制作业在将来需要时可恢复执行,而彻底删除的复制作业不可恢复,只能重建。
用户只能停止或取消属于自己的复制作业。
5.4可能出现的问题
下列情况下数据库的复制不能正常进行:缺少后台进程,网络故障,数据库例程失败,以及复制程序出现错误。
若由于某种原因复制作业不能正常执行,数据库将以一定的时间间隔重复执行此作业,在经过一定次数的尝试后仍不能成功,则该作业将由数据库自动标记为“终止”。一旦造成终止的问题被解决,被终止的作业可人为地让其执行复制(一旦执行成功,该作业的状态将自动改变),或将其状态由终止改为自动执行,让数据库自动执行复制。如果造成终止的问题在数据库发现问题至设定的尝试次数的时间范围之内解决,复制作业将正常执行而不会终止。
如果复制方在设定的时间得不到数据的更新,这时有可能是后台进程死锁,有三种解决方法:人为执行复制作业,将数据复制上来;如果用户并不急需看到更新的数据,那么可以再等待一段时间,Oracle的系统监视进程将自动杀掉死的复制进程,重新生成新的后台进程,复制将自动恢复;关闭并重新打开数据库,复制将自动恢复。
每个用户只能人工执行属于自己的作业。
5.5扩充站点的问题
如果为了满足新的需求,需在已建立好的复制环境中建立新的快照,则以下三个条件同时成立,系统将出错:
(1)新的快照须采用快速更新方式更新;
(2)新的快照与某个已存在的快照是基于相同的主表;
(3)该已存在的快照在创建新的快照时能被快速更新。
解决此问题的方法是新建的快照采用完全更新方式,或采用以下方法避免问题出现:在建新的快照之前建立一个基于同一主表的虚拟快照,以避免在快照创建时的数据更新,然后以快速更新方式建立所需的快照,最后删除虚拟快照。