《Oracle数据库 ExpImp工具性能调优》由会员分享,可在线阅读,更多相关《Oracle数据库 ExpImp工具性能调优(12页珍藏版)》请在金锄头文库上搜索。
1、OracleOracle 数据库数据库 Exp/ImpExp/Imp 工具性能调优工具性能调优一、一、ExpExp 调优调优1.使用 DIRECT 和 RECORDLENGTH 选项DIRECT 参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N)。常规路径导出使用 SQL SELECT 语句从表中抽取数据,直接路径导出则是将数据直接从磁盘读到 PGA 再原样写入导出文件,从而避免了 SQL 命令处理层的数据转换过程,大大提高了导出效率。在数据量大的情况下,直接路径导出的效率优势更为明显,可比常规方法速度提高三倍之多。和 DIRECT=Y 配合使用的是 R
2、ECORDLENGTH 参数,它定义了 Export I/O 缓冲的大小,作用类似于常规路径导出使用的 BUFFER 参数。建议设置 RECORDLENGTH 参数为最大 I/O 缓冲,即65535(64kb)。其用法如下:exp userid=system/manager full=y direct=y recordlength=65535 file=exp_full.dmp log=exp_full.log直接路径导出根据 Oracle 版本不同,有一些使用限制。比较重要的限制有,8i 及以下版本不支持导出客户端和数据库的字符集转换,因此导出前必须保证 NLS_LANG 设置正确;8.1.
3、5及以下版本不支持导出含 LOBs 对象的表;不能使用 QUERY 参数等。2.使用管道技术管道是从一个程序进程向另一个程序进程单向传送信息的技术。通常,管道把一个进程的输出传给另一进程作为输入。如果导出的数据量很大,可以利用管道直接生成最终的压缩文件,所耗费的时间和不压缩直接导出的时间相当。这样一来,不仅能够解决磁盘空间不足的问题,而且省去了单独压缩文件的时间;如果需要传输导出文件,还可以减少网络传输的时间。比如,一个 10G 的文件单独压缩可能需要半小时以上的时间。虽然管道技术不能够直接缩短 Exp/Imp 本身的时间,但节省出来的压缩时间非常可观。管道和 Exp 结合的具体使用方法如下:
4、导出数据示例:% mknod /tmp/exp_pipe p # Make the pipe% compress export.dmp.Z 如果返回值出现 none 或 shared,说明启用了 MTS。二、查看二、查看 OracleOracle 表空间大小及利用率的表空间大小及利用率的 SQLSQL 语句非常实用的语句语句非常实用的语句set linesize 300col 表空间名 for a30SELECT UPPER(F.TABLESPACE_NAME) “表空间名“,D.TOT_GROOTTE_MB “表空间大小(M)“,D.TOT_GROOTTE_MB - F.TOTAL_BYTE
5、S “已使用空间(M)“,TO_CHAR(ROUND(D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),990.99) “使用比“,F.TOTAL_BYTES “空闲空间(M)“,F.MAX_BYTES “最大块(M)“FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP
6、BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY 4 DESC;三、三、XXXX 网网 OracleOracle 数据库数据库 SYSTEMSYSTEM 表空间文件坏块的解决办法表空间文件坏块的解决办法故障现象:NetBacku
7、p 备份出错,日志如下:RMAN-00571: =RMAN-00569: = ERROR MESSAGE STACK FOLLOWS =RMAN-00571: =RMAN-03009: failure of backup command on ch01 channel at 06/15/2005 02:28:44ORA-19566: 超出损坏块限制 0 (文件 /u01/app/oradata/unicom/system01.dbf)故障分析:由于事前发生过别的表空间(cookdbs:/u01/app/oradata/unicom/cokdbs.dbf)也有坏块的情况,根据李智他们的建议,使用
8、迁移数据后删除表空间的办法解决(仅适用于普通表空间)。这是查询该表空间上的表和索引对象的一个脚本:GXdb% more query.sqlconn /as sysdbacol owner for a25col segment_name for a40spool table.logselect distinct OWNER,SEGMENT_NAME from dba_extentswhere TABLESPACE_NAME=COOKDBand SEGMENT_TYPE=TABLE;spool offspool index.logselect distinct OWNER,SEGMENT_NAME
9、 from dba_extentswhere TABLESPACE_NAME=COOKDBand SEGMENT_TYPE=INDEX;spool offexit查询完毕后,使用一个迁移的脚本迁移到新的表空间:GXdb% more move.sh#!/bin/kshsqlplus /nolog query.sqlNEWTBS=“cookdbs1“echo “conn /as sysdba“ move.sqlfor TNAME in cat table.log | awk /COOKDB/ print $2 do echo “alter table cookdb.$TNAME move tabl
10、espace $NEWTBS;“ move.sqldonefor INAME in cat index.log | awk /COOKDB/ print $2 do echo “ALTER INDEX cookdb.$INAME REBUILD TABLESPACE $NEWTBS;“ move.sqldoneecho “exit“ move.sqlsqlplus /nolog move.sql本次经过检查,发现包括有 System 在内的四个表空间的四个数据文件有坏块。为了能使用 NetBackup 备份,对 NetBackup 脚本做以下修改(对相应的数据文件设置 maxcorrupt):
11、run allocate channel ch00 type sbt_tape;set maxcorrupt for datafile 1,27,28,44 to 10;backup 。release channel ch00;如果有归档日志没有丢失,都备份过,可以使用 rman 的 blockrecover 来修复文件的坏块,例如:run allocate channel ch00 type sbt_tape;blockrecover datafile 27 block 302089,302090,332823,332824,332825,332826;blockrecover datafi
12、le 28 block 340846,340847,340848,340849;blockrecover datafile 44 block 380381,380382,380383,380384,380405,380406,380407,380408;blockrecover datafile 1 block 1703064,1703065,1703066,1703067,1703088,1703089,1703090,1703091;release channel ch00;但是中间由于备份失败,本地维护删除过归档日志,此方法不适用。本次由于有 SYSTEM 表空间,不同于普通用户表空间,
13、它有自己的特殊性。所以有些问题的解决方法也不尽相同。经多方探讨协商(Oracle India engineer、项目经理、本地维护、开发部门和系统工程部经理),总结了以下处理办法:解决 SYSTEM 表空间文件坏块的方法是导出全库数据,删除数据库,重建数据库,导入全库数据。具体的操纵步骤,经过讨论,见如下:主要是考虑到优化可以在线进行,也需要在线进行,还考虑到优化的万一出错性,既便出错至少还可以恢复到原始状态,如果优化没有成功,再做导出导入也不能恢复到初始状态。所以就先做导出导入工作再做优化处理。步骤是:1. 导出整个数据库(数据库在线),参考命令:exp system/manager fil
14、e=/oraclebak/unicomdbfull.dmpfull=Y log=/oraclebak/unicomfull.log2. 备份配置文件 cp $ORACLE_HOME/dbs/* /Oraclebak,记录数据库名及实例名,参考字典视图V$DATABASE,V$INSTANCE;3. 删除数据库 DBCA(/u02/app/oracle/product/9.2.0.1/bin/dbca)图形化配置工具。注意:建议不要删除数据文件、重做日志文件和控制文件以及归档日志文件,处理方法是:a.就数据文件、重做日志文件和控制文件分别改名为 xxx.bak.xxx 文件,例如 mv data
15、file001.dbf datafile001.bak.dbf ;b.就归档日志文件,只改名归档日志文件所在的目录名即可,例如 mv archivedir archivedirbak。要参考的数据字典视图有 V$DATAFILE、V$LOGFILE、V$CONTROLFILE 和 archive log list 参数。4. 重建数据库 DBCA(/u02/app/oracle/product/9.2.0.1/bin/dbca)图形化配置工具;5. 导入整个数据库,imp system/unicomunicom full=y ignore=y file=xxx.dmp log=yyy.log;
16、6. 启动数据库,严格测试dbv file= /u02/app/oracle/oradata/unicom/system01.dbf blocksize=8192检查还有没有坏块;7. 使用 3.2SQL 脚本检查表空间情况。四、一个使用四、一个使用 OracleOracle 归档日志恢复数据库的案例归档日志恢复数据库的案例案例环境:XX 网 Oracle 816 数据库需求描述:备份主机(装有 oracle)上备份了 7 月 13 日的数据,但是主数据库服务器当前日期是 7 月 15 日。为了把备份主机上的库跟主数据库服务器同步,使用归档日志把 7 月 13 日的库前滚到 7 月 15 日。处