【oracle常见问题及解决】
故障现象:
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 [0000000101C3089C] [SIGSEGV] [Address not mappe
d to object] [0x000000000] [] []
Wed Jun 8 20:24:22 2005
Errors in file /u02/app/oracle/admin/unicom/bdump/unicom_pmon_11598.trc:
ORA-07445: exception encountered: core dump [0000000101C399A0] [SIGSEGV] [Address not mapped to object] [0x000000000] [] []
Wed Jun 8 20:24:23 2005
Errors in file /u02/app/oracle/admin/unicom/bdump/unicom_pmon_11598.trc:
ORA-07445: exception encountered: core dump [0000000101C399A0] [SIGSEGV] [Address not mapped to object] [0x000000000] [] []
ORA-00602: internal programming exception
ORA-07445: exception encountered: core dump [0000000101C399A0] [SIGSEGV] [Address not mapped to object] [0x000000000] [] []
Wed Jun 8 20:24:33 2005
CKPT: terminating instance due to error 472
Instance terminated by CKPT, pid = 11604
Wed Jun 8 21:04:47 2005
Starting ORACLE instance (normal)
解决办法:
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.
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;
故障现象:
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.dmp full=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)图形化配置工具。注意:建议不要删除数据文件、重做日志文件和控制文件以及归档日志文件,处理方法是:一)就数据文件、重做日志文件和控制文件分别改名为xxx.bak.xxx文件,例如mv datafile001.dbf datafile001.bak.dbf ;二)就归档日志文件,只改名归档日志文件所在的目录名即可,例如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/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脚本检查表空间情况.
案例环境:XX网Oracle 816数据库,。
需求描述:
备份主机(装有oracle)上备份了7月13日的数据,但是主数据库服务器当前日期是7月15日。为了把备份主机上的库跟主数据库服务器同步,使用归档日志把7月13日的库前滚到7月15日。
处理步骤:
a) 备份备份主机上的控制文件,然后把主用数据库的最新控制文件备份并拷贝到备份主机相应目录
备份控制文件的方法:
sqlplus /nolog<
connect internal
alter database backup controlfile to '${BACKUP_DIR}/controlfile.bkp';
alter database backup controlfile to trace;
EOF
b) 拷贝主库的归档日志到备份数据库的归档日志目录(这个前滚操作需要从13号到15号的归档日志完整,若备份数据库的归档日志目录不知道,可以从参数文件中看
c) 启动数据库到mount状态,使用recover database前滚数据库
SQL> startup restrict mount pfile="${ORACLE_BASE}/admin/sdh21/pfile/init${service_names}.ora"
SQL> recover database using backup controlfile;
选择AUTO模式
d) 如果到了最后一个日志它还需要前滚,此时可以在主库上把当前redolog切换,然后把产生的归档继续拷贝到备份主机,继续前滚。
e) 前滚完成之后,它可能还继续要求下一个归档日志,此时可以CANCEL
f) 使用reselogs选项打开数据库
SQL> alter database open resetlogs;
注意:如果打开时报错可能是还需要把日志继续前滚,可重复使用recover database命令
升级说明:
是从Oracle 9.2.0.1.0升级到9.2.0.6.0,解决一系列bug问题。
安装步骤:
解压文件包
%unzip p3948480_9206_SOLARIS64.zip
%cd Disk1
停掉数据库
sql>shutdown immediate
启动安装程序
%./runInstaller
执行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
执行utlrp.sql脚本
SQL> shutdown
SQL>startup
SQL>@?/rdbms/admin/utlrp.sql //执行utlrp.sql脚本
验证
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
创建裸设备,大小是2G
#/usr/sbin/vxassist -g datadg make vol183 2G
修改指定裸设备的权限
#vxedit -g datadg set user=oracle group=oinstall mode=600 vol182
创建连接
#ln -s /dev/vx/rdsk/datadg/vol182 pre_ln2_182.dbf
添加到指定的表空间,例如UNDOTBS1
SQL> alter tablespace UNDOTBS1
2 add datafile '/usr5/linkdata/pre/pre_ln2_182.dbf' size 2000M;
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;
故障现象:
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/linkdata/pre/pre_ln2_57.dbf';
10) 打开数据库
SQL〉alter database open;
11) 验证更改
故障现象:
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时并行回滚被禁止,由于禁止了并行回滚,在数据库关闭时,需要回滚的事务将被取消。
问题描述:
在客户端插入字符“咪咪”,从数据库中查询显示时出现乱码
处理步骤:
10.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。
10.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则说明改动成功。
如果执行正常,则按照下一节进行测试操作。
10.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,Windows客户端环境下测试
运 行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
--------------------
洣洣
则成功。
10.4 更改不成功时的措施
新建数据库,设定字符集为ZHS16GBK,其他参数先照搬原来的,并倒入数据。建库时所需的具体参数在重建之前要搜集。注意在配置控制文件时设定最大数据文件数。
建好数据库以后,执行以下命令即可恢复数据库
%cd /sybdata/orabak
%imp system/manager@hnsdh full=y ignore=y file=hnsdh_2005-8-17 log=hnsdh_imp_2005 -8-17
故障现象:
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<
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
有2种方法,详情如下:
1) file $ORACLE_HOME/bin/oracle
/oracle92/app/oracle/product/9.2.0.1/bin/oracle: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped
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网数据库以前由于我们部门员工的误操作产生了一些非正常的数据文件,主要有以下情况:
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. 打开之后需要做的事情包括:1)建立恢复临时表空间的数据文件;2)连接到rman的catalog数据库,并reset database重置当前数据库;