Oracle中EXP和IMP用法和介绍

2010-08-28 10:47:16来源:西部e网作者:

1、Export/Import的用处     
Oracle  Export/Import工具用于在数据库之间传递数据。     
Export从数据库中导出数据到dump文件中     
Import从dump文件中到入数据导数据库中     
下面是一般使用他们的情况     
(1)、两个数据库之间传送数据     
                同一个版本的oracle  Server之间     
                不同版本的oracle  Server之间     
                同种OS之间     
                不同种OS之间     
(2)、用于数据库的备份和恢复     
(3)、从一个SCHEMA传送到另一个SCHEMA     
(4)、从一个TABLESPACE传送到另一个TABLESPACE     
   
2、DUMP文件     
EXPORT到出的是二进制格式的文件,不可以手工编辑,否则会损坏数据。     
该文件在ORACLE支持的任何平台上都是一样的格式,可以在各平台上通用。     
   
DUMP文件在IMPORT时采用向上兼容方式,就是说ORALCE7的DUMP文件可以导入     
到ORACLE8中,但是版本相差很大的版本之间可能有问题。     
   
3、EXPORT/IMPORT过程     
EXPORT导出的DUMP文件包含两种基本类型的数据     
          -  DDL  (Data  Dictionary  Language)     
          -  Data     
DUMP文件包含所有重新创建Data  Dictionary的DDL语句,基本上是可以读的格式   
。     
但是应该注意的是,千万不要用文本编辑器编辑之,oracle说不支持这样做的。   
   
下面列出的是DUMP文件中包括的ORACLE对象,分为TABLE/USER/FULL方式,有些对   
象     
只是在FULL方式下才有(比如public  synonyms,  users,  roles,  rollback  segm   
ents等)     
   
Table  mode       User  Mode          Full  Database  Mode     
----------------------    ----------------------    ----------------------   
---     
Table  definitions              Table  definitions           Table  definitions     
Table  data                            Table  data                   Table  data     
Owner’s  table  grants        Owner’s  grants                Grants     
Owner’s  table  indexes      Owner’s  indexes             Indexes     
Table  constraints              Table  constraints           Table  constraints     
Table  triggers                    Table  triggers                 All  triggers     
                                                  Clusters                             Clusters     
                                                  Database  links                Database  links     
                                                  Job  queues                    Job  queues     
                                                  Refresh  groups              Refresh  groups     
                                                  Sequences                       Sequences     
                                                  Snapshots                        Snapshots     
                                                  Snapshot  logs                 Snapshot  logs     
                                                  Stored  procedures         Stored  procedures     
                                                  Private  synonyms            All  synonyms     
                                                  Views                                 Views     
                                                                                             Profiles     
                                                                                            Replication  catalog     
                                                                                            Resource  cost     
                                                                                            Roles     
                                                                                          Rollback  segments     
                                                                                         System  audit  options     
                                                                                         System  privileges     
                                                                                         Tablespace  definitions   
                                                                                           Tablespace  quotas     
                                                                                            User  definitions     
   
4、IMPORT时的对象倒入顺序     
在倒入数据时,ORACLE有一个特定的顺序,可能随数据库版本不同而有所变化,   
但是     
现在是这样的。     
   
    1.  Tablespaces                                                  14.  Snapshot  Logs     
    2.  Profiles                                                        15.  Job  Queues     
    3.  Users                                                              16.  Refresh  Groups     
    4.  Roles                                                              17.  Cluster  Definitions     
    5.  System  Privilege  Grants                          18.  Tables  (also  grants,commen   
ts,       
    6.  Role  Grants                                                          indexes,  constraints,  audi   
ting)     
    7.  Default  Roles                                              19.  Referential  Integrity             
                                 
    8.  Tablespace  Quotas                                      20.    POSTTABLES  actions                 
                                           
    9.  Resource  Costs                                            21.  Synonyms     
10.  Rollback  Segments                  22.  Views                         
11.  Database  Links                                            23.  Stored  Procedures     
12.  Sequences                                                      24.  Triggers,  Defaults  and  Aud   
iting     
13.  Snapshots                                               
                                                           
