0

任务:将数据库中的所有数据(没有模式)复制到另一个数据库(可能是不同类型的)。我无法修改源数据库,所以它是只读备份

上下文:将 Oracle 与许多数据库集成。现在我正在集成 Oracle 和 Postgres。

资源:仅连接字符串,能够以最高可用权限连接数据库。(我无法通过 ssh 访问它 - 无法通过 ssh 创建有序备份和下载文件,或者编译和启动 web/ftp 服务器等)

问题:是否有任何经过验证且快速的方法来提取这些数据?也许有人有一个干净代码的开源解决方案?

此处出现“快速”一词是因为仅一次选择 N 行(使用 rownum 或 row_number())并传输到目标数据库或中间文件太慢。

4

2 回答 2

1

我建议你看看Liquibase。我已经成功地使用它来使架构和数据在多个环境中保持一致(尽管只有 SQLServers,但我确信它也适用于不同的 RDBMS)。

至于性能,我有点担心,正如您提到的“TB 级数据”......不过,它可能值得一试。

干杯,

于 2012-10-24T11:10:39.033 回答
1

像 spring-batch 这样的轻量级 ETL 工具可能是完成这项任务的完美工具。

数据块的微观管理就是它所写的。

看一下 jdbc 游标示例:您只需配置 SELECT 和 INSERT 语句以及映射,Spring-Batch 将负责分页。

您可以在 github 中找到它: https ://github.com/SpringSource/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/iosample/jdbcCursor.xml

可以在以下位置找到参考: http ://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#database

Spring批处理保持已经处理了多少记录的状态,并允许继续先前崩溃的过程。它通过将计数器保存在“jobRepository”中来做到这一点,例如,它可以在第三个数据库中。

当然,这是纯java方案,native方案可能会更快,但如果你只获取JDBC连接字符串,你可能会试一试。这还假设您知道要传输的所有表的表结构。如果没有,简单的 JDBC 工具(例如 SquirrelSQL)可以帮助您。

问候,吉尔特。

于 2012-10-24T11:25:14.560 回答