View a markdown version of this page

使用 Oracle Data Pump 导入 - Amazon Relational Database Service

使用 Oracle Data Pump 导入

Oracle Data Pump 是一个实用程序,可让您将 Oracle 数据导出到转储文件并将其导入到另一个 Oracle 数据库。长期来看,它最终会取代 Oracle Export/Import 实用程序。Oracle Data Pump 是将大量数据从 Oracle 数据库迁移到 Amazon RDS 数据库实例的建议方法。

本节中的示例展示了将数据导入 Oracle 数据库的一种方法,但 Oracle Data Pump 支持其他方法。有关更多信息,请参阅 Oracle Database 文档。

本节中的示例使用 DBMS_DATAPUMP 包。您可以使用 Oracle Data Pump 命令行实用程序 impdp 和 expdp 完成相同的任务。您可以在远程主机上安装这些实用程序以作为 Oracle 客户端安装的一部分,包括 Oracle 即时客户端。有关更多信息,请参阅如何使用 Oracle Instant Client 为我的 Amazon RDS for Oracle 数据库实例运行 Data Pump 导入或导出?

Oracle Data Pump 概述

Oracle Data Pump 由以下组件组成:

  • 命令行客户端 expdp 和 impdp

  • DBMS_DATAPUMP PL/SQL 程序包

  • DBMS_METADATA PL/SQL 程序包

您可以将 Oracle Data Pump 用于以下场景:

  • 将数据从 Oracle 数据库(可以是本地或在 Amazon EC2 实例上)导入到 RDS for Oracle 数据库实例。

  • 将数据从 RDS for Oracle 数据库实例导入到 Oracle 数据库(可以是本地或在 Amazon EC2 实例上)。

  • 在 RDS for Oracle 数据库实例之间导入数据,例如将数据从 EC2-Classic 迁移到 VPC。

要下载 Oracle Data Pump 实用工具,请参阅 Oracle Technology Network 网站上的 Oracle 数据库软件下载。有关在 Oracle Database 的版本之间进行迁移时的兼容性注意事项,请参阅 Oracle Database 文档。

Oracle Data Pump 工作流

通常,您在以下阶段使用 Oracle Data Pump:

  1. 将数据导出到源数据库上的转储文件。

  2. 将转储文件上载到目标 RDS for Oracle 数据库实例。您可以使用 Amazon S3 桶或使用两个数据库之间的数据库链接进行传输。

  3. 将数据从转储文件中导入到 RDS for Oracle 数据库实例。

Oracle Data Pump 最佳实践

当您使用 Oracle Data Pump 将数据导入到 RDS for Oracle 实例时,我们建议使用以下最佳实践:

  • 在 schema 或 table 模式中执行导入,以便导入特定架构和对象。

  • 将您导入的架构限制为您的应用程序所需的架构。

  • 请勿在 full 模式下导入,也不要导入系统维护的组件的架构。

    因为 RDS for Oracle 不允许 SYS 或 SYSDBA 管理用户进行访问,所以,这些操作可能会损坏 Oracle 数据词典并影响数据库的稳定性。

  • 加载大量数据时,请执行以下操作:

    1. 将转储文件转移到目标 RDS for Oracle 数据库实例。

    2. 为您的数据库实例拍摄快照。

    3. 测试导入以验证导入是否成功。

    如果数据库组件失效,则您可以删除数据库实例并通过数据库快照重新创建它。还原的数据库实例包括当您拍摄数据库快照时暂存在数据库实例上的任何转储文件。

  • 请勿导入使用 Oracle Data Pump 导出参数 TRANSPORT_TABLESPACES、TRANSPORTABLE、或 TRANSPORT_FULL_CHECK 创建的转储文件。RDS for Oracle 数据库实例不支持导入这些转储文件。

  • 不要导入包含 Oracle 计划程序对象的转储文件 SYS、SYSTEM、RDSADMIN、RDSSEC 和 RDS_DATAGUARD,以及属于以下类别的文件:

    • 作业

    • 计划

    • Schedules

    • 链

    • 规则

    • 评估背景

    • 规则集

    RDS for Oracle 数据库实例不支持导入这些转储文件。

  • 要排除不受支持的 Oracle 计划程序对象,请在 Data Pump 导出期间使用其他指令。如果您使用 DBMS_DATAPUMP,则可以在 METADATA_FILTER 之前添加额外的 DBMS_DATAPUMP.START_JOB:

    DBMS_DATAPUMP.METADATA_FILTER( v_hdnl, 'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM SYS.OBJ$ WHERE TYPE# IN (66,67,74,79,59,62,46) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) ) ]', 'PROCOBJ' );

    如果使用 expdp,请创建包含以下示例中所示的 exclude 指令的参数文件。然后,将 PARFILE=parameter_file 与您的 expdp 命令一起使用。

    exclude=procobj:"IN (SELECT NAME FROM sys.OBJ$ WHERE TYPE# IN (66,67,74,79,59,62,46) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) )"

