【IT168技术文档】
1.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 // 在参数
文件中输入所需的参数
参数文件 us
ername.par 内容
userid=username/userpassword buffer=8192000
compress
=n grants=y
file=/oracle/tes
t.dmp full=y
3
.
三种模式
(
1
)表方式,将指定表的数据导出
/
导入。
导出:
导出一
张或几张表:
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2
导出某
张表的部分数据
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\”where
col1=\’…\’
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)
只导出
数据对象,不导出
数据
(rows=n )
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log wner=user rows=n
导入
:
$
imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
com
mit=y ignore=y
(
3
)全库方式,将数据库中的所有对象导出
/
导入
导出:
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycom
mit=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,…files
ize=1000m
log=xxx.log full=y
以
多个固定大小文件方式导入
$
imp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=xxx fromuser=dbuser touser=dbuser2 commit=y ignore=y
2
.
增量导出
/
导入
//
oracle 9i 以后 exp
不再
支持
inctype
必须为
SYS 或
SYSTEM 才可执行增量导
出导入
增量导出
: 包
括三个类型:
(1)“完
全”增量
导出(Complete)
// 备份
整个数据库
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)“增
量型”增
量导出
导出
上一次备份后改变的数据。
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=increm
ental
(3)
“累计
型”增量
导出(Cum
ulative)只
导出自上次“完
全”导出
之后数据库中变化 了
的信息。
$
exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cum
ulative
增量导入
:
$
imp usr/pwd FULL=y inctype=system/restore/inct ype
其
中:
SYSTE
M: 导入
系统对象
RE
STORE: 导入
所有用户对象
3
.
以
S
Y
S
DBA
进行导出
/
导入
1.
用于
Oracle 技术
支持
2.
用于表空间传输
例:
$
imp \'usr/pwd@instance as sysdba\' tablespaces=xx transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf
$
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y
“datafile=(c:tempapp_data,c:tempapp_index)”
4
.
表空间传输
(
速
度快
)
表空
间传输是
8i 新增加的
一种快速在数据库间移动数据的一种办法,是把一个数 据
库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成
dmp 文件,
这 在
有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。
1
.
关于传输表空间有一些规则
(10g
前
)
:
?
源数据
库和目标数据库必须运行在相同的硬件平台上。
?
源数据
库与目标数据库必须使用相同的字符集。
?
源数据
库与目标数据库一定要有相同大小的数据块
?
目标数
据库不能有与迁移表空间同名的表空间
?
SYS 的
对象不能迁移
?
必须传
输自包含的对象集
?
有一些
对象,如物化视图,基于函数的索引等不能被传输
(同字
节序文件的跨平台可以用更换数据文件的文件头的方法)
(10g
支持跨
平台的表空间传输,只要操作系统字节顺序相同,就可以进行表空间 传输
。需要使用
RMAN转
换文件格式,略)
2
.
检测一个表空间是否符合传输标准的方法:
SQL
> exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); SQL > select * from sys.transport_set_violations;
如果
没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包
含
的表空间,如数据表空间和索引表空间,可以一起传输。
3
.
简
要使用步骤:
如果想
参考详细使用方法,也可以参考 ORACLE联机帮
助。
1.设置表
空间为只读(假定表空间名字为 APP_Data
和
APP_Index)
SQL
> alter tablespace app_data read only; SQL > alter tablespace app_index read only;
2.发出
EXP命令
SQL>
host exp userid=”””sys/password as sysdba””” trans
port_tablespace=y tablespaces=(app_data,
app_index)
以
上需要注意的是
·为了在 SQL 中执行 E
XP,USE
RID 必须用三
个引号,在 UNIX中
也必须注意 避
免“/”的使用
·在 816和以后,必须
使用
sysdba才能
操作
·这个命
令在 SQL中必
须放置在一行(这里是因为显示问题放在了两行)
3.拷贝.dbf数据文
件(以及.dmp文
件)到
另一个地点,即目标数据库
可以是 cp(unix)或 cop
y(windows)或通过 ftp传输文
件(一定要在 bin方
式)
4.把本地
的表空间设置为读写
$
alter tablespace app_data read write;
$
alter tablespace app_index read write;
5.在目标
数据库附加该数据文件
(直接指定数据文件名)
(表空间不能
存在,必须建立相应用户名或者用 from
user/touser)
$
imp file=expdat.dmp userid=”””sys/password as sysdba””” trans
port_tablespace=y datafiles=(“c:\app_data.dbf,c:\app_index.dbf”) tables
paces=app_data,app_index tts_owners=hr,oe
6.设置目
标数据库表空间为读写
$
alter tablespace app_data read write;
$
alter tablespace app_index read write;
1.3 优化
1
.
加快
e
x
p
速度
加大 large_pool_s
ize,可以
提高
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
.
通过
u
ni
x
/Linux PIPE
管
道加快
e
x
p
/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
m
kfifo exp.pipe
chm
od 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.
使业
务用户的触发器失效/删除主键和唯一
索引
s
pool drop_pk_u.sql
s
elect 'alter table '||table_name||' drop constraint '||constraint_name||';'
from
user_constraints
where
constraint_type in ('P','U');
/
s
pool off
s
pool disable_trigger.sql
s
elect 'alter trigger '||trigger_name||' disable;'
from
user_triggers;
/
s
pool off
@
d
r
op
_p
k
_
u
.s
ql
@
di
s
a
b
l
e
_
t
r
i
g
g
e
r
.s
ql
3.
以 ignore=y全库导入
$
imp system/manager file=exp.dmp log=imp.log full=y ignore=y
4.
通过 toad或
其他工具提取源数据库创建主键和索引的脚本,在目标
数据库中创建主键
和
索引。使触发器生效。
1.4 常见问题
1
.
字符集问题
ORACLE
多
国语言设置是为了支持世界范围的语言与字符集,一般
对语言提示, 货币
形式,排序方
式和
CHAR,VARCHAR2,C LOB,LONG 字
段的数据的显示等有效。 ORACLE
的
多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语 言
设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据
(如
文本)时候的编码规则。
ORACLE 字符集
设定,分为数据库字符集和客户端字符集环境设置。在数据库端,
字
符集在创建数据库的时候设定,并保存在数据库 props
$表中。
在客
户端的字符集环境比较简单,主要就
是环境变量或注册表项
NLS_ LANG,注 意 NLS_LANG的优先
级别为:参数文件册表变量 session。
如果客户端 字
符集和服务器端字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示 与
导出/导
入的与字符集有关的数据将都是乱码。
使用
一点点技巧,就可以使导出/导
入在不同的字符集的数据库上转换数据。这里
需
要一个 2进
制文件编辑工具即可,如 uedit32。用
编辑方式打开导出的 dmp文件,
获
取
2 、 3
字节 的 内容 , 如
00 01 , 先 把 它 转换 为
10 进 制 数, 为
1 ,使用 函 数
NLS_CHARSE
T_NAME 即
可获得该字符集: SQL> s
elect nls_charset_name(1) from dual; NLS_CHARSET_NAME(1)
------------------- US7ASCII
可以
知道该 dmp文
件的字符集为 US7ASCII,如果
需要把该 dmp文件
的字符集换
成 Z
HS16GBK,则
需要用 NLS_CHARSET
_ID 获取
该字符集的编号:
SQL> select nls_charset_id('zhs16gbk') from dual; NLS_CHARSET_ID('ZHS16GBK')
--------------------------
把 852换成 16进制数,为 354,把 2、3字节的 00
01 换成 03
54,
即完成了把该 dmp文件
字符集从 us
7ascii 到 zhs
16gbk 的
转化,这样,再把该 dmp文
件导入到 zhs
16gbk 字
符集的数据库就可以了。
2
.
版本问题
E
xp/Imp 很
多时候,可以跨版本使用,如在版本 7与版本 8之间导
出导入数据,但 这
样做必须选择正确的版本,规则为:
·总是
使用 IMP的
版本匹配数据库的版本,如果要导入到 816,则
使用 816的导
入工 具。
·总是
使用 E
XP 的版本匹
配两个数据库中低的那个版本,如在 815与 816之间互
导,则使用 815的 E
XP 工具。
imp和 exp版
本不能往上兼容:
imp 可
以导入低版本 exp生成
的文件,
不能导
入高版本 exp生成的
文件。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14766526/viewspace-567177/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14766526/viewspace-567177/