按这个顺序主要是解决对象之间依赖关系可能产生的问题。TRIGGER最后导入,所   
以在INSERT     
数据到数据库时不会激发TRIGGER。在导入后可能会有一些状态是INVALID的PROC   
EDURE,主要     
是IMPORT时会影响一些数据库对象,而IMPORT并不重新编译PROCEDURE,从而造成   
这种情况,     
可以重新编译之,就能解决这个问题。     
   
5、兼容性问题     
IMPORT工具可以处理EXPORT  5.1.22之后的版本导出的DUMP文件,所以你用ORACL   
E7的IMPORT     
处理ORACLE6的DUMP文件,依次类推,但是ORACLE如果版本相差很大有可能不能处   
理。具体的     
问题可以参照相应的文档,比如有关参数设置等(COMPATIBLE参数)     
   
6、EXPORT需要的VIEW     
EXPORT需要的VIEW是由CATEXP.SQL创建,这些内部VIEW用于EXPORT组织DUMP文件   
中数据格式。     
大部分VIEW用于收集创建DDL语句的,其他的主要供ORACLE开发人员用。     
   
这些VIEW在不同ORACLE版本之间有可能不同,每个版本可能都有新的特性加入。   
所以在新的     
版本里面执行旧的dump文件会有错误,一般可以执行CATEXP.SQL解决这些问题,   
解决向后兼容     
问题的一般步骤如下:     
           
      导出数据库的版本比目标数据库老的情况:     
      -  在需要导入的目标数据库中执行旧的CATEXP.SQL     
      -  使用旧的EXPORT导出DUMP文件       
      -  使用旧的IMPORT导入到数据库中     
      -  在数据库中执行新的CATEXP.SQL,以恢复该版本的EXPORT  VIEW     
   
      导出数据库的版本比目标数据库新的情况:     
      -  在需要导入的目标数据库中执行新的CATEXP.SQL     
      -  使用新的EXPORT导出DUMP文件       
      -  使用新的IMPORT导入到数据库中     
      -  在数据库中执行旧的CATEXP.SQL,以恢复该版本的EXPORT  VIEW     
           
7、碎片整理     
EXPORT/IMPORT一个很重要的应用方面就是整理碎片。因为如果时初次IMPPORT,   
   
就会重新CREATE  TABLE  再导入数据,所以整张表都是连续存放的。另外缺省情况   
   
下EXPORT会在生成DUMP文件是“压缩(COMPRESS)”TABLE,但是这种压缩在很多情   
   
况下被误解。事实上,COMPRESS是改变STORAGE参数INITIAL的值。比如:     
   
      CREATE  TABLE  ....  STORAGE(  INITIAL  10K  NEXT  10K..)     
      现在数据已经扩展到100个EXTENT,如果采用COMPRESS=Y来EXPORT数据,     
      则产生的语句时  STORAGE(  INITIAL  1000K  NEXT  10K)     
   
      我们可以看到NEXT值并没有改变,而INITIAL是所有EXTENT的总和。所以会出现   
   
如下情况,表A有4个100M的EXTENT,执行DELETE  FROM  A,然后再用COMPRESS=Y  导   
   
出数据,产生的CREATE  TABLE语句将有400M的INITIAL  EXTENT。即使这是TABLE中   
   
已经没有数据!!这是的DUMP文件即使很小,但是在IMPORT时就会产生一个巨大   
的     
TABLE.     
   
      另外,也可能会超过DATAFILE的大小。比如,有4个50M的数据文件,其中表A有   
   
15个10M的EXTENT,如果采用COMPRESS=Y的方式导出数据,将会有INITIAL=150M,   
   
那么在重新导入时,不能分配一个150M的EXTENT,因为单个EXTENT不能跨多个文   
件。     
   
8、在USER和TABLESPACE之间传送数据     
一般情况下EXPORT的数据要恢复到它原来的地方去。如果SCOTT用户的表以TABLE   
   
或USER方式EXPORT数据,在IMPORT时,如果SCOTT用户不存在,则会报错!     
   
以FULL方式导出的数据带有CREATE  USER的信息,所以会自己创建USER来存放数据   
。     
   
