基于oracle序列重写PK和相关FK



我想将客户数据子集从一个共享数据库环境迁移到另一个共享数据库环境。我使用hibernate,并且有相当多的ID和FK_ID列,这些列是从oracle序列自动生成的。

我有一个从jailer导出的liquid base更改日志,其中包含客户特定数据。

我希望能够重写所有的序列ID列,这样他们就不会与目标数据库中已经存在的内容冲突。

我想避免建立一些我的公司必须管理的东西,并且更愿意将其上游到liquidbase。

有没有人知道liquidbase里面有什么东西可能是一个好的开始。

我想在将其传递给'update'命令之前在liquidbase xml上这样做,或者作为更新命令本身的一部分。理想情况下,作为update命令本身的一部分。

我知道我需要让liquidbase知道哪些列是PK序列列以及相关的FK列。数据库结构确实有很好的定义,所以我应该能够将其读取到更新过程中。

或者我认为我可以使用从狱卒

提取模型csv

狱卒- http://jailer.sourceforge.net/

我认为,对于这样的一次性数据迁移,Liquibase并不是最好的工具。它确实更适合模式管理,而不是数据管理。我认为像Pentaho这样的ETL工具会是一个更好的解决方案。

我实际上通过使用自定义更改执行器,在liquibase的命令行'update'命令中自己设法弄清楚了。

1)我将MR推到liquibase以允许注册更改执行侦听器

2)我实现了自己的change exec侦听器,它拦截每个插入语句并将每个FK和PK字段重写为尚未在目标数据库中分配的字段。我通过使用oracle序列来实现这一点。为了避免每次获取新序列都必须返回数据库,我实现了自己版本的hibernate序列缓存

https://github.com/liquibase/liquibase/pull/505

https://github.com/pellcorp/liquibase-extensions

这被证明是一个相当通用的解决方案,并且与一些向上修复到jailer以改进liquidbase导出支持相一致,它是一个非常可行和可重用的解决方案。

基本工作流程是:

1)使用jailer从source db导出一个数据子集到liquidbase xml

2)运行liquibase update命令,使用针对目标的自定义exec更改侦听器。

在目标数据库上运行越狱程序导出,并与原始源数据进行比较。

最新更新