浅谈exp/imp(上)

作为DBA,经常需要在不同数据库环境间做数据的导入导出,exp/imp就是这样的轻便快捷的客户端工具,可以很方便的在不同数据库之间转移数据对象,即使数据库位于不同的硬件或者软件平台上。exp会转储产生对应的二进制文件,里面包含数据的定义信息,数据内容等,也就是我们通常所说的dump文件。

exp/imp是比较经典的数据导出导入工具,不过自expdp/impdp推出以来,exp/imp还是受到了不少的冷落,在新的数据库版本中,支持力度都集中在了expdp/impdp上面。Expdp/impdp是基于服务端的数据导入导出工具,性能上和功能上要更胜一筹,不过不管怎样,exp/imp确实是一款比较轻巧的工具,对于小表的处理效果还是相当不错的。

使用exp/imp的场景

使用exp/imp主要有4种模式:数据库模式,表模式,用户模式,可传输表空间模式,在此基础上使用比较多的还有基于query选项的数据选择性抽取和数据结构导出。

数据库模式

数据库模式主要是作为全库备份使用的,可以导出除sys之外的数据库里的所有对象,在数据量较小的情况下是一个不错的选择。

exp n1/n1
file=db_backup.dmp full=y

表模式

表模式可以导出某个用户下指定的表,比如我们需要导出的表名为:test1,test2

exp n1/n1
file=table_mode.dmp tables=test1,test2

用户模式

用户模式可以导出指定用户下所有的对象,比如导出用户user1下所有的对象

exp n1/n1
file=user_mode.dmp owner=user1

传输表空间模式常作为数据迁移时的一种方法,在数据迁移篇中会有详细的描述 海量数据迁移之传输表空间(一)  http://blog.itpub.net/23718752/viewspace-1703358/

同理,imp中也会存在同样的四种模式,使用方法都是类似的。

除了常用的4种模式之外,使用query选项选择性导出数据也是一种很使用的方法。比如存在一个表test,我们希望根据字段object_type=’TABLE’的条件来选择性导出数据,可以使用query选项完成。

使用Query选项做选择性数据导出

exp n1/n1
file=query_bak.dmp query=\" where 
object_type= \'TABLE\' \" 
tables=test

得到对象的ddl语句

还有一个功能点可能大家不太注意,就是能够很方便得到ddl相关的语句。

比如我们希望得到表test的建表语句,可以通过exp/imp这么做。

exp n1/n1
rows=n compress=n tables=test file=test.dmp log=exp_test.log   buffer=10240000

imp n1/n1
rows=n full=y  ignore=y show=y
file=test.dmp log=imp_test.log 
buffer=10240000

得到的建表语句就会是下面的样子。

import done in AL32UTF8
character set and AL16UTF16 NCHAR character set

. importing N1's objects into
N1

. importing N1's objects into
N1

 "CREATE TABLE "TEST"
("OWNER" VARCHAR2(30) NOT NULL ENABLE, "OBJECT_NAME"
VA"

 "RCHAR2(30) NOT NULL ENABLE,
"SUBOBJECT_NAME" VARCHAR2(30), "OBJECT_ID" NUMB"

 "ER NOT NULL ENABLE,
"DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(19),
"C"

 "REATED" DATE NOT NULL ENABLE,
"LAST_DDL_TIME" DATE NOT NULL ENABLE, "TIMEST"

 "AMP" VARCHAR2(19),
"STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1),
"GENERATE"

 "D" VARCHAR2(1),
"SECONDARY" VARCHAR2(1), "NAMESPACE" NUMBER NOT NULL
ENABLE"

 ", "EDITION_NAME"
VARCHAR2(30))  PCTFREE 10 PCTUSED 40
INITRANS 1 MAXTRANS 2"

 "55 STORAGE(INITIAL 65536 NEXT 1048576
MINEXTENTS 1 FREELISTS 1 FREELIST GRO"

 "UPS 1 BUFFER_POOL DEFAULT) TABLESPACE
"USERS" LOGGING NOCOMPRESS"

 "CREATE INDEX "IDX_TEST" ON
"TEST" ("OBJECT_ID" DESC , "OBJECT_NAME" ,
"OBJE"

 "CT_TYPE" )  PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1"

 "048576 MINEXTENTS 1 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL DEFAULT) TABL"

 "ESPACE "USERS" LOGGING"