当然可以在IMPORT时使用FROMUSER和TOUSER参数来确定要导入的USER,但是要保   
证     
TOUSER一定已经存在啦。     
   
9、EXPORT/IMPORT对SQUENCE的影响     
在两种情况下,EXPORT/IMPORT会对SEQUENCE。     
(1)如果在EXPORT时,用户正在取SEQUENCE的值,可能造成SEQUENCE的不一致。   
   
(2)另外如果SEQUENCE使用CACHE,在EXPORT时,那些在CACHE中的值就会被忽略   
的,     
            只是从数据字典里面取当前值EXPORT。     
   
如果在进行FULL方式的EXPORT/IMPORT时,恰好在用sequence更新表中某列数据,   
   
而且不是上面两种情况,则导出的是更新前的数据。     
   
如果采用常规路径方式,每一行数据都是用INSERT语句,一致性检查和INSERT  T   
RIGGER     
如果采用DIRECT方式,某些约束和trigger可能不触发,如果在trigger中使用     
sequence.nextval,将会对sequence有影响。     
   
参数解:     
   
E:\>exp  help=y   
   
通过输入  EXP  命令和用户名/口令,您可以   
在用户  /  口令之后的命令:   
   
实例:  EXP  SCOTT/TIGER   
   
或者,您也可以通过输入跟有各种参数的  EXP  命令来控制“导出”的运行方式。   
要指定参数,您可以使用关键字:   
   
格式:  EXP  KEYWORD=value  或  KEYWORD=(value1,value2,...,valueN)   
实例:  EXP  SCOTT/TIGER  GRANTS=Y  TABLES=(EMP,DEPT,MGR)   
或  TABLES=(T1:  P1,T1:  P2),如果  T1  是分区表   
   
USERID  必须是命令行中的第一个参数。   
   
关键字  说明(默认)   
---------------------------------------------------   
USERID  用户名/口令   
FULL  导出整个文件  (N)   
BUFFER  数据缓冲区的大小   
OWNER  所有者用户名列表   
FILE  输出文件  (EXPDAT.DMP)   
TABLES  表名列表   
COMPRESS  导入一个范围  (Y)   
RECORDLENGTH  IO  记录的长度   
GRANTS  导出权限  (Y)   
INCTYPE  增量导出类型   
INDEXES  导出索引  (Y)   
RECORD  跟踪增量导出  (Y)   
ROWS  导出数据行  (Y)   
PARFILE  参数文件名   
CONSTRAINTS  导出限制  (Y)   
CONSISTENT  交叉表一致性   
LOG  屏幕输出的日志文件   
STATISTICS  分析对象  (ESTIMATE)   
DIRECT  直接路径  (N)   
TRIGGERS  导出触发器  (Y)   
FEEDBACK  显示每  x  行  (0)  的进度   
FILESIZE  各转储文件的最大尺寸   
QUERY  选定导出表子集的子句   
   
下列关键字仅用于可传输的表空间   
TRANSPORT_TABLESPACE  导出可传输的表空间元数据  (N)   
TABLESPACES  将传输的表空间列表   
   
E:\>imp  help=y   
   
可以通过输入  IMP  命令和您的用户名/口令   
跟有您的用户名  /  口令的命令:   
   
实例:  IMP  SCOTT/TIGER   
   
或者,  可以通过输入  IMP  命令和各种自变量来控制“导入”按照不同参数。   
要指定参数,您可以使用关键字:   
   
格式:  IMP  KEYWORD=value  或  KEYWORD=(value1,value2,...,vlaueN)   
实例:  IMP  SCOTT/TIGER  IGNORE=Y  TABLES=(EMP,DEPT)  FULL=N   
或  TABLES=(T1:  P1,T1:  P2),如果  T1  是分区表   
   
USERID  必须是命令行中的第一个参数。   
   
