不经意间我们又来到了文章的学习,在众多学习中,我们的文章也许不起眼,但是想必大家都有很多问题吧,所以重要的下面我们就来讲解一下,大家一定要认真看奥!!
一、解决Oracle 9.2.0.6版本数据库由于ORA-07445宕机问题
故障现象:
XX网数据库宕机,查看日志发现以下内容:
Wed Jun 8 20:24:17 2005 Errors in file /u02/app/oracle/admin/unicom/udump/unicom_ora_661.trc: ORA-07445: \\\\263\\\\366\\\\317\\\\326\\\\322\\\\354\\\\263\\\\243: \\\\272\\\\313\\\\320\\\\304\\\\327\\\\252\\\\264\\\\242 [00000 |
解决办法:
Oracle工程师建议安装Oracle补丁p3949307_9206_SOLARIS64,经过测试,安装步骤如下(注意,首先shutdown数据库):
1.解压补丁文件:
unzip p3949307_9206_SOLARIS64.zip
解开后的目录是:4060756 。
2.修改oraclehomeproperties.xml文件,该文件在$ORACLE_HOME/inventory/ContentsXML目录下:
cp oraclehomeproperties.xml oraclehomeproperties.xmlb.bak
vi oraclehomeproperties.xml
更改数字453 ->23,存盘退出。
3.修改PATH路径为:
PATH=$ORACLE_HOME/bin:/usr/ccs/bin:${PATH}
4.执行opatch apply命令:
cd 4060756
$ORACLE_HOME/OPatch/opatch apply
5.安装成功后会出现如下结果:
Updating inventory... /oracle92/app/oracle/product/9.2.0.1/OPatch/opatch.pl version: 1.0.0.0.51 Copyright (c) 2001-2004 Oracle Corporation. All Rights Reserved. OPatch succeeded. |
二、查看Oracle表空间大小及利用率的SQL语句-非常实用的语句
set linesize 300 col 表空间名 for a30 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(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_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 4 DESC; |
三、XX网Oracle数据库SYSTEM表空间文件坏块的解决办法
故障现象:
NetBackup备份出错,日志如下:
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:44 ORA-19566: 超出损坏块限制 0 (文件 /u01/app/oradata/unicom/system01.dbf) |
故障分析:
由于事前发生过别的表空间(cookdbs:/u01/app/oradata/unicom/cokdbs.dbf)也有坏块的情况,根据李智他们的建议,使用迁移数据后删除表空间的办法解决(仅适用于普通表空间)。
这是查询该表空间上的表和索引对象的一个脚本:
GXdb% more query.sql conn /as sysdba col owner for a25 col segment_name for a40 spool table.log select distinct OWNER,SEGMENT_NAME from dba_extents where TABLESPACE_NAME='COOKDB' and SEGMENT_TYPE='TABLE'; spool off spool index.log select distinct OWNER,SEGMENT_NAME from dba_extents where TABLESPACE_NAME='COOKDB' and SEGMENT_TYPE='INDEX'; spool off exit |
查询完毕后,使用一个迁移的脚本迁移到新的表空间:
GXdb% more move.sh #!/bin/ksh sqlplus /nolog @query.sql NEWTBS="cookdbs1" echo "conn /as sysdba" > move.sql for TNAME in `cat table.log | awk ' /^COOKDB/ {print $2} '` do echo "alter table cookdb.$TNAME move tablespace $NEWTBS;" >>move.sql done for INAME in `cat index.log | awk ' /^COOKDB/ {print $2} '` do echo "ALTER INDEX cookdb.$INAME REBUILD TABLESPACE $NEWTBS;" >>move.sql done echo "exit" >>move.sql sqlplus /nolog @move.sql |
本次经过检查,发现包括有System在内的四个表空间的四个数据文件有坏块。为了能使用NetBackup备份,对NetBackup脚本做以下修改(对相应的数据文件设置maxcorrupt):
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 datafile 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表空间,不同于普通用户表空间,它有自己的特殊性。所以有些问题的解决方法也不尽相同。经多方探讨协商(Oracle India engineer、项目经理、本地维护、开发部门和系统工程部经理),总结了以下处理办法:
解决SYSTEM表空间文件坏块的方法是导出全库数据,删除数据库,重建数据库,导入全库数据。具体的操纵步骤,经过讨论,见如下:主要是考虑到优化可以在线进行,也需要在线进行,还考虑到优化的万一出错性,既便出错至少还可以恢复到原始状态,如果优化没有成功,再做导出导入也不能恢复到初始状态。所以就先做导出导入工作再做优化处理。
步骤是:
1. 导出整个数据库(数据库在线),参考命令:
exp system/manager file=/oraclebak/unicomdbfull.dmpfull=Y log=/oraclebak/unicomfull.log
2. 备份配置文件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 datafile001.dbf datafile001.bak.dbf ;
b.就归档日志文件,只改名归档日志文件所在的目录名即可,例如mv arcarchivedirbak。要参考的数据字典视图有V$DATAFILE、V$LOGFILE、V$CONTROLFILE和archive log list 参数。
4. 重建数据库DBCA(/u02/app/oracle/product/9.2.0.1/bin/dbca)图形化配置工具;
5. 导入整个数据库,imp system/unicom@unicom full=y ignore=y file=xxx.dmp log=yyy.log;
6. 启动数据库,严格测试
dbv file= /u02/app/oracle/oradata/unicom/system01.dbf blocksize=8192
检查还有没有坏块;
7. 使用3.2SQL脚本检查表空间情况。
四、一个使用Oracle归档日志恢复数据库的案例
案例环境:XX网Oracle 816数据库
需求描述:
备份主机(装有oracle)上备份了7月13日的数据,但是主数据库服务器当前日期是7月15日。为了把备份主机上的库跟主数据库服务器同步,使用归档日志把7月13日的库前滚到7月15日。
处理步骤:
1.备份备份主机上的控制文件,然后把主用数据库的最新控制文件备份并拷贝到备份主机相应目录;
备份控制文件的方法:
sqlplus /nolog<<EOF connect internal alter database backup controlfile to '${BACKUP_DIR}/controlfile.bkp'; alter database backup controlfile to trace; EOF |
2.拷贝主库的归档日志到备份数据库的归档日志目录(这个前滚操作需要从13号到15号的归档日志完整,若备份数据库的归档日志目录不知道,可以从参数文件中看;
3.启动数据库到mount状态,使用recover database前滚数据库;
SQL> startup restrict mount pfile="${ORACLE_BASE}/admin/sdh21/pfile/init${service_names}.ora" SQL> recover database using backup controlfile; |
选择AUTO模式
4.如果到了最后一个日志它还需要前滚,此时可以在主库上把当前redolog切换,然后把产生的归档继续拷贝到备份主机,继续前滚;
5.前滚完成之后,它可能还继续要求下一个归档日志,此时可以CANCEL;
6.使用reselogs选项打开数据库。
SQL> alter database open resetlogs; |
(注意:如果打开时报错可能是还需要把日志继续前滚,可重复使用recover database命令)
五、Oracle 补丁p3948480_9206_SOLARIS64.zip的安装步骤
升级说明:
是从Oracle 9.2.0.1.0升级到9.2.0.6.0,解决一系列bug问题。
安装步骤:
1.解压文件包
%unzip p3948480_9206_SOLARIS64.zip %cd Disk1 |
2.停掉数据库
sql>shutdown immediate |
3.启动安装程序
%./runInstaller |
4.执行catpatch.sql脚本
%sqlplus /nolog SQL>conn / as sysdba SQL> SPOOL patch.log SQL> startup migrate; SQL>@?/rdbms/admin/catpatch.sql //执行catpatch.sql脚本 SQL> SPOOL OFF |
5.执行utlrp.sql脚本
SQL> shutdown SQL>startup SQL>@?/rdbms/admin/utlrp.sql //执行utlrp.sql脚本 |
6.验证
select comp_name,version from dba_registry; |
注意事项:
若不是在本地安装,指定X应用程序的所在主机。
◆Bourne, Bash, or Korn shell:
◆$ DISPLAY=local_host:0.0 ; export DISPLAY
◆C shell:
◆% setenv DISPLAY local_host:0.0
六、在VM维护的裸设备上添加表空间的过程
1.创建裸设备,大小是2G
Oracle WDP 全称为Oracle Workforce Development Program,是Oracle (甲骨文)公司专门面向学生、个人、在职人员等群体开设的职业发展力课程。在成熟的资本市场,市值是衡量一家企业规模、利润及增长状况等综合竞争力的动态结果。根据金融时报1月公布的2010年末全球市值500强的数据,苹果首次夺得了全球IT业市值的年终榜首。能够进入市值十强的公司,都是令人尊敬的IT顶尖企业,以市值顺序排列,这十家企业是苹果、微软、IBM、甲骨文、谷歌、三星电子、英特尔、思科、惠普和亚马逊。
Oracle的技术广泛应用于各行各业,其中电信、电力、金融、政府及大量制造业都需要Oracle技术人才,Oracle公司针对职业教育市场在全球推广的项目,其以低廉的成本给这部分人群提供Oracle技术培训,经过系统化的实训,让这部分人群能够迅速掌握Oracle最新的核心技术,并能胜任企业大型数据库管理、维护、开发工作。
#/usr/sbin/vxassist -g datadg make vol183 2G |
2.修改指定裸设备的权限
#vxedit -g datadg set user=oracle group=oinstall mode=600 vol182 |
3.创建连接
#ln -s /dev/vx/rdsk/datadg/vol182 pre_ln2_182.dbf |
4.添加到指定的表空间,例如UNDOTBS1
SQL> alter tablespace UNDOTBS1 2 add datafile '/usr5/linkdata/pre/pre_ln2_182.dbf' size 2000M; |
七、在SUN DiskSuit维护的裸设备上添加表空间的过程
1.创建裸设备
metainit -s cqcdg d6049 -p /dev/did/rdsk/d4s0 2g |
2.创建连接文件
ln -s /dev/md/cqcdg/rdsk/d6049 pre_ln2_63.dbf |
3.修改权限
chown oracle:dba pre_ln2_63.dbf |
4.添加表空间
alter tablespace PERFDBS add datafile '/usr5/linkdata/pre/pre_ln2_63.dbf' SIZE 2000M; |
八、在Oracle数据库中从文件系统迁移到裸设备的处理过程
故障现象:
C网数据库/文件系统空间使用率突然达到99%,检查发现原来是因为本地维护给数据库添加了数据文件,但是该数据文件添加到文件系统上导致根文件系统使用率突然增大。
将文件系统上的数据文件迁移到裸设备,裸设备在文件系统上只存在一个链接,几乎不占空间。
处理步骤:
1.检查发现C网已没有已建好的可用裸设备,有一个建好的30G的裸设备没有使用,首先需要添加适合适用的裸设备。
2.删除这个没有使用的30G的soft partition
metaclear -s cqcdg -r d6042 |
3.在删除的空间上建立一个2G的裸设备
metainit -s cqcdg d6044 -p /dev/did/rdsk/d4s0 2g: |
4.在文件系统上建立到裸设备的链接
ln -s /dev/md/cqcdg/rdsk/d6044 pre_ln2_57.dbf |
5.更改链接文件的所有者
chown oracle:dba pre_ln2_57.dbf |
6.以sysdba身份登录并关闭数据库
sqlplus “/as sysdba” SQL>shutdown immediate |
7.将文件系统文件上的数据导到裸设备文件上
dd if=/usr5/linkdata/sys/pre_ln2_61.dbf of=/usr5/linkdata/pre/pre_ln2_57. dbf bs=134217728 |
if 文件系统文件名
of 新建裸设备链接名
bs dd时的blocksize,单位为byte,如果不设此项,dd的速度非常慢
8.动数据库到mount状态
SQL>startup mount |
9.改数据文件名
SQL>ALTER DATABASE RENAME FILE '/usr5/linkdata/sys/pre_ln2_61.dbf' TO '/usr5/lin |
10.开数据库
SQL>alter database open; |
11.证更改
九、解决在Oracle Open状态下shutdown immediate不能关闭数据库问题
故障现象:
XX网数据库使用shutdown immediate不能关闭,日志中不断输出以下内容:
Shutting down instance: further logons disabled Shutting down instance (immediate) License high water mark = 215 All dispatchers and shared servers shutdown Fri Aug 12 21:52:34 2005 ALTER DATABASE CLOSE NORMAL Fri Aug 12 21:52:38 2005 Thread 1 advanced to log sequence 69953 Current log# 2 seq# 69953 mem# 0: /ora_sys/cqgdb/redo02.log Thread 1 advanced to log sequence 69954 Current log# 4 seq# 69954 mem# 0: /ora_sys/cqgdb/redo04.log ... ... .. Current log# 3 seq# 69966 mem# 0: /ora_sys/cqgdb/redo03.log Thread 1 advanced to log sequence 69967 Current log# 1 seq# 69967 mem# 0: /ora_sys/cqgdb/redo01.log |
解决办法:
Oracle工程师首先怀疑是临时表空间空间不足导致,经检查临时表空间没有空间不足的情况,仔细观察日志发现重做日志文件不断切换,分析应该是有较多的事务没有完成提交或者有较多没有提交的事务完成回滚。现在面临的问题是我们没有很多时间去等待所有的事务去完成回滚或提交。解决问题的思路就是如何尽快结束这些事务的回滚或提交。
1.查看spfile文件中是否有fast_start_parallel_rollback参数的设置,检查结果G网数据库没有设置该参数。如果没有显式设置,则该参数的默认值为low。修改该参数值为false;
2.将数据库启动到nomount状态:startup nomount;
3.修改改参数值:alter system set fast_start_parallel_rollback = FALSE scope=spfile;
4.shutdown immediate关闭数据库;
5.startup启动;
6.查看该参数是否生效:show parameter fast_start_parallel_rollback;
7.等待一段时间;
8.shutdown immediate数据库可以关闭。
分析:FAST_START_PARALLEL_ROLLBACK是用来控制事务并行回滚最大进程数的参数。该参数有三个可设值,low,high,false。当设置为false时并行回滚被禁止,由于禁止了并行回滚,在数据库关闭时,需要回滚的事务将被取消。
十、数据库服务器字符集更改步骤
问题描述:
在客户端插入字符“**”,从数据库中查询显示时出现乱码。
处理步骤:
1.据库做全库导出,备份全库数据,以防故障发生
首先设定客户端的字符集,必须以ZHS16GBK的字符集导出,然后才能在更改失败后顺利倒入新建的库。
#setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"; #stty -istrip -parity cs8; #setenv LANG zh |
拟在/sybdata(磁盘阵列)下建立一个目录orabak,用于存放dmp文件。
#mkdir /sybdata/orabak #chown oracle:oinstall /sybdata/orabak #su – oracle #cd /sybdata/orabak %exp system/manager@hnsdh file=hnsdh_2005-8-17 log=hnsdh_exp_2005-8-17 full=y |
(此处命名为示例,以实施当日日期为准)
察看日志结尾,以判定导出是否成功。
#cat hnsdh_2005-8-17.dmp | od -x | head |
看第二和第三个字节组成的十六进制数是多少可判断导出文件的字符集。
示例如下:
#cat example.dmp | od -x | head 0000000 0303 5445 5850 4f52 543a 5630 392e 3032 。。。 0000220 646d 7000 0000 0000 0000 0000 0000 0000 |
十六进制的0354化为十进制为852,参造下表:
NLS_CHARSET_ID NLS_CHARSET_NAME HEX_ID -------------- ------------------------------ ------------- 1 US7ASCII 1 2 WE8DEC 2 3 WE8HP 3 4 US8PC437 4 5 WE8EBCDIC37 5 6 WE8EBCDIC500 6 7 WE8EBCDIC1140 7 8 WE8EBCDIC285 8 ................... 850 ZHS16CGB231280 352 851 ZHS16MACCGB231280 353 852 ZHS16GBK 354 853 ZHS16DBCS 355 860 ZHT32EUC 35c 861 ZHT32SOPS 35d 862 ZHT16DBT 35e 863 ZHT32TRIS 35f 864 ZHT16DBCS 360 865 ZHT16BIG5 361 866 ZHT16CCDC 362 867 ZHT16MSWIN950 363 868 ZHT16HKSCS 364 870 AL24UTFFSS 366 871 UTF8 367 872 UTFE 368 |
即可得出这个dmp文件的字符集为ZHS16GBK。
2.据库中直接更改字符集参数
操作步骤如下:
SQL> shutdown immediate SQL> startup mount SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; SQL> ALTER DATABASE OPEN; SQL> alter session set events '10046 trace name context forever,level 12'; SQL> alter database character set INTERNAL_USE ZHS16GBK; SQL> shutdown immediate SQL> startup |
察看系统字符集
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS; |
看NLS_CHARACTERSET的值为多少,如果为ZHS16GBK则说明改动成功。
如果执行正常,则按照下一节进行测试操作。
3.成功后的测试
测试1,在数据库服务器端下测试
%setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"; %stty -istrip -parity cs8; %setenv LANG zh %sqlplus /nolog SQL>conn / as sysdba SQL>create table test_tq (a char(20)); SQL>insert into test_tq 1>(a) 2>values ('洣洣'); SQL>select * from test_tq; |
如显示为
A -------------------- 洣洣 |
则成功。
测试2,客户端环境下测试
运行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 ORACLE, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集(本例为:AMERICAN_AMERICAN.US7ASCII)。
右击我的电脑,然后点击属性,“高级”页面下,点击“环境变量”,在系统变量中添加:
变量名:NLS_LANG
变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
运行cmd,输入echo %NLS_LANG%,查看系统变量设置时否成功
然后运行:
$sqlplus system/manager@hnsdh SQL〉conn / as sysdba SQL〉create table test_tq (a char(20)); SQL〉insert into test_tq 1>(a) 2>values ('洣洣'); SQL〉select * from test_tq; |
如显示为
A -------------------- 洣洣 |
则成功。
4.不成功时的措施
新建数据库,设定字符集为ZHS16GBK,其他参数先照搬原来的,并倒入数据。建库时所需的具体参数在重建之前要搜集。注意在配置控制文件时设定最文件数。
建好数据库以后,执行以下命令即可恢复数据库:
%cd /sybdata/orabak %imp system/manager@hnsdh full=y ignore=y file=hnsdh_2005-8-17 log=hnsdh_imp_2005 -8-17 |
十一、Oracle数据库归档目录usr5满的解决办法
故障现象:
C网数据库的逻辑日志增长很快,有时候每分钟就产生150M的日志文件,导致归档目录不到一天的时间就满了。我们的备份策略是每天的晚上0点执行,也就是说还没来得及备份归档目录就满了。
导致的结果:
数据库挂起不能工作
问题分析及解决办法:
解决办法有3种:
1.增加归档目录的空间
2.增加备份频度
3.删除归档日志文件
每一种办法都会存在一些问题或产生一些负面影响:
1.增加归档目录的空间,这个已经不可行,因为已经没有可用空间
2.增加备份频度,会影响部分系统性能,后来观察影响不大,远远排在了oracle进程后面。
3.删除归档日志文件,这只是权宜之计,会带来控制文件和日志文件的不同步从而影响下一次的数据库备份失败,以及万一数据文件损坏从而因影响恢复的问题。
经过分析和权衡,初步采用了每天办法2次的办法。除了原来夜里零点备份的1次之外,又安排在白天2点备份一次,至于为什么定到2点,主要是想均衡一下业务量,考虑到凌晨业务量较小可能产生较少的日志(相对白天而言)。 结果很见效。
后来讨论,又发现了一下新的问题。 问题是:万一备份失败或者在12小时之内usr5空间满怎么办?于是又添加了一个执行脚本fs_monitor.sh,每小时执行一次,若发现usr5空间达到80% 就自动删除归档日志文件然后自动数据库同步。
以下是自动自动清楚自动同步的脚本(由左亮撰写):
#!/bin/sh #Please change the ARCHIVE_FS to your actual filesystem that your archive log storaged ARCHIVE_FS=/usr5 #Please change the ARCHIVE_DIR to your actual directory that your archive log storaged ARCHIVE_DIR=/usr5/oracle/bjdb/arch_2 #Defined the location of log file LOG=/usr5/oracle/bjdb/${0}.`date +%m%d`.log #Obtain the usage of filesystem at that time DFK=`df -k|grep $ARCHIVE_FS|awk '{USAGE=substr($5,1,length($5) - 1) print USAGE}'` START_RMAN=" setenv ORACLE_SID rman sqlplus /nolog << EOF connect /as sysdba startup exit EOF" STOP_RMAN=" setenv ORACLE_SID rman sqlplus /nolog << EOF connect /as sysdba shutdown immediate exit EOF " #Defined the command of archivelog crosscheck CMD_STR=" setenv ORACLE_SID bjdb rman target sys/sys catalog rman/rman@rman<<EOF crosscheck archivelog all; exit EOF " #Check the usage of ARCHIVE_FS if [ $DFK -gt 80 ] then TIME=`date` echo "At the time: "$TIME", Usage of " $ARCHIVE_FS "filesystem is beyond 80%. The used rate is :"$DFK"% now">>$LOG cd $ARCHIVE_DIR #Obtain file list that need to be remove FILE_LIST=`ls -lt|tail -600|awk '{print $9}'` for FILE in $FILE_LIST do rm $FILE 2>>$LOG done #Start rman database su - oracle -c "$START_RMAN">>$LOG #Run the crosscheck operation su - oracle -c "$CMD_STR">>$LOG #Stop rman database su - oracle -c "$STOP_RMAN">>$LOG echo "……">>$LOG else exit 0 fi
十二、判断oracle版本位数的方法
有2种方法,详情如下:
1.file $ORACLE_HOME/bin/oracle
/oracle92/app/oracle/product/9.2.0.1/bin/oracle: ELF 64-bit MSB executable SPAR |
2.SQL> select * from v$version
BANNER -------------------------------------------------------------------------------- Oracle9i EntERPrise Edition Release 9.2.0.6.0 - 64bit Production PL/SQL Release 9.2.0.6.0 - Production CORE 9.2.0.6.0 Production TNS for Solaris: Version 9.2.0.6.0 - Production NLSRTL Version 9.2.0.6.0 – Production |
十三、XX网有非正常数据文件的情况下的数据库rman恢复
背景:
XX网数据库在阿联重建控制文件的时候出现问题,决定使用rman的备份进行恢复,但是XX网数据库以前由于我们部门员工的误操作产生了一些非正常的数据文件,主要有以下情况:
1. 数据文件被非正常添加,然后被在操作系统内删除;
2. 数据文件被非正常添加,然后由于影响双机应用被强制离线。
这样在备份的时候会把这些文件跳过,而且rman也明确提示,会影响到他们相关表空间的恢复。
操作办法:
正常的控制文件和redolog还在,所以此时如果正常使用rman的restore database,系统会提示找不到备份的时候跳过的数据文件的备份,因此采用逐个恢复数据文件的方式:
restore datafile XXX; |
这样恢复所有的可用数据文件。
然后使用rman进行recover database时,系统会提示需要对跳过的数据文件进行恢复,此时无法恢复,因此使用如下办法解决:
1. 切换到sqlplus,进行recover database;
2. 查看提示需要的归档日志文件;
3. 使用rman把需要的归档日志恢复出来,由于空间的问题,所以采用每次恢复只恢复出来100个;
restore archivelog from sequence 1_xxxxx.dbf to sequence 1_xxxxx.dbf; |
4. 然后在sqlplus中recover database,观察到快要需要下一个100个归档日志的时候,再使用rman恢复下100个;
5. 一直恢复到最后一个归档日志,recover会退出,但是此时还未恢复完毕,可以查看一下现有的redolog中未归档的组;
6. 在sqlplus里使用以下命令,并指定未归档的redolog的文件位置来恢复:
recover database using backup controlfile until cancel |
7. 此时恢复完成,可以使用alter database open resetlogs打开数据库;
8. 打开之后需要做的事情包括:
a.建立恢复临时表空间的数据文件;
b.连接到rman的catalog数据库,并reset database重置当前数据库。
小主们看完我们的文章,想必一定对我们文章很感兴趣了吧,若大家想了解更多文章的课程,亲们可以到课课家官网查看。非常真诚地欢迎大家,偶在等你们哟,快来吧!!!