一、概述

exp/imp是oracle中的一个逻辑导出和导入工具,假想一个场景,当我们使用exp命令在对用户进行导出的时候,如果该用户中的某些表的数据有修改,或表结构进行了修改,或者表被删除,那么我们导出来的文件是一个什么状态呢?带着这种疑问,做做实验吧。

二、实验环境

oracle数据库版本选择11.2.0.4
在scott用户下面创建如下实验表

实验包括以下方案
第一批实验(普通导出)
1. 删除表中的部分行
2. truncate表
3. 删除表的字段
4. drop表

第二批实验(加了闪回导出)
5. 删除表中的部分行
6. truncate表
7. 删除表的字段
8. drop表

三、开始实验

第一批实验(普通导出)

1. 删除表中部分行

session 1:
exp system/123456 owner=scott file=scott.dmp log=exp.log

session 2:
delete from z9 where rownum < 9;
commit;
注:当session1开始执行导出的时候,立刻执行session2,即导出的动作发生之后,赶在z9表导出之前就对z9表做相关修改,后面的所有操作都是。


观察日志可以看到z9表的数据比z8表的数据少了8行,所以在exp命令发出之后,对表的行进行修改,如果该表还没有开始备份,那么导出为删除行之后的状态。

2. truncate表

session 1:
exp system/123456 owner=scott file=scott.dmp log=exp.log

session 2:
truncate table z9;


在exp命令发出之后,对表进行truncate,如果该表还没有开始备份,那么导出为truncate之后的状态。

3. 删除表的字段

session 1:
exp system/123456 owner=scott file=scott.dmp log=exp.log

session 2:
alter table z9 drop column object_name;


在exp命令发出之后,对表进行字段的修改,如果该表还没有开始备份,那么导出为字段修改之后的状态。

4. drop表

session 1:
exp system/123456 owner=scott file=scott.dmp log=exp.log

session 2:
drop table z9;


表被drop之后,这张表就不会进行备份了

第二批实验(加了闪回导出)

重新创建z9表
create table z9 as select * from t1;

5. 删除表中的部分行

session 1:
date "+%Y%m%d %H:%M:%S"
20191012 15:06:27
exp system/123456 owner=scott file=scott.dmp log=exp.log flashback_time=\"to_timestamp\(\'20191012 15:06:27\'\,\'yyyy-mm-dd hh24:mi:ss\'\)\"

session 2:
delete from z9 where rownum < 9;
commit;


可以看到导出的数据z8和z9的总行数一致,也就是说导出的数据是在exp命令发出后的一致性快照,对表中数据的修改不会反映到备注中。

6. truncate表

session 1:
date "+%Y%m%d %H:%M:%S"
20191012 15:10:47
exp system/123456 owner=scott file=scott.dmp log=exp.log flashback_time=\"to_timestamp\(\'20191012 15:10:47\'\,\'yyyy-mm-dd hh24:mi:ss\'\)\"

session 2:
truncate table z9;


导出z9失败

7. 删除表的字段

session 1:
date "+%Y%m%d %H:%M:%S"
20191012 15:13:52
exp system/123456 owner=scott file=scott.dmp log=exp.log flashback_time=\"to_timestamp\(\'20191012 15:13:52\'\,\'yyyy-mm-dd hh24:mi:ss\'\)\"

session 2:
alter table z9 drop column object_name;


导出z9失败

8. drop表

session 1:
date "+%Y%m%d %H:%M:%S"
20191012 15:16:05
exp system/123456 owner=scott file=scott.dmp log=exp.log flashback_time=\"to_timestamp\(\'20191012 15:16:05\'\,\'yyyy-mm-dd hh24:mi:ss\'\)\"

session 2:
drop table z9;


导出z9失败

四、结论


通过以上实验可以看出,exp在导出的时候会先查下该用户下面有哪些表,然后对这些表依次导出,在这期间对表的dml和ddl都会反映到备份中去。
闪回导出时,如果有表的修改,数据库会试图闪回到闪回的时间节点上去,但是如果对表做了ddl操作,比如truncate,alter都会闪回失败,会造成该表的导出失败。

