exp/imp 命令

备份方式:
1.物理方法:指块拷贝的方式,比如rman
2.逻辑方式:exp|imp 和 expdp|impdp

imp 速度比 impdp 慢很多
在服务端运行 exp 命令,文件就存储在服务器上,在客户端运行 exp 命令,文件就存储在客户端上
expdp 只能存储在服务器上,可以通过NFS挂载到本地

延迟段对 exp 的影响
从11gR2开始,有一种新特性,叫延迟段,即延迟分配段空间,默认为开启。简单讲,默认将表(以及索引、LOB)的物理空间分配推迟到第一条记录插入到表中时。即有实际的数据插入表中时,再为每个对象初始化空间分配。

实际测试,Release 11.2.0.1.0 报错 EXP-00003
手动给表分配段
show parameter deferred_segment_creation;
select * from dba_segments where segment_nam=‘TEST’;
alter table test allocate extent;

导出用户下所有数据:

  1. 服务器端导出,服务器有多个实例的情况下需要制定ORACLE_SID
    exp可以指定在服务器端的存放位置,如果不指定则存放在当前执行命令的位置
    [oracle@orcl ~]$ exp zyb/zyb file=/u01/zyb.dmp log=/u01/zyb.log
  2. 客户端导出,需要安装客户端工具
    C:\Users\ZhangYibin> exp zyb/[email protected]:1521/orcl file=D:\zyb.dmp log=D:\zyb.log
  3. 查看exp参数
    [oracle@orcl ~]$ exp help=y

导出某个用户:
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log feedback=10 compress=y
使用 A 用户导出 B 用户的数据:
[oracle@orcl ~]$ exp system/oracle_4U file=zyb.dmp log=zyb.log owner=zyb
导出结构,不包含数据:
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log rows=n

只导出数据不导出结构?不行

导出某个用户下的几个表?
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log tables=ftest
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log tables=ftest,ftest2
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log tables=f% f 开头的表
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp log=zyb.log tables=% 导出所有表

除了某一个表或者几个表,其他全部导出?
exp不行 expdp可以

导出全库
[oracle@orcl ~]$ exp \"/ as sysdba\" file=full.dmp full=y
普通用户导出全库容易报错,建议使用管理员操作,生产环境一般按用户或表导出
SQL> grant exp_full_database to zyb;
[oracle@orcl ~]$ exp zyb/zyb file=zyb.dmp full=y

关于consistent参数
原理和读一致性读原理相同
此参数会占用undo,数据太大,会造成undo空间不足的问题
生产环境根据实际情况指定这个参数
exp zyb/zyb file=zyb.dmp log=zyb.log consistent=y

//使用触发器插入表A时同步更新表B
create table tab1(id int,name varchar2(20));
create table tab2(id int,name varchar2(20));

CREATE OR REPLACE TRIGGER zyb.TG_TEST
BEFORE INSERT ON zyb.TAB1
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
insert into tab2 (id, name) values (:New.id, :New.name);
END tg_test;
/

异机定时exp

// expbackup.sh 
// 本机就是127.0.0.1
// 0 3 * * * /u01/exp.sh > /dev/null 2>&1
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

EXP_FILE="ortest_test_`date +%Y%m%d%H%M%S`.dmp"
LOG_FILE="${EXP_FILE}.log"
cd /u01/expbackup
find . -ctime +7 -exec rm -rf {} \;
if [ -f $EXP_FILE ]; then        
        rm -f $EXP_FILE*
fi
exp hr/hr@192.168.188.11:1521/orcl.example.com file=$EXP_FILE log=$LOG_FILE CONSISTENT=y
gzip -9 /u01/expbackup/$EXP_FILE

imp命令
查看imp参数
[oracle@orcl ~]$ imp help=y
imp zyb/zyb file=zyb.dmp log=zyb.log
只导入结构:
imp zyb/zyb rows=n file=zyb.dmp log=zyb.log
只导入数据:
imp zyb/zyb data_only=y file=zyb.dmp log=zyb.log
前提:zyb schema存在

note!
用户从A表空间导出表,然后更改该用户的默认表空间再进行导入,表还是存储在以前的表空间里面,除非删除以前的表空间。
实际生产操作过程:
1.提前建立好用户,表空间建立,提前分配好空间
2.根据情况更改undo表空间,temp表空间大小
3.buffer参数的合理使用,可以加快导入速度

imp zyb1/zyb1 file=zyb.dmp
B用户执行imp命令会提示该dump文件时由A用户exp的

imp zyb1/zyb1 file=zyb.dmp fromuser=zyb touser=zyb
使用B用户为A用户进行导入,需要DBA权限
imp zyb1/zyb1 file=zyb.dmp fromuser=zyb touser=zyb1
使用B用户为B用户导入A用户的表,为自己导入表不需要DBA权限,和谁导出没有关系
imp zyb1/zyb1 file=zyb.dmp fromuser=zyb touser=zyb1 buffer=1000000 data_only=y
imp zyb1/zyb1 file=zyb.dmp fromuser=zyb touser=zyb1 buffer=1000000 data_only=y FEEDBACK=5000

全库导入full=y
imp sys/oracle_4U file=fullexp.dmp log=fullexp.log full=y
sys,system用户中有很多数据字典,全库导入可能会破坏原有的数据字典

tips
imp跨版本导入问题
数据库只会向下兼容而不会向上兼容,低版本导入到高版本
1.通过网络中转
2.使用UltraEdit文本编辑器修改
3.使用某些小工具修改

你可能感兴趣的:(oracle)