使用 Oracle Data Pump 和 Amazon S3 存储桶导入数据

以下导入过程使用 Oracle Data Pump 和 Amazon S3 存储桶。步骤如下所示:

  1. 使用 Oracle DBMS_DATAPUMP 程序包导出源数据库上的数据。

  2. 将转储文件置于 Amazon S3 桶中。

  3. 将转储文件从 Amazon S3 桶下载到目标 RDS for Oracle 数据库实例上的 DATA_PUMP_DIR 目录。

  4. 使用 DBMS_DATAPUMP 程序包,将数据从复制的转储文件导入到 RDS for Oracle 数据库实例。

使用 Oracle Data Pump 和 Amazon S3 桶导入数据的要求

此过程有以下要求:

  • 确保 Amazon S3 桶可用于文件传输,并且 Amazon S3 桶与数据库实例处于相同的 AWS 区域中。有关说明,请参阅 Amazon Simple Storage Service 入门指南 中的创建存储桶。

  • 您上传到 Amazon S3 存储桶的对象不得超过 5 TB。有关在 Amazon S3 中使用对象的更多信息,请参阅 Amazon Simple Storage Service 用户指南。

    注意

    如果要转储超过 5 TB 的文件,则可以使用并行选项来运行 Oracle Data Pump 导出。此操作会将数据分散到多个转储文件中,以便不会超过单个文件的 5 TB 限制。

  • 您必须按照 为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限 中的说明为 Amazon RDS 集成准备 Amazon S3 存储桶。

  • 您必须确保有足够的存储空间来存储源实例和目标数据库实例上的转储文件。

注意

此过程将转储文件导入到 DATA_PUMP_DIR 目录(所有 Oracle 数据库实例上的预配置目录)中。此目录位于您的数据文件所在的存储卷上。当您导入转储文件时,现有 Oracle 文件使用更多空间。因此,您应该确保您的数据库实例可适应这个额外的空间使用。导入的转储文件不会自动从 DATA_PUMP_DIR 目录中删除或清除。要删除导入的转储文件,请使用 Oracle 网站上的 UTL_FILE.FREMOVE。

步骤 1:在 RDS for Oracle 目标数据库实例上向数据库用户授予权限

在此步骤中,您将创建您计划向其中导入数据的架构,并向用户授予必要的权限。

在 RDS for Oracle 目标实例上创建用户并授予必要的权限
  1. 使用 SQL*Plus 或 Oracle SQL Developer,作为主用户登录到将向其中导入数据的 RDS for Oracle 数据库实例。有关连接到数据库实例的信息,请参阅连接到 Oracle 数据库实例。

  2. 在导入数据之前,创建所需的表空间。有关更多信息,请参阅 在 RDS for Oracle 中创建表空间并调整其大小。

  3. 如果要向其中导入数据的用户账户不存在,请创建用户账户并授予必需的权限和角色。如果您打算将数据导入到多个用户架构,请创建各个用户账户并向其授予所需的权限和角色。

    例如,以下 SQL 语句创建新的用户并授予所需权限和角色,以将数据导入到此用户拥有的架构中。将 schema_1 替换为此步骤中和下列步骤中架构的名称。

    CREATE USER schema_1 IDENTIFIED BY my_password; GRANT CREATE SESSION, RESOURCE TO schema_1; ALTER USER schema_1 QUOTA 100M ON users;
    注意

    作为安全最佳实践,请指定除此处所示提示以外的密码。

    前面的语句向新用户授予 CREATE SESSION 权限和 RESOURCE 角色。根据导入的数据库对象,您可能需要其他权限和角色。

步骤 2:使用 DBMS_DATAPUMP 将数据导出到转储文件中

要创建转储文件,请使用 DBMS_DATAPUMP 程序包。