Oracle - exp实战的更多相关文章

  1. oracle EXP导出一张表时使用query参数指定where条件

    oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...

  2. oracle exp imp

    oracle exp/imp

  3. oracle exp 无法导出空表

    oracle exp 无法导出空表   select 'alter table '|| a.table_name ||' allocate extent;' from user_tables a wh ...

  4. oracle exp不生成dumpfile,预估出实际导出文件的大小。

    目的:在不创建dumpfile前预估出需要的导出文件大小.  适用于export     实验步骤如下:OS:  Linux test20 2.6.18-238.el5 #1 SMP Sun Dec ...

  5. 解决 Oracle exp导出表数据时空表不能导出的问题

    一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参 ...

  6. ORACLE EXP/IMP的使用详解

    导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp 是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的 ...

  7. ORACLE EXP命令

    本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其对应的參数进行了说明,然后通过一些演示样例进行演练,加深理解.文章最后对运用这两个命令可能出现的问题(如权限不够,不同o ...

  8. oracle exp、imp实现导出导入

    一.说明    oracle 的exp/imp命令用于实现对数据库的导出/导入操作; exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件; imp命令用于把本地的数据库dmp文件从本地导 ...

  9. Oracle exp/imp数据导入导出工具基本用法

    一.获取帮助 exp/imp help=y 二.数据导出 1.将数据库完全导出,设置full选项exp system/manager@orcl file=d:\db.dmp full=y 2.导出数据 ...

随机推荐

  1. mysql那些事(5)建表存储引擎的选择

    在mysql见表的时候,会遇到选择存储引擎:MyISAM和InnoDB.究竟用哪种存储引擎好呢? 1.MyISAM:表锁:支持全文索引:读并发性能较好. 2.InnoDB:行锁:支持事务,支持外键:写 ...

  2. 用生动的案例一步步带你学会python多线程模块

    鱼和熊掌不可兼得 鱼,我所欲也,熊掌,亦我所欲也,二者不可得兼,舍鱼而取熊掌者也. 从6月开始写公众号,连着四个月一直尽量保证一周五更,结果整天熬夜搞的身体素质骤降.十一休假决定暂时将公众号放放,好好 ...

  3. 带你从头到尾捋一遍MySQL索引结构(1)

    从一个简单的表开始 create table user( id int primary key, age int, height int, weight int, name varchar(32) ) ...

  4. 面试官:如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已经更改

    本篇文章由我的 一日一题 中的四个 Issue 组合而成 [Q111]http 响应头中的 ETag 值是如何生成的 [Q112]如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已 ...

  5. go基础之不定参函数

    指定类型参数 任意类型参数的变参 go语言同其他编程一样也提供了对变参函数的支持.本文简单讲解一下go中变参函数的使用方法. 指定类型参数 不定参数是指函数传入参数的个数为不确定数量,个数需要在调用的 ...

  6. 史上最全的linuxvi命令的总结

    第8章 linux编辑文件内容命令 8.1 vi命令 8.1.1 快速移动光标技巧 ID 快捷键 快捷键说明 1 G 将光标快速移动到最后一行 2 gg 将光标快速移动到行首 3 nG 将光标快速移动 ...

  7. Day 03 作业

    简述变量的组成 变量名,赋值符号,变量值 简述变量名的命名规范 变量名应该能反映变量值所描述的状态 变量名必须以字母数字下划线组合且不能以数字开头 变量名不能是关键字 简述注释的作用 让后面的代码失效 ...

  8. Jmeter性能测试配置

    目录 Jmeter检查点/断言 Jmeter事务 Jmeter集合点 Jmeter检查点/断言 在上一章节中,我们通过调试脚本,通过人工验证脚本可以完成业务功能, 但在性能测试中,我们希望能通过自动验 ...

  9. Orleans[NET Core 3.1] 学习笔记(一).NET环境下的分布式应用程序

    前言 Orleans是一个跨平台的框架,用于搭建可扩展的分布式应用程序 第一次接触Orleans还是两年前做游戏服务器的时候,用SignalR+Orleans的组合,写起代码来不要太爽. 即将进入20 ...

  10. ruby 构建API接口流程代码

    来源:https://ruby-china.org/topics/25822 1.创建新项目 rails new api_demo 2.生成控制器: # 我们不需要生成资源文件 $ bundle ex ...