更新时间:2023-08-28
使用 Oracle Data Pump 导入数据时,您必须将包含数据的转储文件从源数据库传输到目标数据库。
本节中的示例使用 DBMS_DATAPUMP 包,通过使用 Oracle Data Pump 命令行实用程序 impdp 和 expdp 可以完成相同的任务。
下面是使用 Oracle Data Pump 将数据导入至 DMP 中Oracle 数据库实例的最佳实践:
• 在 schema 或 table 模式中执行导入,以便导入特定架构和对象。
• 将您导入的架构限制为您的应用程序所需的架构。
• 请勿在 full 模式中导入。在full 模式中导入架构或为 Oracle 维护的组件导入架构可能会损坏 Oracle 数据字典并影响数据库的稳定性。
• 请勿导入使用导出参数 TRANSPORT_TABLESPACES、TRANSPORTABLE 或 TRANSPORT_FULL_CHECK 创建的转储文件。DMP 中Oracle数据库实例不支持导入这些转储文件。
有关使用 Oracle Data Pump 的完整信息,可以参考官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html
有关在 Oracle Database 的版本之间进行迁移时的兼容性注意事项,参考:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html
使用 Oracle Data Pump 和数据库链接导入数据
该过程连接到源Oracle实例(可以是本地或云主机实例,或者是DMP创建的Oracle数据库实例)。
该过程使用 DBMS_DATAPUMP包导出数据。将转储文件从 Oracle 实例中复制到通过数据库链接来连接的目标 DMP Oracle 数据库实例上的 DATA_PUMP_DIR 目录。最后一步是,使用 DBMS_DATAPUMP 包,将数据从复制的转储文件中导入到 DMP 创建的Oracle 数据库实例。
此过程有以下要求:
• 您必须具有 DBMS_FILE_TRANSFER 包和 DBMS_DATAPUMP 包的执行权限。
• 您必须具有源数据库实例上的 DATA_PUMP_DIR 目录的写入权限。
• 您必须确保有足够的存储空间来存储源实例和目标数据库实例上的转储文件。
注意⚠️:
此过程将转储文件导入到 DATA_PUMP_DIR 目录中。当您导入转储文件时,会占用数据空间。因此,您应该确保您的数据库实例可适应这个额外的空间使用。导入的转储文件不会自动从 DATA_PUMP_DIR 目录中删除或清除。要删除导入的转储文件,请使用 Oracle 网站上的 UTL_FILE.FREMOVE。
使用 Oracle Data Pump 和 DBMS_FILE_TRANSFER 包的导入过程包含以下步骤。
• 步骤 1:向用户授予 DMP 目标实例上的权限
• 步骤 2:向用户授予源数据库的权限
• 步骤 3:使用 DBMS_DATAPUMP 创建转储文件
• 步骤 4:创建目标数据库实例的数据库链接
• 步骤 5:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到目标数据库实例
• 步骤 6:使用 DBMS_DATAPUMP 将数据文件导入到目标数据库实例
• 步骤 7:清除转储文件
步骤 1:向用户授予 DMP 目标实例上的权限
若要向用户授予 DMP 目标实例上的权限,请执行以下步骤:
1. 使用 SQL Plus 或 Oracle SQL Developer 连接到要导入数据的 DMP 目标 Oracle 数据库实例。 以 DMP 管理员用户(如system)的身份连接。
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 实例。如有必要,可创建用户账户并授予必要权限。
如果源数据库是有管理员用户(如system)账户权限,可直接用来执行导出,而不需要创建其他用户。
以下命令创建新用户并授予必要权限。
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 实例,或使用 DMP 管理员用户(如system)身份连接。然后,使用 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 => 'sample_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;
/
注意⚠️:数据抽取任务将异步开始,有关Data Pump 作业的信息,可使用以下SQL在数据库中惊醒查询。
SELECT SID, SERIAL#, S.USERNAME, S.STATUS, S.SQL_ID, to_char(SQL.SQL_FULLTEXT) SQLtext
FROM GV$SESSION S, DBA_DATAPUMP_SESSIONS D, GV$SQLAREA SQL
WHERE S.SADDR = D.SADDR and s.INST_ID=d.INST_ID
AND d.INST_ID=sql.INST_ID
AND S.SQL_ADDRESS = SQL.ADDRESS(+)
AND S.SQL_ID = SQL.SQL_ID(+);
步骤 4:创建目标数据库实例的数据库链接
在源库和目标库之间创建数据库链接。您本地数据库必须创建至数据库实例的网络连接,然后才能创建数据库链接以及传输导出转储文件。
以下命令创建名为 to_DMP 的数据库链接,连接到位于目标数据库实例中的 DMP 管理员用户(如system)。
create database link to_DMP connect to <master_user_account> identified by <password> using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip>) (PORT=<listener port>))(CONNECT_DATA=(SERVICE_NAME=<DMP_ORACLE_servicename >)))';
步骤 5:使用 DBMS_FILE_TRANSFER 将导出的转储文件复制到目标数据库实例
使用 DBMS_FILE_TRANSFER 将转储文件从源数据库实例复制到目标数据库实例。以下脚本将名为sample.dmp 的转储文件从源实例复制到名为to_DMP 的目标数据库链接(已在上一步中创建)。
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_DMP'
);
END;
/
步骤 6:使用 DBMS_DATAPUMP 将数据文件导入到目标数据库实例
在数据库实例中使用 Oracle Data Pump 导入架构。
使用 DMP 管理员用户(如system)账户连接到数据库实例来执行导入。
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.ADD_FILE( handle => hdnl, filename => 'sample_imp.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;
/
注意⚠️:
数据导入任务将异步开始,有关Data Pump 作业的信息,可使用以下SQL在数据库中惊醒查询。
SELECT SID, SERIAL#, S.USERNAME, S.STATUS, S.SQL_ID, to_char(SQL.SQL_FULLTEXT) SQLtext
FROM GV$SESSION S, DBA_DATAPUMP_SESSIONS D, GV$SQLAREA SQL
WHERE S.SADDR = D.SADDR and s.INST_ID=d.INST_ID
AND d.INST_ID=sql.INST_ID
AND S.SQL_ADDRESS = SQL.ADDRESS(+)
AND S.SQL_ID = SQL.SQL_ID(+);
您可以通过查看数据库实例上用户的表来验证数据导入。例如,以下查询将返回 schema_1 的表数量。
select count(*) from dba_tables where owner='SCHEMA_1';
步骤 7:清除
导入数据后,可以删除不想保留的文件。使用以下命令删除 DATA_PUMP_DIR 中不再需要的文件。
exec utl_file.fremove('DATA_PUMP_DIR','<file name>');
例如,以下命令删除名为sample_copied.dmp和sample_imp.log的文件
exec utl_file.fremove('DATA_PUMP_DIR','sample_copied.dmp');
exec utl_file.fremove('DATA_PUMP_DIR','sample_imp.log');
关于utl_file.fremove函数说明可以参考Oracle文档
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-FA16A38B-26AA-4002-9BE0-7D3950557F8C