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/features/instant-client。
以下过程使用 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 包的执行特权。
-
目标数据库实例必须为 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:向用户授予 Amazon RDS 目标实例上的特权
-
步骤 2:向用户授予源数据库的特权
-
步骤 3:使用 DBMS_DATAPUMP 创建转储文件
-
步骤 4:创建目标数据库实例的数据库链接
-
步骤 5:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到目标数据库实例
-
步骤 6:在目标数据库实例上使用 DBMS_DATAPUMP 导入数据文件
-
步骤 7:清除
步骤 1:向用户授予 Amazon RDS 目标实例上的特权
-
使用 SQL Plus 或 Oracle SQL Developer 连接到要导入的数据的 Amazon RDS 目标 Oracle 数据库实例。以 Amazon RDS 主用户的身份连接。有关连接到数据库实例的信息,请参阅与运行 Oracle 数据库引擎的数据库实例连接。
-
在导入数据之前,创建所需的表空间。有关更多信息,请参阅 创建表空间并配置其大小。
-
如果要导入数据的用户账户不存在,请创建用户账户并授予必需的权限和角色。如果您将数据导入到多个用户架构,请创建各个用户账户并向其授予所需的特权和角色。
例如,以下命令创建新的用户并授予所需权限和角色,以将数据导入到用户架构中
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 角色。根据您要导入的数据库对象,可能需要其他特权和角色。
步骤 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; /
步骤 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;
注意
RDSADMIN.RDS_FILE_UTIL.LISTDIR 不可用于版本 11.2.0.2。
以下命令可用于删除 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');