将 Oracle 数据导出到转储文件
  1. 使用 SQL Plus 或 Oracle SQL Developer,以管理用户身份连接到源 RDS for Oracle 数据库实例。如果源数据库是 RDS for Oracle 数据库实例,请使用 Amazon RDS 主用户身份进行连接。

  2. 通过调用 DBMS_DATAPUMP 过程导出数据。

    以下脚本将 SCHEMA_1 架构导出到 DATA_PUMP_DIR 目录中名为 sample.dmp 的转储文件中。将 SCHEMA_1 替换为要导出的架构的名称。

    DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name => null ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl , filename => 'sample.dmp' , directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_exp.log', directory => 'DATA_PUMP_DIR' , filetype => dbms_datapump.ku$_file_type_log_file ); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.METADATA_FILTER( v_hdnl, 'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM SYS.OBJ$ WHERE TYPE# IN (66,67,74,79,59,62,46) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) ) ]', 'PROCOBJ' ); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
    注意

    Data Pump 异步启动任务。有关监控 Data Pump 作业的信息,请参阅 Oracle 文档中的监控作业状态。

  3. (可选)通过调用 rdsadmin.rds_file_util.read_text_file 过程查看导出日志的内容。有关更多信息,请参阅 读取数据库实例目录中的文件。

步骤 3:将转储文件上传到 Amazon S3 存储桶。

使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.upload_to_s3 将转储文件复制到 Amazon S3 存储桶中。以下示例将 DATA_PUMP_DIR 目录中的所有文件上传到名为 amzn-s3-demo-bucket 的 Amazon S3 存储桶中。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'amzn-s3-demo-bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT 语句返回 VARCHAR2 数据类型的任务 ID。有关更多信息,请参阅 将文件从 RDS for Oracle 数据库实例上传到 Amazon S3 存储桶。

步骤 4:将转储文件从 Amazon S3 桶下载到目标数据库实例

使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 执行此步骤。将文件下载到目录时,如果目录中已存在同名文件,则过程 download_from_s3 将跳过下载。要从下载目录中删除文件,请使用 Oracle 网站上的 UTL_FILE.FREMOVE。

下载转储文件
  1. 启动 SQL*Plus 或 Oracle Developer 并以主用户身份登录 Amazon RDS 目标 Oracle 数据库实例

  2. 使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 下载转储文件。

    以下示例将所有文件从名为 amzn-s3-demo-bucket 的 Amazon S3 桶下载到 DATA_PUMP_DIR 目录中。

    SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'amzn-s3-demo-bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

    SELECT 语句返回 VARCHAR2 数据类型的任务 ID。有关更多信息,请参阅 将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例。

步骤 5:使用 DBMS_DATAPUMP 将转储文件导入到目标数据库实例

使用 DBMS_DATAPUMP 将架构导入到 RDS for Oracle 数据库实例。可能需要额外的选项(例如 METADATA_REMAP)。

将数据导入到目标数据库实例
  1. 启动 SQL*Plus 或 SQL Developer 并以主用户身份登录 RDS for Oracle 数据库实例。

  2. 通过调用 DBMS_DATAPUMP 过程导入数据。

    下面的示例将 SCHEMA_1 数据从 sample.dmp 导入到目标数据库实例。

    DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_imp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
    注意

    数据抽取任务将异步开始。有关监控 Data Pump 作业的信息,请参阅 Oracle 文档中的监控作业状态。您可以使用 rdsadmin.rds_file_util.read_text_file 过程查看导入日志的内容。有关更多信息,请参阅 读取数据库实例目录中的文件。

    要监控 Data Pump 导入作业的进度,请运行以下查询:

    SELECT job_name, operation, job_mode, state, attached_sessions FROM DBA_DATAPUMP_JOBS WHERE owner_name = USER;
  3. 通过列出目标数据库实例上的架构表来验证数据导入。

    例如,以下查询将返回 SCHEMA_1 的表数量。

    SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';

Data Pump 导入故障排除

要检查 Data Pump 导入作业的状态,请查询导入日志文件:

SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR', 'sample_imp.log'));

常见错误包括:

  • ORA-39083:对象类型创建失败。通常由于缺少权限或表空间而造成。授予所需的权限或使用 METADATA_REMAP 重新映射表空间。

  • ORA-39166:未找到对象。转储文件中没有源架构或对象。

  • ORA-31693:表数据对象加载失败。检查表空间配额或空间问题。

  • ORA-31634:作业已存在。已存在同名的 Data Pump 作业,这通常是因为之前的作业留下了孤立的主表。查询 DBA_DATAPUMP_JOBS 以查找处于 NOT RUNNING 状态的作业,删除剩余的主表(例如,DROP TABLE job_name;),或者在 DBMS_DATAPUMP.OPEN 调用中指定唯一的 job_name。

