一. 分三种模式:
1.表模式,导出一张或多张table
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=\’…\’
备注:query参数配置经常遇到这样问题:LRM-00112: multiple values not allowed for parameter 'query'
原因:where条件中一般都会有空格, 而命令行下就会被释成几个命令行参数, 需要用单引号或双引号将整个where条件括起来, 另在linux下对于转义字符用\进行处理,在Windows下, 指定query参数:
exp system/123123@TEST FILE=(E:\1.DMP,E:\2.DMP) FILESIZE=10M TABLES=SYS.TEST query='where ID">"2000'
在linux下, 指定query参数:
exp ..... query=\"where col1 \< 1000\"
最好是写在一个参数文件里, 不拘于各种平台的区别
2.用户模式
exp system/123123@TEST FILE=(E:\1.DMP,E:\2.DMP) FILESIZE=10M WNER=(USER1,USER2) ROW=N
N表示不导数据,只导表结构,Y表示数据和结构全导3.全库模式
exp system/123123@TEST FILE=(E:\1.DMP,E:\2.DMP) FILESIZE=10M FULL=YES ROW=N
imp exp system/123123@TEST FILE=(E:\1.DMP,E:\2.DMP) FILESIZE=10M fromuser=dbUSER1 touser=dbUSER2
二.重点:用exp,imp进行表空间传输
1.限制:
源和目标数据库必须使用相同的字符集和国家字符集;
目标数据库不能已经包含同名的表空间;
传输表空间不支持:物化视图或复制、基于函数的索引、Scoped REFs和兼容性设置为8.0时,带有多个收件人的高级队列。
2.步骤:
2.1 检测表空间是否符合传输标准的方法:
SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
SQL > select * from sys.transport_set_violations;
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包含的表空间,如数
据表空间和索引表空间,可以一起传输。
2.2 设置表空间为只读(假定表空间名字为APP_Data 和APP_Index)
SQL > alter tablespace app_data read only;
SQL > alter tablespace app_index read only;
2.3 发出EXP 命令
SQL> host exp 'system/password as sysdba' transport_tablespace=y tablespaces=(app_data, app_index)
注意'system/password as sysdba'出的格式容易出问题,不同平台设置不一样 2.4 拷贝.dbf数据文件(以及.dmp 文件)到另一个地点,即目标数据库可以是cp(unix)或copy(windows)
或通过ftp 传输文件(一定要在bin方式)
2.5 在目标数据库附加该数据文件 (直接指定数据文件名)
(表空间不能存在,必须建立相应用户名或者用fromuser/touser)
imp file=expdat.dmp 'system/password as sysdba' transport_tablespace=y datafiles=
(c:\app_data.dbf,c:\app_index.dbf) tablespaces=app_data,app_index tts_owners=hr,oe
注:TABLESPACES:指定导入的表空间集合名称。这个参数可以不指定,如果指定则必须和导入的表空间名称一致。
TTS_OWNERS:指定导入的表空间集合中包含对象的用户名。这个参数可以不指定,如果指定则必须保证正确性。
FROMUSER和TOUSER:如果不指定这两个参数,则导入的时候会根据表空间集合中对象的原始用户名导入,如果
用户名在目标数据库不存在,则会报错。可以通过指定FROMUSER和TOUSER来改变对象的属主
2.6 设置目标数据库表空间为读写
alter tablespace app_data read write;
alter tablespace app_index read write;
三.exp,imp优化
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 的性能
四.常见问题
1,字符集问题
分客户端的字符集与数据库端字符集,客户端字符集主要就是环境变量或注册表项NLS_LANG,注
意NLS_LANG的优先级别为:参数文件如果客户端字符集和服
务器端字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示与导出/导入的与字符
集有关的数据将都是乱码。
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里
需要一个2 进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp 文件,获
取2、3 字节的内容,如00 01,先把它转换为10 进制数,为1,使用函数
NLS_CHARSET_NAME 即可获得该字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道该dmp 文件的字符集为US7ASCII,如果需要把该dmp 文件的字符集换
成ZHS16GBK,则需要用NLS_CHARSET_ID 获取该字符集的编号:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
把852 换成16 进制数,为354,把2、3 字节的00 01 换成03 54,即完成了把该
dmp 文件字符集从us7ascii 到zhs16gbk的转化,这样,再把该dmp 文件导入到zhs16gbk
字符集的数据库就可以了。
2.版本问题
总是使用IMP 的版本匹配数据库的版本,如果要导入到816,则使用816 的导入工具
exp高版本不能导出低版本数据库 总是使用EXP的版本匹配两个数据库中低的那个版本,如在815 与816之间互导,则使用815的EXP工具
imp 和exp 版本不能往上兼容: imp 可以导入低版本exp 生成的文件, 不能导入高版本exp 生成的文件
注:上述内容多参照网上多个作者内容,结合个人使用过程遇到的问题进行备注说明。各示例无前后一致关系。