根据oracle序列重写PK和相关的FK

时间:2015-09-16 23:14:58

标签: oracle liquibase

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

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

我希望能够重写所有序列ID列,以便它们不会与目标数据库中已有的列冲突。

我想避免构建我公司必须管理的东西,并且更倾向于将其上游用于liquibase。

是否有人知道liquibase中的任何内容可能是一个好的起点。

我想在Liquidbase xml上执行此操作,然后将其传递给'update'命令,或者作为更新命令本身的一部分。理想情况下,作为更新命令本身的一部分。

我知道我需要让liquibase知道哪些列是PK序列列和相关的FK列。数据库结构确实已经很好地定义了,所以我应该能够将其读入更新过程。

或者我以为我可以使用jailer的提取模型csv

Jailer - http://jailer.sourceforge.net/

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我实际上已经设法通过命令行来解决这个问题'更新'通过使用自定义更改exec侦听器来命令liquibase。

1)我将MR推送到liquibase以允许注册变更执行监听器

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

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

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

这被证明是一个非常通用的解决方案,并与一些修复程序配合使用,以改善liquibase导出支持,这是一个非常可行和可重用的解决方案。

基本工作流程是:

1)使用jailer从源数据库导出数据子集到liquibase xml

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

3)TODO在目标数据库上运行jailer导出并与原始源数据进行比较。