要重新运行部分失败的导入,请在导入参数中添加 TABLE_EXISTS_ACTION => 'REPLACE' 以覆盖现有对象。

步骤 6:清除

导入数据后,可以删除不想保留的文件。

删除不需要的文件
  1. 启动 SQL*Plus 或 SQL Developer 并以主用户身份登录 RDS for Oracle 数据库实例。

  2. 使用以下命令列出 DATA_PUMP_DIR 中的文件。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
  3. 要删除 DATA_PUMP_DIR 中不再需要的文件,请使用以下命令。

    EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','filename');

    例如,以下命令删除名为 sample.dmp 的文件

    EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample.dmp');

以下导入过程使用 Oracle Data Pump 和 Oracle DBMS_FILE_TRANSFER 包。步骤如下所示:

  1. 连接到源 Oracle 数据库,此数据库可以是本地数据库、Amazon EC2 实例 或 RDS for Oracle 数据库实例。

  2. 使用 DBMS_DATAPUMP 程序包导出数据。

  3. 使用 DBMS_FILE_TRANSFER.PUT_FILE 将转储文件从 Oracle 数据库复制到通过数据库链接连接到的目标 RDS for Oracle 数据库实例上的 DATA_PUMP_DIR 目录中。

  4. 使用 DBMS_DATAPUMP 程序包,将数据从复制的转储文件导入到 RDS for Oracle 数据库实例。

使用 Oracle 数据转储和 DBMS_FILE_TRANSFER 包的导入过程具有以下步骤。

使用 Oracle Data Pump 和数据库链接导入数据的要求

此过程有以下要求:

  • 您必须对 DBMS_FILE_TRANSFER 和 DBMS_DATAPUMP 包具有执行权限。

  • 您必须对源数据库实例上的 DATA_PUMP_DIR 目录具有写入权限。

  • 您必须确保有足够的存储空间来存储源实例和目标数据库实例上的转储文件。

注意

此过程将转储文件导入到 DATA_PUMP_DIR 目录(所有 Oracle 数据库实例上的预配置目录)中。此目录位于您的数据文件所在的存储卷上。当您导入转储文件时,现有 Oracle 文件使用更多空间。因此,您应该确保您的数据库实例可适应这个额外的空间使用。导入的转储文件不会自动从 DATA_PUMP_DIR 目录中删除或清除。要删除导入的转储文件,请使用 Oracle 网站上的 UTL_FILE.FREMOVE。

步骤 1:在 RDS for Oracle 目标数据库实例上向用户授予权限

要向用户授予对 RDS for Oracle 目标数据库实例的权限,请执行以下步骤:

  1. 使用 SQL Plus 或 Oracle SQL Developer 连接到要向其中导入数据的 RDS for Oracle 数据库实例。以 Amazon RDS 主用户的身份连接。有关连接到数据库实例的信息,请参阅连接到 Oracle 数据库实例。

  2. 在导入数据之前,创建所需的表空间。有关更多信息,请参阅“在 RDS for Oracle 中创建表空间并调整其大小”。

  3. 如果要导入数据的用户账户不存在,请创建用户账户并授予必需的权限和角色。如果您打算将数据导入到多个用户架构,请创建各个用户账户并向其授予所需的权限和角色。

    例如,以下命令创建名为 schema_1 的新用户,并向此用户授予所需权限和角色,以将数据导入到用户架构中。

    CREATE USER schema_1 IDENTIFIED BY my-password; GRANT CREATE SESSION, RESOURCE TO schema_1; ALTER USER schema_1 QUOTA 100M ON users;
    注意

    作为安全最佳实践,请指定除此处所示提示以外的密码。

    前一个示例为新用户授予 CREATE SESSION 权限和 RESOURCE 角色。根据导入的数据库对象,可能需要其他权限和角色。

    注意

    将 schema_1 替换为此步骤中和下列步骤中架构的名称。

步骤 2:向用户授予源数据库权限

使用 SQL*Plus 或 Oracle SQL Developer 连接到包含要导入的数据的 RDS for Oracle 数据库实例。如有必要,可创建用户账户并授予必要权限。

注意

如果源数据库是 Amazon RDS 实例,则可以跳过此步骤。使用您的 Amazon RDS 主用户账户来执行导出。

以下命令创建新用户并授予必要权限。

