在工作中经常需要对oracle数据库进行备份、异地恢复的情况。
Oracle的常规备份无非是exp/imp,expdp/impdp,rman三种方式。
- exp/imp简单方便,适用于跨db版本、跨os平台、异地备份等情况,是大家最常用的一种备份方式。
- expdp/impdp是10g以后推出的备份方式,其特点就是效率的大幅改善,据eygle报告,impdp相比与传统imp有20倍速度提升,其最大的缺点是不能跨数据库版本,连小版本号也不行(例如11.1到11.2)。
- rman相比前两种备份方式,相对配置复杂,一般是DBA作为前两种方案的备份。
先看看exp/imp的用法:
1.基本的exp写法
- exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log
- user: oracle用户名
- passwd:数据库用户密码
- infodb81: 数据库的连接字符串
- file:备份后的文件名
- log: 备份日志文件
2.exp的参数
参数一:buffer
- exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log buffer=4096000000
- 注意:buffer的单位是bytes,例如要设置1M,则是1024000,上面的例子设置的是400M。
- 根据我们测试的结果,加入buffer参数后,约有40%的性能提升。
经过反复验证:合理的buffer值是10240000-1024000之间,再大了反而效率更低。
环境:aix 6.1 16c 32G,sga信息如下
SQL> show sga
Total System Global Area 2.0043E+10 bytes
Fixed Size 2153336 bytes
Variable Size 1.3690E+10 bytes
Database Buffers 6174015488 bytes
Redo Buffers 176394240 bytes
- 性能对比:
- 加入buffer参数前(数据约9G,共31分钟)
- ========== 备份用户sinosybak 11-02-21 02:08:16 ====================
- ========== 备份用户shyang 11-02-21 02:35:49 ====================
- 加入Buffer参数后(约18分钟)
- ========== 备份用户sinosybak 11-02-28 02:25:04 ====================
- ========== 备份用户shyang 11-02-28 02:43:52 ====================
参数二:direct
- exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log direct=y recordlength=65536
- direct : 直接导出,数据从磁盘读入到高速缓存,直接写入到最终文件,所以没有数据行检查与匹配的过程。据不权威的评测结果,性能有50%到70%的提升。
同样的环境,实测结果,有70%的性能提升
约70G数据,普通exp模式,未加buffer,约2小时40分
========== 备份用户sinosy 11-02-22 22:30:00 ====================
========== 开始传输sinosy 11-02-23 01:10:39 ====================
exp buffer=102400000,约2小时
========== 备份用户sinosy 11-02-28 22:30:01 ====================
========== 开始传输sinosy 11-03-01 00:39:58 ====================
exp direct模式,约1个小时 - ========== 备份用户sinosy 11-03-01 22:30:00 ====================
========== 开始传输sinosy 11-03-01 23:05:43 ====================
- 注意:
- 1.recordlength参数(IO缓冲大小),与direct参数配对使用,默认该参数为1024bytes,上面的例子为64K(最大值也为64K)。
- 2.使用direct后,buffer参数失效;
- 3.使用direct,不支持query子句(没有行匹配的过程),不支持带Blob类型字段的表,但是系统会自动判断、自动切换,也就是说不会因为一张表的问题,导致整个schema不能使用direct备份;
- 4.direct不支持表空间导出。
参数三:consistent
- exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log consistent=y
- consistent : 交叉一致性,用在序列值小于表中最大值的情况。
- 例如:exp默认情况下,先导出序列,后导出表,如果序列导出之后,表又使用序列插入了新的数据,就会导致数据不一致。
其他参数:
- USERID 用户名/口令
- FULL 导出整个文件 (N) BUFFER 数据缓冲区的大小
- OWNER 所有者用户名列表
- FILE 输出文件 (EXPDAT.DMP)
- TABLES 表名列表
- COMPRESS 导入一个范围 (Y)
- RECORDLENGTH IO 记录的长度
- GRANTS 导出权限 (Y)
- INCTYPE 增量导出类型
- INDEXES 导出索引 (Y)
- RECORD 跟踪增量导出 (Y)
- ROWS 导出数据行 (Y)
- PARFILE 参数文件名
- CONSTRAINTS 导出限制 (Y)
- CONSISTENT 交叉表一致性
- LOG 屏幕输出的日志文件
- STATISTICS 分析对象 (ESTIMATE)
- DIRECT 直接路径 (N)
- TRIGGERS 导出触发器 (Y)
- FEEDBACK 显示每 x 行 (0) 的进度
- FILESIZE 各转储文件的最大尺寸
- QUERY 选定导出表子集的子句
- 下列关键字仅用于可传输的表空间
- TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
- TABLESPACES 将传输的表空间列表