看起来确实是不太直观,如果自己想直接使用还得手工格式化,这个时候我们可以借助awk来格式化一下。看起来好像挺抽象,但是功能还是很强大的。

awk '

  / \"BEGIN /   { N=1; }

  / \"CREATE /   { N=1; }

  / \"CREATE INDEX/   { N=1; }

  / \"CREATE UNIQUE INDEX/  { N=1; }

  / \"ALTER /   { N=1; }

  / \" ALTER /   { N=1; }

  / \"ANALYZE /   { N=1; }

  / \"GRANT /    { N=1; }

  / \"COMMENT /   { N=1; }

  / \"AUDIT /     { N=1; }

  N==1 { printf "\n/\n"; N++ }

  /\"$/ {

    if (N==0) next;

    s=index( $0, "\"" );

    ln0=length( $0 )

    if ( s!=0 ) {

      lcnt++

      if ( lcnt >= 30 ) {

        ln=substr( $0,s+1,length(
substr($0,s+1))-1)

        t=index( ln, ")," )

        if ( t==0 ) { t=index( ln, ",
" ) }

        if ( t==0 ) { t=index( ln, ")
" ) }

        if ( t > 0 ) {

          printf "%s\n%s",substr(
ln,1,t+1), substr(ln, t+2)

          lcnt=0

        }

        else {

          printf "%s", ln

          if ( ln0

        }

      }

      else {

        printf "%s",substr(
$0,s+1,length( substr($0,s+1))-1 )

        if ( ln0

      }

    }

  }

  END { printf "\n/\n"}

' imp_test.log |sed '1,2d;
/^$/ d;

s/STORAGE *(INI/~    STORAGE (INI/g;

s/, "/,~    "/g;

s/ (\"/~   &/g;

s/PCT[FI]/~    &/g;

s/[( ]PARTITION /~&/g;

s/) TABLESPACE/)~    TABLESPACE/g;

s/   , / ,~/g;

s/ DATAFILE  /&~/' | tr "~" "\n"

看看格式化后的结果,如此显著的结果是不是有一种马上想试试的冲动。

 
CREATE TABLE "TEST"

    ("OWNER"
VARCHAR2(30) NOT NULL ENABLE,

   
"OBJECT_NAME" VARCHAR2(30) NOT NULL ENABLE,

   
"SUBOBJECT_NAME" VARCHAR2(30),

    "OBJECT_ID"
NUMBER NOT NULL ENABLE,

    "DATA_OBJECT_ID"
NUMBER,

   
"OBJECT_TYPE" VARCHAR2(19),

    "CREATED"
DATE NOT NULL ENABLE,

   
"LAST_DDL_TIME" DATE NOT NULL ENABLE,

    "TIMESTAMP"
VARCHAR2(19),

    "STATUS"
VARCHAR2(7),

    "TEMPORARY"
VARCHAR2(1),

    "GENERATED"
VARCHAR2(1),

    "SECONDARY"
VARCHAR2(1),

    "NAMESPACE"
NUMBER NOT NULL ENABLE,

   
"EDITION_NAME" VARCHAR2(30)) 

    PCTFREE 10 PCTUSED 40
INITRANS 1 MAXTRANS 255

    STORAGE (INITIAL 65536
NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

    TABLESPACE
"USERS" LOGGING NOCOMPRESS

/

CREATE INDEX "IDX_TEST" ON "TEST"

    ("OBJECT_ID"
DESC ,

   
"OBJECT_NAME" ,

   
"OBJECT_TYPE" ) 

    PCTFREE 10 INITRANS 2
MAXTRANS 255

    STORAGE (INITIAL 65536
NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

    TABLESPACE
"USERS" LOGGING

/

时间: 2024-07-30 10:48:36

浅谈exp/imp(上)的相关文章

浅谈exp/imp(下)

你可能 不了解的dump文件 在工作中,dump文件对于dba而言是再平常不过的文件了.不过因为dump文件是二进制文件,所以大家可能在平时使用中也不太关注,不过尽管如此,在导入dump文件的时候还是有很多的细节和技巧值得注意,可以避免一些不必要的问题. [荆波1] 如何查看dump文件的一些基本信息 当你拿到一个dump文件的时候,不能盲目导入,我们可以基于当前的dump文件作一些基本的检查. 比如我们可以查到dump文件导出的版本,时间,导出的用户. 尽管dump文件是二进制文件,但是我们还

浅谈在网页上显示日期的两种方法

网页|显示 在上网的时候,经常会在一些网页上看到当前的日期,如"今天是×年×月×日星期×"等字样.为了显示系统当前的日期,一般采用脚本语言VBScript或JavaScript,两种语言有其各自的特点,特别在网页教学中,通过这两种语言的运用和对比,能达到较好的教学效果,现分别介绍它们的设计过程. 一.采用VBScript脚本语言 用VBScript脚本语言来显示系统当前的日期,通常使用其内部提供的日期和时间函数: Date--返回系统日期 Weekday(x)--返回日期x是星期几 Y

浅谈在网页上显示当前日期的两种方法

日期|网页|显示 在上网的时候,经常会在一些网页上看到当前的日期,如:"今天是×年×月×日星期×"等字样.为了显示系统当前的日期,一般采用脚本语言VBScript或JavaScript,两种语言有其各自的特点,特别在网页教学中,通过这两种语言的运用和对比,能达到较好的教学效果,更能达到举一反三的作用,现分别介绍它们的设计过程. 一.采用VBScript脚本语言 用VBScript脚本语言来显示系统当前的日期,通常使用其内部提供的日期和时间函数: Date--返回系统日期 Weekday

浅谈在网站上挂广告的一些事

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 做网站快有一个月了,IP一直不多,而自己刚建站就把广告挂了上去,现在才发现挂广告完全不是那么回事,主要表现在哪几点呢? 一.给人造成一种反感 我的是电影站\51优酷网www.51youku.com怎么说呢?本来电影站想盈利就是靠流量,有流量就有人来点我们的广告,但是呢?我们的广告从第一天挂到现在却没有一个人点.这还是小事,你不点总有人要点.但

浅谈缓冲区溢出之栈溢出<上>

有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠,又是内核补丁.打完这个补丁后MD的内核符号文件又得更新了.于是抱怨了几句,一旁的兄弟问什么是缓冲区溢出.这个-三两句话还真说不清楚.解释这个问题用C语言比较方便,但是单从C代码是看不出来什么的,具体原理要分析机器级代码才能说清楚.既然是浅谈原理,那就从最基本的开始吧. 本文的定位是对此方面一无所知的读者,所以大牛们可以直接飘过- 缓冲区溢出这个名词想必大家并不陌生吧,在微

浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)_php技巧

我们通过前篇:<浅谈web上存漏洞及原理分析.防范方法(安全文件上存方法)>,已经知道后端获取服务器变量,很多来自客户端传入的.跟普通的get,post没有什么不同.下面我们看看,常见出现漏洞代码.1.检测文件类型,并且用用户上存文件名保存 复制代码 代码如下: if(isset($_FILES['img'])){    $file = save_file($_FILES['img']); if($file===false) exit('上存失败!');  echo "上存成功!&q

彭洪伟:浅谈现在论坛推广方法上的一些变化

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 很多朋友都看过牟长青前两年写的" 论坛宣传细化法(上)","论坛宣传细化法(中)"这两篇文章吧!这也成了当时最流行的网络推广文章之一.也让很多的网络推广初学者获益匪浅.笔者也是众多获益人群中的一个.就在上周末,我们在一起小聚的时候,也在说论坛推广这个问题.他说,很久没有接触论坛推广了,写了上,中两篇,下

浅谈Android获取ImageView上的图片,和一个有可能遇到的问题

1.在获取图片前先调用setDrawingCacheEnabled(true)这个方法: 举例:mImageView.setDrawingCacheEnabled(true); 2.之后可以通过getDrawingCache()获取图片 举例:Bitmap obmp = Bitmap.createBitmap(mImageView.getDrawingCache());  //获取到Bitmap的图片 3.获取完图片后记得调用setDrawingCacheEnabled(false) 举例:mI

phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结)

phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 本篇文章的目的在于把框架自带的一些好用,封装好的一些方便开发的类库简单的说一下,灵活使用可以提高开发效率,再就是因为在交流过程中有很多童鞋提出了一些关于什么样的项目怎么用API和web端怎么使用API这类的问题,我就我的理解把我的一些想法和大家交流一下,最后是对于入门篇做一下总结,以及对后面的一些教程做一下说明. 附上: 官网地址