使用 LOB 数据迁移大表的挑战
Posted
技术标签:
【中文标题】使用 LOB 数据迁移大表的挑战【英文标题】:Challenge in Migrating Huge Table with LOB Data 【发布时间】:2016-10-12 01:57:45 【问题描述】:我们正在尝试将大约 230 GB 的 Oracle EC2 托管数据库迁移到 RDS。数据库的挑战在于有一个 150GB 的表,其中包含大量 LOB 数据。当我们尝试使用 Oracle 导入/导出(数据泵)迁移数据时,导出 150 GB 表和 LOB 数据大约需要 9.5 小时,将转储导入 RDS 需要 2 小时,而其他表迁移得相当快。我们正在使用具有最高配置的实例,但仍然没有看到性能有任何改进。
只是为了查看在 EC2 上再次导出 150GB 转储的时差,而在第二次运行中仅用了 3 小时。有人可以建议我一种更好的方法来减少导出/导入时间。
PS:我们也尝试使用 RedGate 工具来识别 Oracle 数据库之间的架构和数据差异,但该工具也无法对 Huge LOB 表进行比较。
【问题讨论】:
您是否尝试过将并行选项与 Datapump 导出和导入一起使用? 不幸的是,我们考虑了它,但并行参数仅在企业版中有效,我们没有使用企业版。 :( 你可以使用可传输的表空间吗?然后你可以复制数据文件。 oracle-base.com/articles/misc/transportable-tablespaces 一个建议是导出/导入除大表数据之外的所有内容(您只导入没有数据的表定义)。在新迁移的实例上启动应用程序,然后对数据进行 exp/imp。 【参考方案1】:我发现迁移大量 LOB 的最快方法如下:
提取
编写将处理给定 ID 范围的客户提取 (Java) 价值观。 将每行的非 LOB 数据写入 CSV,将 LOB 写入 一个文件并在 CSV 中为每一行引用该文件。 并行运行尽可能多的数据提取(这些是外部 Java 进程,因此不应被 Oracle 对您的许可证的限制所阻止) 最好将数据提取写入可在两台服务器之间“切换”的文件系统。如果可能的话,拥有尽可能多的这些文件系统 并行提取进程正在运行。加载
使用 SQLLoader。它有一个选项
image_fname 填充字符(80), 图像 LOBFILE(image_fname) 由 EOF 终止
使用 DIRECT=Y 进行实验 - 在某些版本 (10g) 上,我发现它有点不可靠,并且在我的项目中经常出现崩溃,但在这种类型的负载下它可能会有所改善。
李>同样,尽可能使用并行 sql 加载程序 - 您可能希望禁用约束和索引,或使用反向索引来减少并行加载的块争用。
您可以考虑在目标上进行分区并并行加载每个分区。
使用“swinging”文件系统的好处是可以消除网络瓶颈。
这些说明是一般指南,并非具体说明,需要进行一些调整和实验才能获得最佳组合。
【讨论】:
【参考方案2】:关于您使用 RedGate 比较数据的 PS 说明,我认为这是用于数据核对。
再说一次,我只能提供一般指导,但在我上次迁移时,我有 TB 的数据要比较,并且使用传统的磁盘报告和差异分析太慢,而且我们没有足够的磁盘。
所以我所做的是编写 Java(因为它通常在 Oracle 服务器上可用,并且您确实希望在其中一台服务器上运行以最大程度地减少网络瓶颈)程序,该程序执行以下操作:
打开与两个数据库的 JDBC 连接 指定要处理的表、ID 范围和批量大小 从表中读取给定范围范围 ID 中的行,并用批量大小填充内存区域 - 我使用了 java.util.concurrent.ArrayBlockingQueue 和 java.util.concurrent.BlockingQueue 对象 使用线程从两个数据库中读取数据 当两个队列都填满时,对 2 个队列运行比较关于比较 blob,我采用的方法是使用 DBMS_CRYPTO 对 LOB 值进行散列并比较它们。这减少了读入 Java 的数据量。突出显示任何差异以供进一步调查。
显然,作为 Java 外部进程,它可以并行运行到最佳数量。事实证明,这种方法比我们现有的其他工具更快。
从这个项目开始,我发现 Oracle 提供了一个名为 DBMS_COMPARISON 的新包。看看这个可能是值得的。我正在寻找机会将此与我的自定义解决方案进行比较。
【讨论】:
非常感谢..我会看看的。以上是关于使用 LOB 数据迁移大表的挑战的主要内容,如果未能解决你的问题,请参考以下文章