下面我来详细讲解“oracle覆盖导入dmp文件的2种方法”的完整攻略。
1. 覆盖导入dmp文件的概述
在Oracle数据库中,如果已经存在同名的表或者数据,导入dmp文件时会直接报错。但是,有时候我们需要覆盖掉已经存在的表或数据,这时候就需要使用覆盖导入dmp文件的方法。下面分别介绍两种方法。
2. 第一种方法:使用impdp命令
2.1 导出原数据
首先需要将原有的数据进行导出,并且在导出时需要指定IGNORE=Y参数。例如:
expdp schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log content=DATA_ONLY exclude=STATISTICS compression=ALL
上述命令中,schemas指定要导出的用户,directory指定导出的文件路径,dumpfile指定导出的dmp文件名,logfile指定导出的日志文件名,content指定导出内容,exclude排除导出的对象,compression指定压缩方式。
2.2 使用impdp覆盖导入
接下来就可以使用impdp命令进行覆盖导入了。在导入时需要指定FULL=YES IGNORE=Y 参数,例如:
impdp schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log TABLE_EXISTS_ACTION=REPLACE FULL=YES IGNORE=Y
上述命令中,schemas指定要导入的用户,directory指定导入的文件路径,dumpfile指定导入的dmp文件名,logfile指定导入的日志文件名,TABLE_EXISTS_ACTION指定对已存在的表的处理方式,FULL指导入数据和元数据,IGNORE指忽略错误。
2.3 示例
例如,如果我们已经有一个名为SCOTT的用户和一张名为EMP的表,其中有一条数据:
SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---- ----------- --------- --------- ----------
7369 SMITH CLERK 7902 17-DEC-1980 800 20
现在我们将EMP表清空,并且在导出时排除了EMP表:
expdp schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log content=DATA_ONLY exclude=TABLE:"='EMP'" compression=ALL
接下来我们对SCOTT用户进行覆盖导入:
impdp schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log TABLE_EXISTS_ACTION=REPLACE FULL=YES IGNORE=Y
这时候再检查EMP表中的数据,可以看到它已经被覆盖掉了,只有导入时新加入的数据:
SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---- --------- ------ ------ ----------
101 Tom CEO 2019-08-10 2000 0 20
102 Jerry CFO 2019-08-11 1500 0 20
3. 第二种方法:使用脚本
3.1 编写脚本
第二种方法是通过编写脚本来实现覆盖导入的功能。编写脚本的过程与使用impdp命令类似,在导入时需要先判断表是否存在,如果存在则先删除已存在的表,然后再导入数据。下面是一个编写好的脚本:
SET ECHO OFF
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SET SERVEROUTPUT ON
DECLARE
file_exists BOOLEAN := FALSE;
table_exists BOOLEAN := FALSE;
BEGIN
-- check file exists
SELECT COUNT(*) INTO file_exists FROM ALL_DIRECTORIES WHERE DIRECTORY_NAME = 'DATA_PUMP_DIR';
IF file_exists = FALSE THEN
DBMS_OUTPUT.PUT_LINE('Directory DATA_PUMP_DIR is not exists!');
RETURN;
END IF;
-- check table exists
SELECT COUNT(*) INTO table_exists FROM ALL_TABLES WHERE TABLE_NAME = 'EMP' AND OWNER = 'SCOTT';
IF table_exists = TRUE THEN
EXECUTE IMMEDIATE 'DROP TABLE SCOTT.EMP CASCADE CONSTRAINTS';
DBMS_OUTPUT.PUT_LINE('Table SCOTT.EMP has been dropped!');
END IF;
-- import data
DBMS_DATAPUMP.Import(
handle => NULL,
job_name => 'IMPORT_EMP',
operation => 'IMPORT',
job_mode => 'FULL',
remote_link => NULL,
directory => 'DATA_PUMP_DIR',
dumpfile => 'SCOTT.dmp',
logfile => 'SCOTT.log',
TABLE_EXISTS_ACTION => 'REPLACE',
skip_existing => FALSE
);
DBMS_OUTPUT.PUT_LINE('Table SCOTT.EMP has been imported!');
END;
/
上述脚本首先判断导入的文件目录是否存在,然后判断表是否存在,如果存在则先删除表,最后进行数据导入。
3.2 示例
例如,我们在SCOTT用户中有一个名为EMP的表,其中有一条数据:
SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---- ----------- --------- --------- ----------
7369 SMITH CLERK 7902 17-DEC-1980 800 20
现在我们将EMP表清空,并且导出时排除了EMP表:
expdp schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log content=DATA_ONLY exclude=TABLE:"='EMP'" compression=ALL
接下来我们运行上述脚本,它会对SCOTT用户进行覆盖导入。
EXECUTE EMP_IMPORT;
这时候再检查EMP表中的数据,可以看到它已经被覆盖掉了,只有导入时新加入的数据:
SELECT * FROM SCOTT.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---- --------- ------ ------ ----------
101 Tom CEO 2019-08-10 2000 0 20
102 Jerry CFO 2019-08-11 1500 0 20
至此,“oracle覆盖导入dmp文件的2种方法”完整攻略讲解完毕,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:oracle覆盖导入dmp文件的2种方法 - Python技术站