Oracle的exp/imp详解


备份概述
逻辑备份:
备份可分为两类
,物理备份和逻辑备份

物理备份:该方法实现数据库的完整恢复,但需要极大的外部存储设备,例如磁带库,具体包括冷备份和热备份。冷备份和热备份(热备份要求数据库运行在归档模式下)都是物理备份,它涉及到组成数据库的文件,但不考虑逻辑内容。
逻辑备份:
使用软件技术从数据库中导出数据并写入一个输出文件,该文件的格式一般与原数据库的文件格式不同,只是原数据库中数据内容的一个映像。因此,逻辑备份文件只能用来对数据库进行逻辑恢复,即数据导入,而不能按数据库原来的存储特征进行物理恢复。逻辑备份一般用于增量备份,即备份那些在上次备份以后改变的数据。
在进行逻辑备份时,首先要确认数据库的字符集和操作系统的字符集是否一致,如果不一致则会报错ora-00091,具体设置方法如下:

SQL> select * from v$nls_parameters where parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
PARAMETER            VALUE
-------------------- --------------------
NLS_LANGUAGE         AMERICAN
NLS_TERRITORY        AMERICA
NLS_CHARACTERSET     WE8ISO8859P1
$ export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
$ echo $NLS_LANG
AMERICAN_AMERICA.WE8ISO8859P1

exp

可以通过exp help=y或者imp help=y查看exp或imp的详细参数,下面以exp为例解释参数意义
USERID:用户名/口令
FULL:导出整个数据库,只有拥有exp_full_database角色的用户或者特权用户如sys,system等才能进行全库导出。
示例如下
exp "'/ as sysdba'" full=y
BUFFER:制定数据缓冲区大小,主要用于提高exp/imp速度,该单位为字节,不能写成buffer=1m的形式,应写成字节为单位的参数,如buffer=1048576
exp hr/hr file=t_b.dmp buffer=
1048576 tables=T

OWNER:需要导出的用户,示例如下
exp "'/ as sysdba'" owner=\(hr,scott\) file=hr_scott.dmp
上例中由于是在linux平台进行测试的,需要对
owner=\(hr,scott\)使用\进行转义

FILE:输出文件
TABLES:需要导出的表
COMPRESS:导入到一个区 (Y) 。主要目的是为了消除存储碎片,以保证某张表的所有记录都存储在连续的空间里。
但是负面效应很明显, 如果该参数值为y,则会将高水位线以下的所有extent导入到一个区中, 因此在导入时很有可能出现,明明表中数据很少,但是却花了很多时间在建立的extent上。
且自Oracle9i开始,使用了本地管理的表空间,存储碎片的问题应该比低版本好多了,笔者个人建议将compress设为n。可参加如下实验过程
SQL> create table t as select * from dba_objects;
Table created.
SQL> select segment_name,bytes/1024/1024 MB,blocks,extents,initial_extent from user_segments where segment_name='T';
SEGMENT_         MB     BLOCKS    EXTENTS INITIAL_EXTENT
-------- ---------- ---------- ---------- --------------
T                 6        768         21          65536
采用delete的方式删除表中数据,不降低HWM
SQL> delete from t;
50625 rows deleted.
SQL> commit;
Commit complete.
SQL> select segment_name,bytes/1024/1024 MB,blocks,extents,initial_extent from user_segments where segment_name='T';
SEGMENT_         MB     BLOCKS    EXTENTS INITIAL_EXTENT
-------- ---------- ---------- ---------- --------------
T                 6        768         21          65536
将compress设为n和y分别对t表进行两次导出
exp hr/hr tables=t file=t_n.dmp compress=n
exp hr/hr tables=t file=t_y.dmp compress=y
删除t表
SQL> drop table t purge;
Table dropped.
导入compress值为y的dmp文件
imp hr/hr file=t_y.dmp fromuser=hr touser=hr;
查询t表初始extent大小
SQL> select segment_name,bytes/1024/1024 MB,blocks,extents,initial_extent from user_segments where segment_name='T'
SEGMENT_         MB     BLOCKS    EXTENTS INITIAL_EXTENT
-------- ---------- ---------- ---------- --------------
T                 6        768          6        6291456
查看建表语句
SQL> select dbms_metadata.get_ddl('TABLE','T','HR') FROM DUAL;
  CREATE TABLE "HR"."T"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 6291456 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"
再次删除t表
SQL> drop table t purge;
Table dropped.
导入compress值为n的dmp文件
imp hr/hr file=t_n.dmp fromuser=hr touser=hr;
查询t表初始extent大小
SQL>select segment_name,bytes/1024/1024 MB,blocks,extents,initial_extent from user_segments where segment_name='T'
SEGMENT_         MB     BLOCKS    EXTENTS INITIAL_EXTENT
-------- ---------- ---------- ---------- --------------
T             .0625          8          1          65536
查询建表语句
SQL>select dbms_metadata.get_ddl('TABLE','T','HR') FROM DUAL;
  CREATE TABLE "HR"."T"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

可以看到当compress为y时,exp将数据导入到一个extent中,而在imp导入的时候则体现为改变原有表的存储参数,将初始化extent增大到了6291456,个人建议通常情况下将compress设置为n,避免由于初始extent过大,给降低HWM带来的不必要麻烦。
RECORDLENGTH:IO记录的长度
DIRECT:直接路径 (N)。

  • 1
  • 2
  • 3
  • 下一页

相关内容