CREATE USER export_user IDENTIFIED BY my-password; GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user; ALTER USER export_user QUOTA 100M ON users; GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user; GRANT SELECT_CATALOG_ROLE TO export_user; GRANT EXECUTE ON DBMS_DATAPUMP TO export_user; GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;
注意

作为安全最佳实践,请指定除此处所示提示以外的密码。

步骤 3:使用 DBMS_DATAPUMP 创建转储文件

要创建转储文件,请执行以下操作:

  1. 使用 SQL*Plus 或 Oracle SQL Developer,以管理用户或在步骤 2 中创建的用户身份连接到源 Oracle 实例。如果源数据库是 Amazon RDS for Oracle 数据库实例,请使用 Amazon RDS 主用户身份连接。

  2. 使用 Oracle Data Pump 实用程序创建转储文件。

    以下脚本在 DATA_PUMP_DIR 目录中创建一个名为 sample.dmp 的转储文件。

    DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT' , job_mode => 'SCHEMA' , job_name => null ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample.dmp' , directory => 'DATA_PUMP_DIR' , filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl , filename => 'sample_exp.log' , directory => 'DATA_PUMP_DIR' , filetype => dbms_datapump.ku$_file_type_log_file ); DBMS_DATAPUMP.METADATA_FILTER( v_hdnl , 'SCHEMA_EXPR' , 'IN (''SCHEMA_1'')' ); DBMS_DATAPUMP.METADATA_FILTER( v_hdnl, 'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM sys.OBJ$ WHERE TYPE# IN (66,67,74,79,59,62,46) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) ) ]', 'PROCOBJ' ); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
    注意

    数据抽取任务将异步开始。有关监控 Data Pump 作业的信息,请参阅 Oracle 文档中的监控作业状态。您可以使用 rdsadmin.rds_file_util.read_text_file 过程查看导出日志的内容。有关更多信息,请参阅“读取数据库实例目录中的文件”。

步骤 4:创建目标数据库实例的数据库链接

在源数据库实例和目标数据库实例之间创建数据库链接。您的本地 Oracle 实例必须具有至数据库实例的网络连接,然后才能创建数据库链接以及传输导出转储文件。

执行此步骤,使用与上一步中相同的用户账户连接。

如果您将在同一 VPC 或对等 VPC 中的两个数据库实例之间创建数据库链接,则这两个数据库实例之间应具有有效路由。每个数据库实例的安全组必须允许另一个数据库实例的传入和传出。安全组入站和出站规则可引用同一 VPC 或对等 VPC 中的安全组。有关更多信息,请参阅“在 VPC 中调整用于数据库实例的数据库链接”。

以下命令创建名为 to_rds 的数据库链接,连接到位于目标数据库实例中的 Amazon RDS 主用户。

CREATE DATABASE LINK to_rds CONNECT TO <master_user_account> IDENTIFIED BY <password> USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>) (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';

步骤 5:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到目标数据库实例

使用 DBMS_FILE_TRANSFER 将转储文件从源数据库实例复制到目标数据库实例。以下脚本将名为 sample.dmp 的转储文件从源实例复制到名为 to_rds 的目标数据库链接(已在上一步中创建)。

BEGIN DBMS_FILE_TRANSFER.PUT_FILE( source_directory_object => 'DATA_PUMP_DIR', source_file_name => 'sample.dmp', destination_directory_object => 'DATA_PUMP_DIR', destination_file_name => 'sample_copied.dmp', destination_database => 'to_rds' ); END; /

步骤 6:使用 DBMS_DATAPUMP 将数据文件导入到目标数据库实例

在数据库实例中使用 Oracle Data Pump 导入架构。可能需要额外选项(例如,METADATA_REMAP)。

使用 Amazon RDS 主用户账户连接到数据库实例来执行导入。

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_copied.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_imp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
注意

数据抽取任务将异步开始。有关监控 Data Pump 作业的信息,请参阅 Oracle 文档中的监控作业状态。您可以使用 rdsadmin.rds_file_util.read_text_file 过程查看导入日志的内容。有关更多信息,请参阅“读取数据库实例目录中的文件”。

您可以通过查看数据库实例上用户的表来验证数据导入。例如,以下查询将返回 schema_1 的表数量。

SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';

步骤 7:清除

导入数据后,可以删除不想保留的文件。您可以使用以下命令列出 DATA_PUMP_DIR 中的文件。

SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;

要删除 DATA_PUMP_DIR 中不再需要的文件,请使用以下命令。

EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','<file name>');

例如,以下命令删除名为 "sample_copied.dmp" 的文件

EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp');