使用LOB数据迁移大表的挑战

时间:2016-06-11 02:41:37

标签: oracle amazon-web-services oracle11g database-migration amazon-rds

我们正在尝试将大约230 GB的Oracle EC2托管数据库迁移到RDS中。 DB面临的挑战是有一个150GB的表,它有很多LOB数据。当我们尝试使用Oracle Import / Export(数据泵)迁移数据时,需要大约9.5小时才能导出150 GB表,并且需要2小时才能将转储导入RDS,而其他表迁移速度相当快。我们正在使用配置最高的实例,但仍然没有看到性能方面的任何改进。

只是看到时间差在EC2上再次导出150GB转储,在第二次运行时只花了3小时。有人可以建议我一个更好的方法来减少出口/进口时间。

PS:我们还尝试使用RedGate工具识别Oracle数据库之间的架构和数据差异,但此工具也无法在巨大的LOB表上执行比较。

2 个答案:

答案 0 :(得分:1)

我发现迁移大量LOB的最快方式如下:

摘录

  • 编写将处理给定ID范围的客户提取(Java) 值。
  • 将每行的非LOB数据写为CSV,将LOB写为 一个文件,并在每行的CSV中引用该文件。
  • 并行运行尽可能多的提取(这些是外部Java进程,因此不应被Oracle许可证限制阻止)
  • 优选地将提取物写入可以在两个服务器之间“摆动”的文件系统。如果可能的话,拥有尽可能多的这些文件系统 并行提取进程正在运行。

<强>加载

  • 使用SQLLoader。它有一个选项

    image_fname FILLER CHAR(80),    图像LOBFILE(image_fname)由EOF终止

  • 使用DIRECT = Y进行实验 - 在某些版本(10g)上我发现它有点不可靠,并且我的项目中的常规程序崩溃了,但是这种负载可能会有所改善。

  • 同样,尽可能使用并行sql加载程序进程 - 您可能希望禁用约束和索引,或使用反向索引来减少并行加载的块争用。

您可以考虑在目标上进行分区并并行加载每个分区。

使用“摆动”文件系统的优点是可以消除网络瓶颈。

这些注释是一般指南,并非具体,需要进行一些调整和实验才能获得最佳组合。

答案 1 :(得分:0)

关于使用RedGate比较数据的PS说明,我假设这是用于数据对帐。

同样,我只能提供一般性指导,但在我上次迁移时,我有数TB的数据要比较,使用传统的磁盘报告和差异太慢而且我们没有足够的磁盘。

所以我所做的就是编写Java(因为它通常在Oracle服务器上可用,并且你真的希望在服务器上运行以最小化网络瓶颈)程序执行以下操作:

  • 打开与两个数据库的JDBC连接
  • 指定要处理的表格,ID范围和批量大小
  • 从表中读取给定范围范围内的行,并用批量大小填充内存区域 - 我使用了java.util.concurrent.ArrayBlockingQueue和java.util.concurrent.BlockingQueue对象
  • 使用线程从两个数据库中读取数据
  • 当两个队列填满时,在2个队列上运行比较

关于比较blob,我采用的方法是使用DBMS_CRYPTO来散列LOB值并进行比较。这减少了读入Java的数据量。突出显示任何差异以供进一步调查。

显然,作为Java外部进程,它可以并行运行,直到达到最佳数量。事实证明,这种方法比我们现有的其他工具更快。

这个项目我发现Oracle提供了一个名为 DBMS_COMPARISON 的新包。看这个可能值得你这么做。我正在寻找机会将其与我的自定义解决方案进行比较。