Amazon Relational Database Service
用户指南 (API Version 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 实例导入 Oracle 数据库实例

  • 将数据从一个 Oracle 数据库实例的数据库导入另一个 Oracle 数据库实例

  • 将数据从一个 VPC 中的 Oracle 数据库实例的数据库导入另一个带或不带 VPC 的 Oracle 数据库实例

  • 将数据从本地 Oracle 数据库导入 Amazon RDS 数据库实例

以下过程使用 Oracle Data Pump 和 DBMS_FILE_TRANSFER 包。此过程使用 Oracle Data Pump 连接到 Oracle 实例并导出数据。然后使用 DBMS_FILE_TRANSFER.PUT_FILE 方法将转储文件从 Oracle 实例中复制到通过数据库链接来连接的目标数据库实例上的 DATA_PUMP_DIR。最后一步是,将数据从复制的转储文件中导入到 RDS 实例中。

此过程有以下要求:

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

  • 目标数据库实例必须为 11.2.0.2 .v6 版本或更高版本

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

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

注意

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

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

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

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

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

  • 步骤 4:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到 Amazon RDS 实例

  • 步骤 5:将转储文件导入到 Amazon RDS 实例上的数据库中

  • 步骤 6:清除

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

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

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

Copy
SQL> create user USER1 identified by test123; SQL> grant create session, create table to USER1; SQL> alter user USER1 quota 100M on users; SQL> grant read, write on directory data_pump_dir to USER1; SQL> grant execute on dbms_datapump to USER1;

可以使用您自己的表,也可以创建一个表来测试此过程。以下命令创建将导入到数据库实例中的示例表:

Copy
SQL> create table USER1.tab1 tablespace users as select 'USER1_'||object_name str_col, sysdate dt_col from all_objects;

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

使用 SQL Plus 或 Oracle SQL Developer 连接到 Oracle 实例,并使用 Oracle Data Pump 实用工具创建转储文件。以下脚本在 DATA_PUMP_DIR 目录中创建一个名为 tab1.dmp 的转储文件。

Copy
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'tab1.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 (''USER1'')'); DBMS_DATAPUMP.start_job(hdnl); END; /

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

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

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

以下命令创建目标数据库实例数据库中另一个用户的名为 to_rds 的数据库链接:

Copy
create database link to_rds connect to USER2 identified by user2pwd using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)(PORT=<listener port>))(CONNECT_DATA=(SID=<remoteSID>)))';

步骤 4:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到 Amazon RDS 数据库实例

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

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

步骤 5:在目标实例上创建所需的表空间

您必须先创建表空间,然后才能导入数据。有关更多信息,请参阅 创建表空间并配置其大小

步骤 6:在数据库实例上使用 Data Pump 导入数据文件

在数据库实例中可使用 Oracle Data Pump 导入架构。列出的第一部分显示数据导入语句的格式,第二部分显示名为 tab1_copied.dmp 的数据文件。请注意,可能需要额外选项 (例如,REMAP_TABLESPACE)。

Copy
impdp <username>@<TNS_ENTRY> DUMPFILE=user1copied.dmp DIRECTORY=DATA_PUMP_DIR full=y impdp copy1@copy1 DUMPFILE=tab1_copied.dmp DIRECTORY=DATA_PUMP_DIR full=y

可以通过查看数据库实例上的表来验证数据导入。

Copy
SQL> select count(*) from user1.tab1;

步骤 7:清除

导入数据后,可以删除不再需要保留的文件。通过使用以下命令,可列出 DATA_PUMP_DIR 中的文件:

Copy
select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime;

注意

RDSADMIN.RDS_FILE_UTIL.LISTDIR 不可用于版本 11.2.0.2。

以下命令可用于删除 DATA_PUMP_DIR 中不再需要的文件:

Copy
exec utl_file.fremove('DATA_PUMP_DIR','[file name]');

例如,以下命令可删除名为“test_dbms_lob.txt”的文件:

Copy
exec utl_file.fremove('DATA_PUMP_DIR','test_dbms_lob.txt');

Oracle Export/Import 实用工具

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

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

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

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

Copy
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 非常适用于数据元数量有限的大型数据库。对于架构而言,从源数据库导出及加载到目标数据库所涉及的过程非常有针对性,因此采用以下示例来说明创建示例架构数据元、从源数据库导出、然后加载到目标数据库等过程。

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

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

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

    Copy
    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. 您需要创建一个控制文件来描述数据。此外,根据数据,您可能需要构建执行此步骤的脚本。

    Copy
    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 将数据导入目标数据库。

    Copy
    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 目标实例上创建用户账户,并使用同一密码进行身份验证。

    Copy
    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 目标实例到源实例的数据库链接。

    Copy
    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. 测试链接:

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

    Copy
    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 实例上,创建物化视图。

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