1. 什么是import/export? 我们为什么需要它?
oracle的import(imp)和export(exp)功能用来执行oracle数据库的逻辑备份与恢复. 导出的时候, 数据库对象被存储在一个二进制文件中, 并且能够被导入到另外一个oracle数据库中. 这个功能能够用来在不同的机器, 数据库, schema之间转移数据, 但是因为是二进制文件, 所以不能用在非oracle的数据库上面.
imp & exp 通常被用来执行以下任务:
1) 备份与恢复 (仅针对小型数据库 < 50G, 更大的, 则使用RMAN)
2) 在不同平台的oracle数据库之间转移数据
3) 重组数据, 消除数据碎片 (export, drop, re-import)
4) 从古老的oracle版本升级数据库
5) 检测数据库崩溃 (保证数据可读)
6) 在数据库之间转移tablespace
从oralce 10g开始, 用户可以选择使用新的数据泵功能(expdp & impdp)
2. 怎样使用import/export功能
在$ORACLE_HOME/bin目录下找到相应的可执行文件. 它们可以被交互运行, 使用命令行参数或者参数文件, 相应的参数可以使用exp help=yes(imp help=yes)
下面是几个使用exp/imp的例子:
exp scott/tiger file=emp.dmp log=emp.log tables=emp rows=yes indexes=no
exp scott/tiger file=emp.dmp tables=(emp,dept)
imp scott/tiger file=emp.dmp full=yes
imp scott/tiger file=emp.dmp fromuser=scott touser=scott tables=dept
使用参数文件
exp userid=scott/tiger@orcl parfile=export.txt
export.txt :
BUFFER=100000
FILE=account.dmp
FULL=n
OWNER=scott
GRANTS=y
COMPRESS=y
还可以使用OEM中的schema manager GUI工具.
3. 是否可以导出一个table的子集?
从oracle 8i开始, 就可以使用query = export来导出一个table的一部分数据, 你可能需要处理特殊字符的问题, 例如: query=\"where deptno=10\".
exp scott/tiger tables=emp query="where deptno=10"
exp scott/tiger file=abc.dmp tables=abc query=\"where sex=\'f\'\" rows=yes
4. 可以监控一个table导入的速度吗?
如果你需要监控一个正在执行的imp任务的执行速度, 有以下方法可供选择:
1)
select substr(sql_text,instr(sql_text,'INTO "'),30) table_name,
rows_processed,
round((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60,1) minutes,
trunc(rows_processed/((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60)) rows_per_min
from sys.v_$sqlarea
where sql_text like 'INSERT %INTO "%'
and command_type = 2
and open_versions > 0;
如果当前有多个table在导入, 这个语句不会显示正在被导入table的信息
2) 使用FEEDBACK = n参数, 这个参数会告诉imp在每导入N行以后显示一个度号.
5. 可以将table导入到一个不同的tablespace吗?
oracle没有提供参数来指定将数据导入到一个不同的tablespace, 默认情况下, 数据库对象需要在导出的tablespace中重建, 但是我们也可以使用以下方法来改变这一行为:
1) 在相应的tablespace种预先创建好table(s)
使用参数INDEXFILE=option
编辑indexfile, 移出注释, 指定正确的tablespace
在你的数据库中运行这个index文件, 这将会在相应的tablespace中创建需要的table
使用IGNORE=Y来导入文件
2) 改变user的default space
revoke user的"UNLIMITED TABLESPACE"权限
revoke user在导出tablespace上的磁盘限额, 这将强制imp功能在user默认
tablespace上创建相应的table
将相应的tablespace设为user的默认tablespace
导入文件
6. 在导入之前需要DROP/TRUNCATE对象吗?
如果在一个已经存在的table上导入数据, 我们需要truncate或者drop掉这个table, 以清除老的数据. 如果不这样做, 新的数据会附加在老的数据后面. 在导入之前, 必须drop已经存在的sequense, 否则会产生数据的冲突. 同样也建议将index drop掉以加快import速度, 在导入以后再重建index
7. 可以在不同版本之间导入导出数据吗?
oracle的import是向上兼容的, 也就是说, 老板本export产生的数据可以使用新版本的import来导入, 这在升级数据库的时候经常用到.
oracle同事还提供了一些catexpX.sql的脚本, 使用sys执行这些脚本可以使老板本的imp/exp运行在新版本的数据库上. 脚本位置$ORACLE_HOME/rdbms/admin/
8. 可以export到多个文件吗? 可以打破Unix下2G文件的限制吗?
从oracle8i开始, export功能就支持多个文件的导出, 这个功能使大的export能够被拆分为几个小的文件, 这样就不会超过操作系统的文件限制了(使用FILESIZE参数). 当导入这种导出为多文件的数据的时候, 必须使用使用FILE参数来提供使用同一个sequence的文件名.
示例:
exp SCOTT/TIGER FILE=D:F1.dmp,E:F2.dmp FILESIZE=10m LOG=scott.log
在oracle8i之前的版本, 可以通过gzip压缩文件来达到export大数据量文件的目的, 最大可以导出高10G的文件,这取决于数据的类型.
export:
# create a named pipe
mknod exp.pipe p
# read the pipe - output to zip file in the background
gzip < exp.pipe > scott.exp.gz &
# feed the pipe
exp userid=scott/tiger file=exp.pipe ...[/code]
import:
# create a name pipe
mknod imp_pipe p
# read the zip file and output to pipe
gunzip < exp_file.dmp.gz > imp_pipe &
# feed the pipe
imp system/pwd@sid file=imp_pipe log=imp_pipe.log ...
9. 怎样增进import/export的performance
export:
1) 将BUFFER参数设大(2M: 2000000)
2) 将RECORDLENGTH参数设大(64K: 64000)
3) 使用DIRECT=yes
4) 停止不必要的程序释放资源
5) 如果使用多个export session, 确保它们写的是不同的物理磁盘
6) 不要export到NFS文件系统
import:
1) 创建一个indexfile, 这样你可以在import数据以后创建index(import的时候指定
INDEXFILE参数), 这样你导入的时候不会导入人和数据, 仅仅创建index. 你必须预先编辑这个]
文件, 在connect语句中提供密码
2) 将需要导入的文件放置在与ORACLE数据不同的磁盘上
3) 增加DB_CACHE_SIZE(9i以前为DB_BLOCK_BUFFER)
4) 将LOG_BUFFER设到比较大的值, 重启oracle
5) 停止redo log archiving(ALTER DATABASE NOARCHIVELOG)
6) 创建一个拥有大回滚段的大table space. 将其他所有的回滚段offline(当然不包含SYSTEM的
回滚段), 回滚段最好与你最大的table一样大.
7) 使用COMMIT=N(如果你可以承受得起的话)
8) 使用ANALYZE=N
9) 别忘了run之前创建的index file.
10. IMP/EXP的普遍问题
ORA-00001: Unique constraint (...) violated
你在导入重复行,使用IGNORE=NO来跳过那些重复的table(如果object重复创建会报错)
ORA-01555: Snapshot too old
当你在导入数据的时候,通知你的user停止手头工作, 或者使用CONSISTENT=YES
ORA-01562: Failed to extend rollback segment
创建大的回滚段或者设置参数COMMIT=Y
IMP-00015: Statement failed ... object already exists...
使用IGNORE=Y来忽略这些错误, 但要小心产生重复的行
原文地址:
http://www.orafaq.com/wiki/Import_Export_FAQ