|
1. exp/imp(导出与导入)
1.1 基本命令:
$exp help=y
$imp help=y
2.三种工作方式
(1)交互方式:
$exp //然后按照提示输入所需要的参数
(2)命令行方式:
$exp user/pwd@dbname file=/oracle/test.dmp full=y
(3)参数文件方式:
$exp parfile=username.par //在参数中输入所需的参数
userid=username/userpassword
buffer=8192000
compress=n
grants=y
file=/oracle/test.dmp
full=y
3.三种模式
(1)表方式,将指定表的素具导出/导入。
导出:
导出一张或几张表:
$exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table,table2
导出某张表的部分数据:
$exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=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 "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000
echo
echo ' exp end at '`date`
echo
# rm pipe
rm exp.pipe
# tar the dmp.Z file to tape
mt -f /dev/rmt/0 rew
tar cvf /dev/rmt/0 exp.dmp.Z
echo
echo ' tar end at '`date`
echo
通过管道导入生成的文件:
1.通过mknod -p 建立管道
$ mknod /home/exppipe p
2.导入生成的压缩文件
$ imp test/test file=/home/exppipe fromuser=test touser=macro &
gunzip < exp.dmp.gz > /home/exppipe
3.删除管道
$ rm –fr /home/exppipe
4. 全库导入的一般步骤
注意:在导出时,需要通过toad或其他工具提取源数据库创建主键和索引的脚本
1. 先全库加rows=n把结构导进去
$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n
2. 使业务用户的触发器失效/删除主键和唯一索引
spool drop_pk_u.sql
select 'alter table '||table_name||' drop constraint '||constraint_name||';'
from user_constraints
where constraint_type in ('P','U');
/
spool off
spool disable_trigger.sql
select 'alter trigger '||trigger_name||' disable;'
from user_triggers;
/
spool off
@drop_pk_u.sql
@disable_trigger.sql
3. 以ignore=y全库导入
$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y
4. 通过toad或其他工具提取源数据库创建主键和索引的脚本,在目标数据库中创建主键和索引。使触发器生效。
5. 版本问题
Exp/Imp 很多时候,可以跨版本使用,如在版本7与版本8 之间导出导入数据,但这样做必须选择正确的版 本,规则为:
·总是使用IMP 的版本匹配数据库的版本,如果要导入到816,则使用816 的导入工具。
·总是使用EXP的版本匹配两个数据库中低的那个版本,如在815 与816之间互导,则使用815的EXP工具。
imp 和exp 版本不能往上兼容: imp 可以导入低版本exp 生成的文件, 不能导入高
版本exp 生成的文件
|
|
|