关键字  说明(默认)         
----------------------------------------------   
USERID  用户名/口令   
FULL  导入整个文件  (N)   
BUFFER  数据缓冲区大小   
FROMUSER  所有人用户名列表   
FILE  输入文件  (EXPDAT.DMP)   
TOUSER  用户名列表   
SHOW  只列出文件内容  (N)   
TABLES  表名列表   
IGNORE  忽略创建错误  (N)   
RECORDLENGTH  IO  记录的长度   
GRANTS  导入权限  (Y)   
INCTYPE  增量导入类型   
INDEXES  导入索引  (Y)   
COMMIT  提交数组插入  (N)   
ROWS  导入数据行  (Y)   
PARFILE  参数文件名   
LOG  屏幕输出的日志文件   
CONSTRAINTS  导入限制  (Y)   
DESTROY  覆盖表空间数据文件  (N)   
INDEXFILE  将表/索引信息写入指定的文件   
SKIP_UNUSABLE_INDEXES  跳过不可用索引的维护  (N)   
ANALYZE  执行转储文件中的  ANALYZE  语句  (Y)   
FEEDBACK  显示每  x  行  (0)  的进度   
TOID_NOVALIDATE  跳过指定类型  id  的校验   
FILESIZE  各转储文件的最大尺寸   
RECALCULATE_STATISTICS  重新计算统计值  (N)   
   
下列关键字仅用于可传输的表空间   
TRANSPORT_TABLESPACE  导入可传输的表空间元数据  (N)   
TABLESPACES  将要传输到数据库的表空间   
DATAFILES  将要传输到数据库的数据文件   
TTS_OWNERS  拥有可传输表空间集中数据的用户
 
 


备份例子1:导出备份数据

#!/bin/bash

#=============================================#
#        如果脚本用于crontab,下面Oracle环境变量必须设置          #
#=============================================#
ORACLE_BASE=/opt/oracle
ORACLE_HOME=$ORACLE_BASE/product/8.1.7
ORACLE_SID=oradb6
ORACLE_TERM=ansi
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
NLS_LANG=American_America.ZHS16GBK
NLS_DATE_FORMAT=YYYYMMDDHH24MISS
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
TMPDIR=/var/tmp
PATH=$PATH:$ORACLE_HOME/bin
export  ORACLE_BASE  ORACLE_HOME  ORACLE_SID  ORACLE_TERM  ORA_NLS33  NLS_LANG 
export  NLS_DATE_FORMAT  LD_LIBRARY_PATH  TMPDIR  PATH
#============================================#

BACKUPDIR=/oradata/backup;  export  BACKUPDIR
USER_PASSWD=dbuser/oracle

RESULTFILE=/export/home/oracle/log/result.log

cd  $BACKUPDIR

exp  $USER_PASSWD  log=$(date  ’+%Y%m%d’).log  file=$(date  ’+%Y%m%d’).dmp  owner=dbuser 
buffer=4096000  rows=n
if  [  $?  !=  0  ]
then
        echo  "`date`  backup  exp  fail"  >>  $RESULTFILE
        exit
fi

rm  -f  tables.txt
sqlplus  -s  $USER_PASSWD  </dev/null
set  heading  off;
set  term  off;
set  echo  off;
set  pagesize  0;
set  linesize  1000;
set  trimspool  on;
set  trimout  on;
set  feedback  off;
set  colsep  |;
spool  tables.txt;
select  table_name  from  user_tables;
spool  off;
exit;
EOF

for  table  in  $(cat  tables.txt)
do
        exp  $USER_PASSWD  log=${table}_$(date  ’+%Y%m%d’).log  file
=${table}_$(date  ’+%Y%m%d’).dmp  tables=$table  direct=y
        if  [  $?  !=  0  ]
        then
                echo  "`date`  backup  exp  $table  fail"  >>  $RESULTFILE
                exit
        fi
done

compress  -f  *.dmp

echo  "`date`  backup  succeed"  >>  $RESULTFILE
 


备份例子2:联机日备份数据

#!/usr/local/bin/bash

first_msg()
{
        echo  "******************************************************"
        echo  "    "
        echo  "The  batch  process  BACKUP_DAILY  is  starting  at  [  ’date’  ]"
        echo  "Excuting  by  LogName  =  [  $LOGNAME  ]"
        echo  "    "
}

final_msg()
{
        echo  "    "
        echo  "The  batch  process  BACKUP_DAILY  completed  at  [  ’date’  ]"
        echo  "Excuting  by  LogName  =  [  $LOGNAME  ]"
        echo  ">>>>>  Please  Make  Sure  That  It  Has  Been  Done  Successfully,  "
        echo  ">>>>>  Otherwise  You  Must  Re-do  It."
        echo  "    "
        echo  "*****************************************************"
}

#********************************
#                          Main                            *
#********************************
USER_PASSWD=system/system
ARCHIVE_DEST=/appl/oracle/oradata/orafe/arch
DEVICE=/dev/rmt/ctape1
TRC_FILE=$TRC/Z_JOB_BACKUP_DAILY
TMP_SQL=$TRC/backup_daily_tmp.sql
BACKUP_DEST=${BACKUP_PATH}/$(date  ’+%Y%m%d’)
SUCCESS=0
FAIL=1

first_msg
mkdir  -m  777  -p  $BACKUP_DEST
if  [  !  -d  $BACKUP_DEST  ]
then
        echo  "$BACKUP_DEST  create  fail"
        exit
fi

#*******************************
#            backup  archive  log            *
#*******************************
echo  "=========================================="
echo  "Backup  archive  log  begin  on  [  ’date’  ]"
echo  "alter  system  archive  log  stop;"  >  $TMP_SQL
sqlplus  -s  $USER_PASSWD  <start  $TMP_SQL
EOF
if  [  $?  !=  0  ]
then
        echo  "alter  archive  log  stop  fail"
        exit
fi
cd  $ARCHIVE_DEST
FILE_QT=’ls|grep  -c  "arch*"’
FILE=’ls|grep  "arch*"’

echo  "alter  system  archive  log  start;"  >  $TMP_SQL
sqlplus  -s  $USER_PASSWD  <start  $TMP_SQL
EOF
if  [  $?  !=  0  ]
then
        echo  "alter  archive  log  start  fail"
        exit
fi
if  [  $FILE_QT  !=  0  ]
then 
        mv  -f  $FILE  $BACKUP_DEST
        cd  $BACKUP_DEST
        compress  -f  *
        tar  -cvf  $DEVICE  *
        if  [  $?  !=  0  ]
        then
                echo  "tar  to  tape  fail"
                exit
        fi
fi
echo  "Backup  archive  log  end  on  [  ’date’  ]"
echo  "=========================================="
final_msg

备份例子3:联机全库备份数据

#!/usr/local/bin/bash

first_msg()
{
        echo  "******************************************************"
        echo  "    "
        echo  "The  batch  process  JOB_BACKUP_FULL  is  starting  at  [  ’date’  ]"
        echo  "Excuting  by  LogName  =  [  $LOGNAME  ]"
        echo  "    "
}

final_msg()
{
        echo  "    "
        echo  "The  batch  process  JOB_BACKUP_FULL  completed  at  [  ’date’  ]"
        echo  "Excuting  by  LogName  =  [  $LOGNAME  ]"
        echo  ">>>>>  Please  Make  Sure  That  It  Has  Been  Done  Successfully,  "
        echo  ">>>>>  Otherwise  You  Must  Re-do  It."
        echo  "    "
        echo  "******************************************************"
}

#**************************
#*            backup_begin            *
#**************************
backup_begin()
{
        echo  "alter  tablespace  $1  begin  backup;"  >  $TMP_SQL
        sqlplus  -s  $USER_PASSWD  <start  $TMP_SQL
EOF
        if  [  $?  !=  0  ]
        then
                return  $FAIL
        fi   
        return  $SUCCESS 
}

#**************************
#*            backup_end                *
#**************************
backup_end()
{
        echo  "alter  tablespace  $1  end  backup;"  >  $TMP_SQL
        sqlplus  -s  $USER_PASSWD  <start  $TMP_SQL
EOF
        if  [  $?  !=  0  ]
        then
                return  $FAIL
        fi   
        return  $SUCCESS 
}

#********************************
#                          Main                            *
#********************************
USER_PASSWD=system/system
BACKUP_DEST=$BACKUP_PATH/full
DEVICE=/dev/rmt/ctape1
BACKUP_CFG=$TRC/backup.cfg
TRC_FILE=$TRC/BACKUP_FULL
TMP_SQL=$TRC/backup_full_tmp.sql
SUCCESS=0
FAIL=1

