当前位置:文档之家› 数据转移方案-时间戳方式

数据转移方案-时间戳方式

数据转移方案
——时间戳方式
文档修订记录
更改类型:*S – START A - ADDED M - MODIFIED D - DELETED
1. 目的
随着医院业务的发展,医院业务产生的数据量与日俱增,医院几年内产生的数据都存储在现有HIS业务数据库中,业务数据库负荷不断增大,一张业务表甚至会存储几百万条记录,这造成业务应用过程中检索数据速度太慢,直接影响了医院的效率。

为减轻现有业务数据库的压力,提高医院运行效率,现提出建立一套历史数据库,将现有业务数据库中过期的数据转移到历史库,减少业务库的数据量,提高HIS系统的运行效率;另一方面,为减轻报表查询对业务操作的影响,分离业务操作和报表查询关联数据库,业务查询关联业务数据库,报表查询关联历史数据库,历史库需要满足对数据的实时查询的需求,必须保持业务库数据与历史库数据的同步。

另外,历史数据库在满足业务库转移数据需求的同时,还要遵循一定的标准和规则,为后期的数据挖掘和决策支持提供基础。

2. 转移方案
根据转移方式的不同,业务库与历史库之间的数据转移可以分两个阶段:初始化转移和增量转移。

初始化转移采用全量抽取的方式(也可看作时间戳方式),抽取一定时间戳前所有的数据,增量转移采用基于时间戳的增量抽取方式,抽取一定时间戳区间的数据。

采用上述转移方案,需要在现有业务库表中添加时间戳字段。

抽取原理如下:
【备注】:
SQL Server中提供的timestamp数据类型是二进制数字,它是数据库中自动生成的唯一二进制数字。

timestamp通常用作给表行加版本戳的机制。

存大小为8个字节。

Timestamp数据类型只是递增的数字,不保留日期或时间。

Timestamp是单个数据库的计数器,不是服务器的计数器。

每个数据库都有一个计数器,当对数据库中包含timestamp 列的表执行插入或更新操作时,该计数器值就会增加。

该计数器是数据库时间戳。

这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。

一个表只能有一个timestamp 列。

每次修改或插入包含timestamp 列的行时,就会在timestamp 列中插入增量数据库时间戳值。

这一属性使timestamp 列不适合作为键使用,尤其是不能作为主键使用。

对行的任何更新都会更改timestamp 值,从而更改键值。

如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。

如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。

如果该列属于索引键,则对数据行的所有更新还将导致索引更新。

使用某一行中的timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。

如果对行进行了更改,就会更新该时间戳值。

如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。

若要返回数据库的当前时间戳值,请使用@@DBTS。

2.1添加时间戳
为业务库中每个数据库表添加时间戳字段,包括jc、mz、yj、ys、zy库,并记录每个库转移的开始时间戳和结束时间戳。

建议建立一个转移时间戳表,用于存储每次转移使用的时间戳区间。

2.2初始化转移
初始化转移采用全量抽取的方式。

全量抽取类似于数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数据库中抽取出来,并转换成历史库标准格式。

遍历所有数据库的所有表,如果库表中记录的时间戳在当前库时间戳,则转移数据记录,如果库表中记录的时间戳大于记录的数据库最大数据库则不进行转移。

例如:jc库当前记录的最大时间戳为:0x00000000001267C8,查询yhlx表中时间戳小于记录的最大时间戳的记录,如下:
select*from test..yhlx where version < 0x00000000001267C8 然后将抽取出的记录数据进行规范化转换并插入到历史库中。

2.3增量抽取
增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据。

如何捕获变化的数据是增量抽取的关键。

时间戳是一种基于快照比较的变化数据捕获方式,在源表
上增加一个时间戳字段,系统中更新修改表数据的时候,系统会自动修改时间戳字段的值。

增量抽取时,读取数据库当前的最大时间戳,根据转移时间戳表中上一次转移的最大时间戳获取本次增量抽取的时间戳区间。

转移程序根据时间戳区间转移业务库变化的数据。

3. 转移过程描述
3.1保留每次数据转移的记录
1)在为数据库添加时间戳前,记录当前数据库的时间戳:select@@DBTS。

默认2000
(0x00000000000007D0)。

2)为数据库表添加时间戳,添加完成后,记录当前数据的新的时间戳:select@@DBTS。

3)将1)、2)得到的时间戳存储到转移时间戳表中,包括库名、开始时间戳、结束时间戳、
转移成功标志等。

其中,1)得到的时间戳作为开始时间戳,2)得到的时间戳作为结束时间戳。

4)数据初始化转移。

转移程序按照转移时间戳表进行数据转移,同步时间戳区间的变更数
据。

转移成功后,更新转移时间戳转移成功标志,并向转移时间戳表中插入一条记录,将当前的结束时间戳作为新纪录的开始时间戳。

如果转移失败,则只更新转移标志。

5)增量转移时,首先当前当前库的最大时间戳select@@DBTS,遍历转移时间戳表获取
当前开始时间戳最大的记录,并将获取的最大时间戳存储到该记录的结束时间戳中,同时置转移标志为空。

转移程序按照按照当前库最新的转移时间戳记录进行数据转移吗,同步时间戳区间的变更数据。

转移成功与失败的处理方式同4)。

3.2不保留每次数据转移的记录
1.更新两次转移记录表
1) 在为数据库添加时间戳前,记录当前数据库的时间戳:0N 。

2) 为数据库添加时间戳之后记录数据库最大时间戳为1N ,存储到转移时间戳表中。

3) 初始化转移,转移程序遍历数据库表中的数据库记录,依据转移时间戳表转移时间
戳在0N ~1N 之间的数据。

转移后,更新转移成功失败标志。

4) 每次增量转移前,获取当前库最大时间戳为k N 。

查询转移时间戳表判断当前库上
次转移是否成功,如果转移标志为“成功”,将当前库的开始时间戳置为1-k N ,结束时间戳置为k N ,转移标志置为空;
如果转移标志为“失败”,当前库的开始时间戳不做更改,结束时间戳置为k N ,转移标
志置为空。

转移程序遍历数据库表中的数据库记录,依据转移时间戳表转移时间戳在1-k N ~k N 或
2-k N ~k N 之间的数据。

转移后,更新转移成功失败标志。

2. 更新一次转移记录表
1) 初始化转移:获取当前库最大时间戳0N ,遍历每张表抽取时间戳小于0N 的所有记
录。

进行数据转移,将抽取出来的数据同步到历史库中。

如果同步成功,更新当前库时间戳字段为0N 。

如果同步失败,不更新,可以采取人
工更新,或者第二天字段同步数据时将昨天失败和今天发生变更的数据一块同步。

2) 增量转移:每次增量转移前,获取当前库最大时间戳k N ,假设转移时间戳表中存储的
当前库时间戳为1-k N ,遍历每张表抽取时间戳以1-k N 为开始,小于k N 的所有记录。

进行数据转移,将抽取出来的数据同步到历史库中。

如果同步成功,更新当前库时间戳字段为k N ;
如果同步失败,不更新,可以采取人工更新,或者第二天自动同步数据时将昨天失败的和今天发生变化的数据一块同步。

相关主题