Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将数据导入到 Amazon RDS 上的 Oracle

如何将数据导入 Amazon RDS 数据库实例取决于您拥有的数据量以及数据库中的数据库对象的数量和种类。例如,您可以使用 Oracle SQL Developer 导入一个简单的 20 MB 数据库。您可以使用 Oracle Data Pump 导入复杂的数据库,或大小为数百 MB 甚至 TB 级的数据库。

您还可以使用 AWS Database Migration Service (AWS DMS) 将数据导入到 Amazon RDS 数据库实例。AWS DMS 可以在无停机时间的情况下迁移数据库,对于很多数据库引擎而言,将继续进行持续复制,直到您已准备好切换到目标数据库。您可以使用 AWS DMS 从同一数据库引擎或其他数据库引擎迁移到 Oracle。如果您正在从其他数据库引擎进行迁移,则可使用 AWS Schema Conversion Tool 迁移未由 AWS DMS 迁移的架构对象。有关 AWS DMS 的更多信息,请参阅什么是 AWS Database Migration Service

在使用这些迁移技术前,我们建议您最好先对数据库进行备份。要导入数据,您可以通过创建快照来备份您的 Amazon RDS 数据库实例。您可以稍后从快照中还原数据库。有关更多信息,请参阅 备份和还原 Amazon RDS 数据库实例

Oracle SQL Developer

对于小型数据库,您可以使用 Oracle SQL Developer,这是 Oracle 发布的一种免费的图形化 Java 工具。您可以将此工具安装到台式计算机 (Windows、Linux 或 Mac) 或服务器上。Oracle SQL Developer 为用户提供了选项,可在两个 Oracle 数据库之间迁移数据,或将数据从其他数据库 (如 MySQL) 迁移到 Oracle。Oracle SQL Developer 最适合用于迁移小型数据库。我们建议您在开始迁移数据前先阅读 Oracle SQL Developer 产品文档。

安装 SQL Developer 后,您可以使用该工具连接至源数据库和目标数据库。使用“Tools”菜单上的 Database Copy 命令将数据复制到 Amazon RDS 实例。

要下载 Oracle SQL Developer,请转到 http://www.oracle.com/technetwork/developer-tools/sql-developer

Oracle 还提供关于如何从其他数据库 (包括 MySQL 和 SQL Server) 中迁移数据的文档。有关更多信息,请参阅 Oracle 文档中的 http://www.oracle.com/technetwork/database/migration

Oracle Data Pump

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

  • 将数据从一个 Oracle 数据库 (可以为本地或 Amazon EC2 实例) 导入到另一个 Amazon RDS Oracle 数据库实例

  • 将数据从一个 Amazon RDS Oracle 数据库实例导入到 Oracle 数据库 (可以为本地或 Amazon EC2 实例)

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

要下载 Oracle Data Pump 实用程序,请转到 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

有关在 Oracle Database 的版本之间进行迁移时的兼容性注意事项,请参阅 Oracle 文档

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

此过程有以下要求:

  • 您必须具有 DBMS_FILE_TRANSFER 包和 DBMS_DATAPUMP 包的执行特权。

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

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

注意

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

使用 Oracle Data Pump 和 DBMS_FILE_TRANSFER 包的导入过程包含以下步骤:

  • 步骤 1:向用户授予 Amazon RDS 目标实例上的特权

  • 步骤 2:向用户授予源数据库的特权

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

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

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

  • 步骤 6:在目标数据库实例上使用 DBMS_DATAPUMP 导入数据文件

  • 步骤 7:清除

步骤 1:向用户授予 Amazon 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 Oracle 数据库实例,请使用 Amazon RDS 主用户身份连接。然后,使用 Oracle Data Pump 实用工具创建转储文件。

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

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

注意

数据抽取任务将异步开始。有关监控数据抽取任务的信息,请参阅 Oracle 文档中的监控任务状态

步骤 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 hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'sample_copied.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /

您可以通过查看数据库实例上用户的表来验证数据导入。例如,以下查询将返回 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');

Oracle Export/Import 实用工具

Oracle Export/Import 实用工具最适合用于以下迁移情况:数据量较小且不需要二进制 float 和 double 等数据类型。导入过程会创建架构对象,因此,您无需事先运行脚本来创建对象,这使得该过程非常适合用于包含小型表的数据库。以下示例说明了如何使用这些实用工具导出和导入特定表。

要下载 Oracle 导出和导入实用程序,请转到 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