first_msg
rm  -f  $BACKUP_CFG
sqlplus  -s  $USER_PASSWD  </dev/null
set  heading  off;
set  term  off;
set  echo  off;
set  pagesize  0;
set  linesize  1000;
set  trimspool  on;
set  trimout  on;
set  feedback  off;
set  colsep  =;
spool  $TRC/backup.spl;
select  tablespace_name,file_name  from  dba_data_files  order  by  tablespace_name,fi
le_name;
spool  off;
exit
EOF
tr  -d  ’  ’  <$TRC/backup.spl  >$BACKUP_CFG

rm  -f  $TRC_FILE
if  [  !  -f  $BACKUP_CFG  ]
then
        echo  "备份配置文件缺失"  >$TRC_FILE
        echo  "$BACKUP_CFG  not  found"
        exit
fi
mkdir  -m  777  -p  $BACKUP_DEST
if  [  !  -d  $BACKUP_DEST  ]
then
        echo  "备份目录创建失败"  >$TRC_FILE
        echo  "$BACKUP_DEST  create  fail"
        exit
fi
cd  $BACKUP_DEST
rm  -f  *

#*******************************
#            backup  control  file          *
#*******************************
echo  "=========================================="
echo  "正在备份控制文件"  >  $TRC_FILE
echo  "Backup  control  begin  on  [  ’date’  ]"
echo  "alter  database  backup  controlfile  to  ’$BACKUP_DEST/control.ctl’;"  >  $TMP_SQL
sqlplus  -s  $USER_PASSWD  <start  $TMP_SQL
EOF
if  [  $?  !=  0  ]
then
        echo  "备份控制文件失败"  >  $TRC_FILE
        echo  "Backup  control  file  fail"
        exit
fi 
echo  "Backup  control  end  on  [  ’date’  ]"

#*******************************
#            backup  tablespaces            *
#*******************************
TABLESPACES=’cut  -d=  -f1  $BACKUP_CFG|uniq’
for  tablespace  in  $TABLESPACES
do
        echo  "=========================================="
        echo  "正在备份$tablespace"  >  $TRC_FILE
        echo  "Backup  $tablespace  begin  on  [  ’date’  ]"
        backup_begin  $tablespace
        if  [  $?  !=  0  ]
        then
                echo  "备份$tablespace失败"  >  $TRC_FILE
                echo  "Turn  on  backup  option  of  $tablespace  fail"
                exit
        fi
        DATAFILES=’awk  -v  var=$tablespace  -F  =  ’$1==var    {print  $2}’  $BACKUP_CFG’
        for  datafile  in  $DATAFILES
        do
                if  [  !  -r  $datafile  ]
                then
                        backup_end  $tablespace
                        echo  "备份$tablespace失败"  >  $TRC_FILE
                        echo  "$tablespace:$datafile  unreadable"
                        exit
                fi
                compress  -c  $datafile  >  $BACKUP_DEST/’basename  $datafile’.Z
                if  [  $?  !=  0  ]
                then
                        backup_end  $tablespace
                        echo  "备份$tablespace失败"  >  $TRC_FILE
                        echo  "Backup  $tablespace:$datafile  fail"
                        exit
                fi
        done
        backup_end  $tablespace
        echo  "Backup  $tablespace  end  on  [  ’date’  ]"
done

#**************************
#                tar  files                *
#**************************
echo  "=========================================="
echo  "正在备份至磁带"  >  $TRC_FILE
echo  "tar  to  tape  on  [  ’date’  ]"
cd  $BACKUP_DEST
tar  -cvf  $DEVICE  *
if  [  $?  !=  0  ]
then
        echo  "备份至磁带失败"  >  $TRC_FILE
        echo  "tar  to  tape  fail"
        exit
fi
echo  "tar  to  tape  on  [  ’date’  ]"
echo  "=========================================="

echo  "全备份已完成"  >  $TRC_FILE
final_msg

 

关键词:Oracle

赞助商链接: