我们正在尝试将大约230 GB的Oracle EC2托管数据库迁移到RDS中。 DB面临的挑战是有一个150GB的表,它有很多LOB数据。当我们尝试使用Oracle Import / Export(数据泵)迁移数据时,需要大约9.5小时才能导出150 GB表,并且需要2小时才能将转储导入RDS,而其他表迁移速度相当快。我们正在使用配置最高的实例,但仍然没有看到性能方面的任何改进。
只是看到时间差在EC2上再次导出150GB转储,在第二次运行时只花了3小时。有人可以建议我一个更好的方法来减少出口/进口时间。
PS:我们还尝试使用RedGate工具识别Oracle数据库之间的架构和数据差异,但此工具也无法在巨大的LOB表上执行比较。
答案 0 :(得分:1)
我发现迁移大量LOB的最快方式如下:
摘录强>
<强>加载强>
使用SQLLoader。它有一个选项
image_fname FILLER CHAR(80), 图像LOBFILE(image_fname)由EOF终止
使用DIRECT = Y进行实验 - 在某些版本(10g)上我发现它有点不可靠,并且我的项目中的常规程序崩溃了,但是这种负载可能会有所改善。
同样,尽可能使用并行sql加载程序进程 - 您可能希望禁用约束和索引,或使用反向索引来减少并行加载的块争用。
您可以考虑在目标上进行分区并并行加载每个分区。
使用“摆动”文件系统的优点是可以消除网络瓶颈。
这些注释是一般指南,并非具体,需要进行一些调整和实验才能获得最佳组合。
答案 1 :(得分:0)
关于使用RedGate比较数据的PS说明,我假设这是用于数据对帐。
同样,我只能提供一般性指导,但在我上次迁移时,我有数TB的数据要比较,使用传统的磁盘报告和差异太慢而且我们没有足够的磁盘。
所以我所做的就是编写Java(因为它通常在Oracle服务器上可用,并且你真的希望在服务器上运行以最小化网络瓶颈)程序执行以下操作:
关于比较blob,我采用的方法是使用DBMS_CRYPTO来散列LOB值并进行比较。这减少了读入Java的数据量。突出显示任何差异以供进一步调查。
显然,作为Java外部进程,它可以并行运行,直到达到最佳数量。事实证明,这种方法比我们现有的其他工具更快。
这个项目我发现Oracle提供了一个名为 DBMS_COMPARISON 的新包。看这个可能值得你这么做。我正在寻找机会将其与我的自定义解决方案进行比较。