oracle覆盖导入dmp文件的2种方法

yizhihongxing

下面我来详细讲解“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技术站

(1)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • PHP操作MySQL的常用代码段梳理与总结

    PHP是一种广泛使用的服务器端编程语言,而MySQL是一种流行的关系型数据库。PHP操作MySQL是Web开发中常见的任务之一。这篇文章将梳理并总结PHP操作MySQL的常用代码片段,并提供两个示例说明。 连接MySQL 在PHP中,连接MySQL数据库是首要任务,可以使用以下代码完成: <?php $host = "localhost&qu…

    database 2023年5月22日
    00
  • SqlServer触发器详解

    SqlServer触发器详解 触发器是一种特殊的SQL Server对象,它对数据库进行操作时会自动触发。触发器通常用于在数据库中某些操作发生时自动执行一些逻辑处理。在本文中,我们将详细介绍SqlServer触发器并提供相关示例。 SqlServer触发器基础 SqlServer触发器类型 SqlServer触发器分为两类: DML触发器:在表的数据进行增删…

    database 2023年5月21日
    00
  • 关于linux redis安装及安装遇到的问题

    下面我将详细讲解关于Linux下Redis安装及安装遇到的问题的完整攻略。 安装 Redis 步骤1:下载Redis 进入Redis的官方网站 https://redis.io/download ,选择最新版本下载。 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 步骤2:解压Redis 解…

    database 2023年5月22日
    00
  • SQL批量插入数据几种方案的性能详细对比

    下面是详细讲解“SQL批量插入数据几种方案的性能详细对比”的完整攻略,包含以下几个部分: 简介:简述SQL批量插入的概念及其优势; 方案对比:介绍3种SQL批量插入数据的方法,并对它们进行性能测试和对比; 示例说明:提供两个实际场景下的SQL批量插入案例,分别应用上述三种方案,并对它们的性能进行对比。 1. 简介 SQL批量插入是指将多条数据一次性插入数据库…

    database 2023年5月19日
    00
  • centos 安装redis并加入系统服务

      1.安装redis wget http://download.redis.io/releases/redis-3.2.5.tar.gz 解压:tar -zxvf redis-3.2.5.tar.gz 进入目录:cd redis-3.2.5 编译:make 测试: make test 可能会提示:缺失tcl8.5 安装tcl:yum install tcl…

    Redis 2023年4月12日
    00
  • 浅谈数据库优化方案

    浅谈数据库优化方案 1. 优化前的考虑 在优化数据库之前,需要先了解当前的数据库使用情况。以下是一些需要考虑的问题: 数据库规模:数据库中有多少表、多少条数据? 数据库负载:数据库的读写负载如何?高峰期和低谷期有什么不同? 数据库模式:使用了哪种数据库模式?关系型、文档型、图形型? 数据库架构:数据库的物理结构如何?单体、主从、分片等? 各种索引:哪些字段需…

    database 2023年5月19日
    00
  • SQL中ALTER和UPDATE命令的区别

    ALTER和UPDATE都是SQL命令,但它们的作用不同。 ALTER命令 ALTER命令主要用于修改数据库表的结构,比如添加、删除或改变列的属性。 以下是ALTER命令的语法: ALTER TABLE table_name ADD COLUMN column_name data_type optional_arguments; 在这个语句中,ALTER T…

    database 2023年3月27日
    00
  • 彻底杀掉redis挖矿程序及其守护进程wnTKYg

    今天又遇到了一件烦心的事,前几天刚解决服务器内存跑满的问题,今天又碰到了神奇而又久违的redis挖矿程序。 查询了一下挖矿,就是有人借助redis漏洞借用别人的服务器进行挖矿。 上次做电子商城项目时,开发过程中环境用的阿里云服务器,中途碰到了俄罗斯的ip成功黑了我的服务器,好在文件访问权限有限制,对方仅给我home目录加了密。后来,实在担心留有其它隐藏程序,…

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部