使用以下命令将表从源数据库中导出。根据需要,替换用户名/密码。

exp cust_dba@ORCL FILE=exp_file.dmp TABLES=(tab1,tab2,tab3) LOG=exp_file.log

导出过程会创建一个二进制转储文件,其中包含指定表的架构和数据。现在,可以使用以下命令将此架构和数据导入目标数据库:

imp cust_dba@targetdb FROMUSER=cust_schema TOUSER=cust_schema \ TABLES=(tab1,tab2,tab3) FILE=exp_file.dmp LOG=imp_file.log

导出和导入命令还有其他的变体,可能更适合您的需求。有关全部详细信息,请参阅 Oracle 文档。

Oracle SQL*Loader

Oracle SQL*Loader 非常适用于对象数量有限的大型数据库。对于架构而言,从源数据库导出及加载到目标数据库所涉及的过程非常有针对性,因此,采用以下示例来说明创建示例架构对象、从源数据库导出、然后加载到目标数据库等过程。

要下载 Oracle SQL*Loader,请转到 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

  1. 使用以下命令创建示例源表。

    create table customer_0 tablespace users as select rownum id, o.* from all_objects o, all_objects x where rownum <= 1000000;
  2. 在目标 Amazon RDS 实例上,创建用于加载数据的目标表。

    create table customer_1 tablespace users as select 0 as id, owner, object_name, created from all_objects where 1=2;
  3. 数据将从源数据库导出到带有分隔符的平面文件。为执行该操作,本示例使用了 SQL*Plus。对于数据,您可能需要生成用于执行数据库中所有对象导出操作的脚本。

    alter session set nls_date_format = 'YYYY/MM/DD HH24:MI:SS'; set linesize 800 HEADING OFF FEEDBACK OFF array 5000 pagesize 0 spool customer_0.out SET MARKUP HTML PREFORMAT ON SET COLSEP ',' SELECT id, owner, object_name, created FROM customer_0; spool off
  4. 您需要创建一个控制文件来描述数据。此外,根据数据,您可能需要构建执行此步骤的脚本。

    cat << EOF > sqlldr_1.ctl load data infile customer_0.out into table customer_1 APPEND fields terminated by "," optionally enclosed by '"' ( id POSITION(01:10) INTEGER EXTERNAL, owner POSITION(12:41) CHAR, object_name POSITION(43:72) CHAR, created POSITION(74:92) date "YYYY/MM/DD HH24:MI:SS" )

    如果需要,将上述代码生成的文件复制到某一暂存区域,如 Amazon EC2 实例。

  5. 最后,通过相应的用户名和密码,使用 SQL*Loader 将数据导入目标数据库。

    sqlldr cust_dba@targetdb control=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000

Oracle 具体化视图

您还可以使用 Oracle 具体化视图复制功能高效地迁移大型数据集。复制功能可以使目标表与源表持续保持同步,因此,如需要,可在稍后完成向 Amazon RDS 的实际转换。设置复制功能时,需使用 Amazon RDS 实例到源数据库的数据库链接。

具体化视图的一项要求是,允许从目标数据库访问源数据库。在以下示例中,源数据库启用了访问规则,因此, Amazon RDS 目标数据库可通过 SQLNet 与源数据库连接。

  1. 在源实例和 Amazon RDS 目标实例上创建用户账户,并使用同一密码进行身份验证。

    create user dblink_user identified by <password> default tablespace users temporary tablespace temp; grant create session to dblink_user; grant select any table to dblink_user; grant select any dictionary to dblink_user;
  2. 使用新创建的 dblink_user 创建 Amazon RDS 目标实例到源实例的数据库链接。

    create database link remote_site connect to dblink_user identified by <password> using '(description=(address=(protocol=tcp) (host=<myhost>) (port=<listener port>)) (connect_data=(sid=<sourcedb sid>)))';
  3. 测试链接:

    select * from v$instance@remote_site;
  4. 使用主键和源实例上的具体化视图日志创建示例表。

    create table customer_0 tablespace users as select rownum id, o.* from all_objects o, all_objects x where rownum <= 1000000; alter table customer_0 add constraint pk_customer_0 primary key (id) using index; create materialized view log on customer_0;
  5. 在目标 Amazon RDS 实例上,创建具体化视图。

    CREATE MATERIALIZED VIEW customer_0 BUILD IMMEDIATE REFRESH FAST AS SELECT * FROM cust_dba.customer_0@remote_site;