使用 Oracle Data Pump 导入 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Oracle Data Pump 导入

长期来看,Oracle Data Pump 最终会取代 Oracle Export/Import 实用工具。Oracle Data Pump 是将大量数据从 Oracle 安装迁移到 Amazon RDS 数据库实例的首选方法。有几种情况可以使用 Oracle Data Pump:

  • 将数据从 Oracle 数据库(可以是本地或 Amazon EC2 实例)导入到 Amazon 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 文档

使用 Oracle Data Pump 导入数据时,您必须将包含数据的转储文件从源数据库传输到目标数据库。您可以使用 Amazon S3 存储桶或使用两个数据库之间的数据库链接传输转储文件。

当您使用 Oracle 数据转储将数据导入到 Oracle 数据库实例时,我们建议使用以下最佳实践:

  • schematable 模式中执行导入,以便导入特定架构和对象。

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

  • 请勿在 full 模式中导入。

    因为 Amazon RDS for Oracle 不允许访问 SYSSYSDBA 管理用户,所以在 full 模式中导入架构或为 Oracle 维护的组件导入架构可能会损坏 Oracle 数据字典并影响数据库的稳定性。

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

    1. 将转储文件转移到目标 Amazon RDS for Oracle DB 实例。

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

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

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

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

  • 不要导入包含 Oracle 计划程序对象的转储文件 SYSSYSTEMRDSADMINRDSSECRDS_DATAGUARD,以及属于以下类别的文件:

    • 任务

    • 计划

    • Schedules

    • 规则

    • 评估背景

    • 规则集

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

注意

要排除不受支持的计划程序对象,请在数据转储导出期间使用其他指令。如果使用 DBMS_DATAPUMP,请在 METADATA_FILTER 之前添加额外的 DBMS_METADATA.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,请创建包含以下示例中所示的排除指令的参数文件。然后,将 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 数据库的一种方法。但是,Oracle 数据转储允许多种数据导入方法。有关 Oracle 数据转储的更多信息,请参阅 Oracle 数据库文档

本节中的示例使用 DBMS_DATAPUMP 包。通过使用 Oracle Data Pump 命令行实用程序 impdpexpdp 可以完成相同的任务。您可以在远程主机上安装这些实用程序以作为 Oracle 客户端安装的一部分,包括 Oracle 即时客户端。

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

以下导入过程使用 Oracle Data Pump 和 Amazon S3 存储桶。该过程使用 Oracle DBMS_DATAPUMP 包导出源数据库中的数据,并将转储文件放入 Amazon S3 存储桶。然后将转储文件从 Amazon S3 存储桶下载到目标 Amazon RDS for Oracle 数据库实例上的 DATA_PUMP_DIR 目录。最后一步是,使用 DBMS_DATAPUMP 包,将数据从复制的转储文件导入到 Amazon RDS for Oracle 数据库实例。

此过程有以下要求:

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

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

    注意

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

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

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

注意

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

使用 Oracle Data Pump 和 Amazon S3 存储桶的导入过程包含以下步骤。

步骤 1:向用户授予 Amazon RDS 目标实例权限

若要向用户授予 RDS 目标实例上的权限,请执行以下步骤:

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

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

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

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

    CREATE USER schema_1 IDENTIFIED BY <password>; GRANT CREATE SESSION, RESOURCE TO schema_1; ALTER USER schema_1 QUOTA 100M ON users;

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

    注意

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

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

使用 SQL Plus 或 Oracle SQL Developer,以管理用户身份连接到源 Oracle 实例。如果源数据库是 Amazon RDS for Oracle 数据库实例,请使用 Amazon RDS 主用户身份连接。然后,使用 Oracle Data Pump 实用工具创建转储文件。

以下脚本在包含 DATA_PUMP_DIR 架构的 SCHEMA_1 目录中创建一个名为 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 作业的信息,请参阅 Oracle 文档中的监控作业状态。您可以使用 rdsadmin.rds_file_util.read_text_file 过程查看导出日志的内容。有关更多信息,请参阅“读取数据库实例目录中的文件”。

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

将转储文件上传到 Amazon S3 存储桶中。

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

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT 语句返回 VARCHAR2 数据类型的任务 ID。

有关更多信息,请参阅“将文件从 Oracle 数据库实例上传到 Amazon S3 存储桶”。

步骤 4:将导出的转储文件从 Amazon S3 存储桶复制到目标数据库实例

使用 SQL Plus 或 Oracle SQL Developer 连接到 Amazon RDS 目标 Oracle 数据库实例。接下来,使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 将转储文件从 Amazon S3 存储桶复制到目标数据库实例中。以下示例将所有文件从名为 mys3bucket 的 Amazon S3 存储桶下载到 DATA_PUMP_DIR 目录中。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT 语句返回 VARCHAR2 数据类型的任务 ID。

有关更多信息,请参阅“将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例”。

步骤 5:使用 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';

步骤 6:清除

导入数据后,可以删除不想保留的文件。通过使用以下命令,可列出 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');

以下导入过程使用 Oracle Data Pump 和 Oracle DBMS_FILE_TRANSFER 包。该过程连接到源 Oracle 实例(可以是本地或 Amazon EC2 实例,或者是 Amazon RDS for Oracle 数据库实例)。然后,该过程使用 DBMS_DATAPUMP 包导出数据。接下来,使用 DBMS_FILE_TRANSFER.PUT_FILE 方法将转储文件从 Oracle 实例复制到通过数据库链接来连接的目标 Amazon RDS for Oracle 数据库实例上的 DATA_PUMP_DIR 目录中。最后一步是,使用 DBMS_DATAPUMP 包,将数据从复制的转储文件导入到 Amazon RDS for Oracle 数据库实例。

此过程有以下要求:

  • 您必须对 DBMS_FILE_TRANSFERDBMS_DATAPUMP 包具有执行权限。

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

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

注意

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

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

步骤 1:向用户授予 Amazon RDS 目标实例权限

若要向用户授予 RDS 目标实例上的权限,请执行以下步骤:

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

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

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

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

    CREATE USER schema_1 IDENTIFIED BY <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 连接到包含要导入的数据的 Oracle 实例。如有必要,可创建用户账户并授予必要权限。

注意

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

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

CREATE USER export_user IDENTIFIED BY <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 创建转储文件

使用 SQL Plus 或 Oracle SQL Developer,以管理用户或步骤 2 中创建的用户身份连接到源 Oracle 实例。如果源数据库是 Amazon RDS for Oracle 数据库实例,请使用 Amazon RDS 主用户身份连接。然后,使用 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',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');