Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 迁移具有LOB数据的大型表时面临的挑战_Oracle_Amazon Web Services_Oracle11g_Database Migration_Amazon Rds - Fatal编程技术网

Oracle 迁移具有LOB数据的大型表时面临的挑战

Oracle 迁移具有LOB数据的大型表时面临的挑战,oracle,amazon-web-services,oracle11g,database-migration,amazon-rds,Oracle,Amazon Web Services,Oracle11g,Database Migration,Amazon Rds,我们正在尝试将大约230 GB的Oracle EC2托管数据库迁移到RDS中。DB面临的挑战是,有一个150GB的表包含大量LOB数据。当我们尝试使用Oracle导入/导出(数据泵)进行数据迁移时,导出150 GB的表大约需要9.5小时,其中包含LOB数据,将转储导入RDS需要2小时,而其他表迁移速度相当快。我们正在使用配置最高的实例,但性能仍然没有任何改进 只是为了看到时差,在EC2上再次导出了150GB转储,在第二次运行中只花了3小时的时间。有人能给我建议一个更好的方法来减少进出口时间吗 P

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

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


PS:我们还尝试使用RedGate工具来识别Oracle数据库之间的模式和数据差异,但该工具也未能对大型LOB表执行比较

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

提取

  • 编写一个客户摘录(Java),它将处理给定范围的ID 价值观
  • 将每行的非LOB数据写入CSV,将LOB写入CSV 一个文件,并在CSV中为每一行引用该文件
  • 并行运行尽可能多的摘录(这些是外部Java进程,因此不应被Oracle对您的许可证的限制所阻止)
  • 最好将摘录写入可在两台服务器之间“摇摆”的文件系统。如果可能,请尽可能多地使用这些文件系统 并行提取进程正在运行
加载

  • 使用SQLLoader。它有一个选择

    图像名称填充字符(80), 图像LOBFILE(图像\u fname)由EOF终止

  • 在一些版本(10g)上使用DIRECT=Y进行实验,我发现它有点不可靠,并且在我的项目中经常出现崩溃,但是使用这种类型的负载可能会有所改进

  • 同样,在可能的情况下使用并行sql加载程序进程—您可能希望禁用约束和索引,或者使用反向索引来减少并行加载的块争用

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

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


这些注释是一个通用指南,不是具体的,需要一些调整和实验来获得最佳的组合。

关于您关于使用RedGate比较数据的PS注释,我认为这是为了数据协调

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

因此,我所做的是编写Java(因为它通常在Oracle服务器上可用,并且您确实希望在其中一台服务器上运行,以最大限度地减少网络瓶颈)程序,该程序执行以下操作:

  • 打开到两个数据库的JDBC连接
  • 指定要处理的表、ID范围和批大小
  • 从表中读取给定范围rage ID中的行,并用批大小填充内存区域-我使用了java.util.concurrent.ArrayBlockingQueue和java.util.concurrent.BlockingQueue对象
  • 使用线程从两个数据库读取数据
  • 当两个队列都已满时,对这两个队列进行比较
关于比较BLOB,我采用的方法是使用DBMS_CRYPTO散列LOB值并进行比较。这减少了读入Java的数据量。任何差异都被强调以供进一步调查

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


自从这个项目以来,我发现Oracle提供了一个名为“DBMS\U比较”的新包。这可能值得你去看看。我正在寻找机会将其与我的自定义解决方案进行比较。

您是否尝试过在数据泵导出和导入中使用并行选项?不幸的是,我们考虑过,但并行参数仅在企业版中有效,我们不使用企业版:(您可以使用可传输的表空间吗?然后您可以复制数据文件。建议导出/导入除大表数据以外的所有数据(只导入表定义而不导入数据)。在新迁移的实例上启动应用程序,并在这之后导出/导入数据。非常感谢..我将查看它。