1. exp/imp(导出与导入)
1.1 基本命令:
$exphelp=y
$imphelp=y
2.三种工作方式
(1)交互方式:
$exp //然后按照提示输入所需要的参数
(2)命令行方式:
$expuser/pwd@dbname file=/oracle/test.dmp full=y
(3)参数文件方式:
$expparfile=username.par//在参数中输入所需的参数
userid=username/userpassword
buffer=8192000
compress=n
grants=y
file=/oracle/test.dmp
full=y
3.三种模式
(1)表方式,将指定表的素具导出/导入。
导出:
导出一张或几张表:
$expuser/pwd file=/dir/xxx.dmplog=xxx.logtables=table,table2
导出某张表的部分数据:
$expuser/pwd file=/dir/xxx.dmplog=xxx.logtables=table1 query\"where coll=\'...\' and col2...;
导入:
导入一张表或几张表
$imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1, table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y
(2)用户方式,将指定用户的所有对象及数据导入/导出
导出:
$exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx ,yy)
只导出数据对象,不导出数据:
$exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n
导入;
$imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser-dbuser touser=dbuser2 commit=y ignore=y
(3)全库方式,数据库中的所有对象导出/导入
导出:
$exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y commit=y ignore=y
导入:
$imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
1.2高级选项
1.分割成多个文件
以多个文件固定大小文件方式导出:这种做法通常用在表数据量较大,单个dump文件可能会超出文件系统的限定的情况
$exp user/pwd file=1.dmp, 2.dmp, 3.dmp,...filesize=1000m log=xxx.log full=y
以多个固定大小文件方式导入:
$imp user/pwd file=1.dmp,2/dmp, 3.dmp.....filesize=1000m tables=xxx fromuser=dbuser touser=dbuser commit=y ignore=y
2.增量导出/导入
必须为SYS or SYSTEM 才可以增量导出/导入
增量导出:
(1)“完全”增量导出//备份整个数据库
$exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)增量型导出, 导出上一次备份后改变的数据
` $exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
(3)“累计型”增量导出,只导出自上次“完全”导出之后数据库中的变化了的信息
$exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量导入:
$imp user/pwd full=y unctype=system/retore/inctype
其中:
system: 导入系统对象
retore: 导入所有用户对象
3.表空间传输
1.关于表空间传输的规则:
源数据库和目标数据库必须运行在相同的硬件平台
源数据库与目标数据库一定要有相同到校的数据块
源数据库与目标数据库一定要有相同大小的数据块
目标数据库不能有与迁移表空间相同的表空间
SYS的对象不能迁移
必须传输自包含的对象集
有一些对象,如视图,基于函数的索引等不能被传输
2.检测一个表空间是否符合标准的方法:
SQL> exec sys.dbms_tts.transport_set_check('tablespace_name', true);
SQL>select * from sys.transport_set_Violations;
3.步骤:
1) 设置表空间为只读(空间名字假设:APP_Data and APP_Index)
SQl>alter tablespace app_data read only;
SQL>alter tablespace app_index read only;
2)发出EXP Command
SQL>host exp userid=''''''sys/password as sysdba''''''transport_tablespace=y
tablespaces=(app_data,app_index)
3)拷贝.dbf数据文件(及.dmp文件)到另一个地点,及目标数据库
cp(unix) or copy(Win)or 通过ftp传输文件
4)把本地的表空间设置为读写
$alter tablespace app_data read write;
$alter tablespace app_index read write;
5)在目标数据库附加数据文件(直接指定数据文件名)
transport_tablespace=y datafiles=("a:\app_data.dbf,C:\app_index.dbf")
tablespace=app_data,app_index tts_owner=hr,oe
6)设置目标数据库表空间读写
$alter tablespace app_data read write
$alter tablespace app_index read write
4.优化
1. 加快exp速度
加大large_pool_size,可以提高exp 的速度
采用直接路径的方式(direct=y),数据不需要经过内存进行整合和检查.
设置较大的buffer,如果导出大对象,小buffer 会失败。
export文件不在ORACLE 使用的驱动器上
不要export到NFS 文件系统
UNIX环境:用管道模式直接导入导出来提高imp/exp 的性能
2. 加快imp速度
建立一个indexfile,在数据import完成后在建立索引
将import 文件放在不同的驱动器上
增加DB_BLOCK_BUFFERS
增加LOG_BUFFER
用非归档方式运行ORACLE:ALTER DATABASE NOARCHIVELOG;
建立大的表空间和回滚段,OFFLINE 其他回滚段,回滚段的大小为最大表的1/2
使用COMMIT=N
使用ANALYZE=N
单用户模式导入
UNIX环境:用管道模式直接导入导出来提高imp/exp 的性能
3. 通过unix/Linux PIPE管道加快exp/imp速度
通过管道导出数据:
1.通过mknod -p 建立管道
$ mknod /home/exppipe p // 在目录/home下建立一个管道exppipe注意参数p
2.通过exp 和gzip 导出数据到建立的管道并压缩
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ exp test/test tables=bitmap file=/home/newsys/test.pipe &
gzip < /home/newsys/test.pipe > bitmap.dmp.gz
3.导出成功完成之后删除建立的管道
$ rm -rf /home/exppipe
导出脚本:
###UNIX 下ORACLE 数据库通过PIPE 管道进行备份
###### using "export" and "tar" command to bakup oracle datebase #######
trap "" 1 #nohup
LOGFILE=/opt/bakup/log/bakup_ora.log
export LOGFILE
DUMPDIR=/archlog_node1
export DUMPDIR
exec >$LOGFILE 2>&1
echo
echo ' Begin at ' `date`
echo
# clear old result file
cd $DUMPDIR
if [ -f exp.dmp.Z ]
then
echo "clear old result file"
rm exp.dmp.Z
fi
# make pipe
mkfifo exp.pipe
chmod a+rw exp.pipe
# gain the dmp.Z file
compress < exp.pipe > exp.dmp.Z&
su -u oracle -c "expuserid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000