操作纲要
生成导出数据。
传输导出数据至AWS RDS。
远程登录至AWS RDS并执行数据导入操作。
操作步骤 1:获取操作权限
操作步骤 1.1 [可选步骤] 创建数据导出目录:
为了方便管理,可将数据导出目录指定到特定文件夹,如:D:\dump_dir.
创建导出目录:
create or replace directory DUMP_DIR as 'D:\dump_dir';
确认创建是否成功:
select * from dba_directories where directory_name='DUMP_DIR';
需要注意的地方:
目录D:\dump_dir需要在文件系统上真实存在,因为Oracle不会替用户在文件系统中创建这个目录。
操作步骤 1.2 [可选步骤] 为导出任务单独创建一个用户:
create user data_operator_001 identified by password_of_data_operator_001 default tablespace users;
操作步骤 1.3 为执行数据导出操作的用户添加相应权限:
赋予基本操作权限
grant create session, create table, exp_full_database to data_operator_001;
alter user data_operator_001 quota 100m on users;
grant read, write on directory dump_dir to data_operator_001;
grant execute on dbms_datapump to data_operator_001;
需要注意的地方:
赋予用户exp_full_database权限是为了让其能够导出其他用户的数据库信息。
修改用户在默认表空间users的额度是为了能让DBMS_DATAPUMP.open能够创建Jobs,否则会出现job不存在错误。
赋予用户dbms_datapump 的执行权限是为了下一步能通过DBMS_DATAPUMP包API导出数据。
检查权限:
操作步骤 2:生成导出数据
这一步骤主要使用DBMS_DATAPUMP包API完成.
数据导出脚本:
DECLARE
dp_handle NUMBER;
BEGIN
--sepcified operation,job mode
dp_handle := DBMS_DATAPUMP.open(operation => 'EXPORT',
job_mode => 'SCHEMA',
remote_link => NULL,
job_name => 'Dump_Database_data_operator_001',
version => 'LATEST');
--specified dumpfile and dump directory
DBMS_DATAPUMP.ADD_FILE(handle => dp_handle,
filename => 'data_operator_001.dmp',
directory => 'DUMP_DIR',
filetype => dbms_datapump.ku$_file_type_dump_file);
--specified log file and dump directory
DBMS_DATAPUMP.ADD_FILE(handle => dp_handle,
filename => 'exp.log',
directory => 'DUMP_DIR',
filetype => dbms_datapump.ku$_file_type_log_file);
--specified fliter for schema
DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''need_to_export_schema'')');
DBMS_DATAPUMP.start_job(dp_handle);
DBMS_DATAPUMP.detach(dp_handle);
END;
操作步骤 3:传输导出数据至AWS RDS
这一步利用 DBMS_FILE_TRANSFER 工具包完成。
操作脚本:
BEGIN
DBMS_FILE_TRANSFER.PUT_FILE(source_directory_object => 'DUMP_DIR',
source_file_name => 'data_operator_001.dmp',
destination_directory_object => 'DATA_PUMP_DIR',
destination_file_name => 'data_operator_001.dmp',
destination_database => 'AWS_RDS');
END;
需要注意的地方:
source_directory_object、source_file_name 的值需要与上步对应,否则 DBMS_FILE_TRANSFER 无法找到导出的数据文件。
destination_directory_object设置成DATA_PUMP_DIR,原因就是我们无法在AWS RDS上创建文件系统目录(如果发现怎么创建请告知我,谢谢!),所以就用Oracle的默认值:DATA_PUMP_DIR。
destination_database 的值需要通过如下方式创建,其定义了一个远程Oracle实例。
创建远程Oracle实例链接:
create database link AWS_RDS connect to user_on_AWS_RDS identified by password using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx.xxxxx.ap-southeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))'
操作步骤 4:远程登录至AWS RDS并执行数据导入操作
这个步骤使用的工具:impdp
导入命令:
impdp user_on_AWS_RDS/password@AWS_ORACLE remap_schema=source_schema:destination_schema remap_tablespace=source_space:destination_space DUMPFILE=data_operator_001.dmp directory=DATA_PUMP_DIR table_exists_action=replace
需要注意的地方:
命令中的AWS_ORACLE 为TNS(Transparent Network Substrate)节点名,这个需要事先在Oracle安装目录下的NETWORK\ADMIN\tnsnames.ora文件中添加。以下附了一个连接AWS RDS的TNS节点名示例。
命令中destination_schema一般跟登录名相同。
命令中的destination_space需要事先在AWS RDS上创建。
table_exists_action=replace为导入时的策略,请根据自己实际情况添加修改。
tnsnames.ora文件内容示例:
AWS_ORACLE=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx.xxxxx.ap-southeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))