随笔 - 181  文章 - 15  trackbacks - 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔分类

随笔档案

My Tech blog

搜索

  •  

最新评论

阅读排行榜

评论排行榜

4.不同版本数据库之间的数据迁移

一旦你把程序和数据库提交给用户,那么只是重构开发数据库结构就不是重构的全部了。比如,如果一列被从一个表移动到另外一个表,这个操作也许通过一条Sql语句完成,首先把这一列从源表中删除,然后添加到目的表中。一旦重构好的系统处于稳定状态并将提交给用户的时候,我们就不得不面对不同版本之间数据的迁移。在这里,我们将要看到不同的数据迁移策略之于数据库重构的不同影响。

4.1数据库模式的版本化

我们需要把已有的数据库数据迁移到新的数据库中去。当然,在迁移过程当中,老的数据库还将运转。只有当数据的迁移完毕以后,老的数据库模式才可以被摒弃。

新老数据库模式的存在有几种不同的方式。你首先可以以版本来区分它们。比如起名为schema V1,schema V2之类。

当然,数据库中的表也同样可以有版本号。比如Customer V1,Product V2,当然,这多少会给重构的结果带来一些影响。毕竟,外健关系、约束、触发器都是和表名有关系的。一旦新版本的模式被创建,诸如此类与表名有关系的部分可能都需要进行调整。

为了减少这种情况的发生,我们往往采取每一个模式对应一个版本号的方式。

模式的名称让程序能够辨识现在正在使用的是那个版本。大量的经验表明,这是数据迁移的一个先决条件。不要总以为大家都是使用的上一个版本的数据库,而造成把前一个数据库版本的数据混同更早版本的数据库一起进行数据的迁移。因而每一个人都应当清楚他所使用的那个数据库的版本是什么。

4.2迁移步骤

就像前面说的那样,当开发的产品的受众更多的时候,不要期待你的所有用户都使用的是你的上一个版本的软件。用户往往会忽略一些版本的更新。

每进行一次数据迁移,新的数据库版本就是下一次数据迁移的源端。

这样,当新系统被安装的时候,系统的版本识别器需要首先判断当前的数据模式是什么版本,然后依版本逐次进行迁移,进而让数据库的版本达到最新的状态。这就预示着每一个安装包都要整合以前所有的数据迁移程序。对于那些跑了很长时间的重要系统,这就是个问题了。因为有些老的数据迁移程序已经不被新的操作系统所兼容了。在这种情况下,就需要做出一些判断,挑选出那些真正适宜于当前操作系统的数据迁移程序进行打包发布。

不要让客户以为一步就能够把老数据库中的数据迁移到新的数据库中来。甚至可能必须要进行更多的步骤来进行数据迁移。

dbrefactor3

4.3当数据量很大时

当数据量十分巨大时,数据迁移的时间长短就成为了问题。不能指望十亿条数据在很短的时间内就完成转移。而你总不能为了转移数据让银行停止营业吧。

当然,从组织或技术视角看来,这个问题会有不同的解决办法。从组织的角度,你就必须把握好什么时候去修改数据库系统,什么时候迁移数据在时间上才是充足的。并以此为依据制定你的时间表。对于数据库的迁移来说,圣诞节或者东方的一些节日是些不错的选择。

如果技术上允许的话,你可以尝试进行增量迁移数据的方式。数据只会在系统要用到它们的时候才进行迁移。这样的话,迁移的周期也会一定程度的延长,但是系统的活动总是不会被打断。对那些需要7乘24小时运作的系统来说,这也是数据库迁移的唯一途径。

增量迁移的一个先决条件就是应用系统能够同时使用多个数据库的版本。当访问数据库的时候,系统必须知道从哪个数据库能够取得数据。所选择的那些数据将总会被填充到新的数据库中,然后旧数据库中相对应的数据被删除。一旦旧数据库不再包含任何数据的时候,它就可以下岗了。

如果增量的数据迁移比你发布一个新版本应用程序的间歇期还要长,多于两个的数据库版本就会同时存在。

4.4数据迁移的技术

ETL工具可以大大简化数据迁移。ETL即是Extract(抽取),Transform(转换),Load(载入)。ETL工具支持从一个数据源抽取数据,把抽取出来的数据进行转换,然后把它们装载到目标数据库中去。ETL工具通常被用来整合不同的应用。这让它们在EAI(Enterprise Application Integration)领域里面变得举足轻重。

不同版本之间的数据库的数据迁移对于ETL来说只是一个附加用途。事实上,ETL被用来做比这重要的多的事情。这样一个不幸的事实就产生了,作为附加用途来使用ETL,代价太昂贵了,毕竟ETL作为数据整合工具来发售,具有相当高的售价。

幸运的是,在各个数据库之间提供了一个相对“便宜”的ETL工具,那就是--SQL。使用SQL语句,数据可以简单的抽取出来(使用Select),然后载入到另一个数据库中(使用Insert,Update)。然而,SQL并没有直接提供数据转换的能力,但是记录表或存储过程是可以拿过来解决这些问题的。在记录表中,源和目标值总是能够和某个字段进行对应。这样对于一个字段中数据的迁移总是可以通过Insert-Select命令来实现。对于那些打算修改枚举类型的显示值的人来说,这是一种值得推荐的做法。比如如果一个字段以前用M来代表男性,用F来代表女性,而现在则分别要用0和1来取代它们,我们就可以做一个记录表来指示这种对应。

 可能现实中的一些数据迁移要复杂得多,这就必须编写专门的数据迁移程序来做这些事情。今天,很多数据库平台允许直接在数据库中运行JAVA程序。这使得数据迁移受益匪浅,因为数据不再需要从数据库传送到受理数据迁移的主机。因而数据迁移的效率将会大大提高。

posted on 2007-08-16 22:19 littlegai 阅读(166) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理