1 解决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
[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.
2 查看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;
3 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.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脚本检查表空间情况.
4 一个使用Oracle归档日志恢复数据库的案例
案例环境:XX网Oracle 816数据库,。
需求描述:
备份主机(装有oracle)上备份了7月13日的数据,但是主数据库服务器当前日期是7月15日。为了把备份主机上的库跟主数据库服务器同步,使用归档日志把7月13日的库前滚到7月15日。
处理步骤:
a) 备份备份主机上的控制文件,然后把主用数据库的最新控制文件备份并拷贝到备份主机相应目录
备份控制文件的方法:
sqlplus /nolog<<EOF
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命令
5 Oracle 补丁p3948480_9206_SOLARIS64.zip的安装步骤
升级说明:
是从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
6 在VM维护的裸设备上添加表空间的过程
创建裸设备,大小是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;
7 在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;
8 在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/linkdata/pre/pre_ln2_57.dbf';
10) 打开数据库 SQL〉alter database open;
11) 验证更改
9 解决在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时并行回滚被禁止,由于禁止了并行回滚,在数据库关闭时,需要回滚的事务将被取消。
10 数据库服务器字符集更改步骤
问题描述:
在客户端插入字符“咪咪”,从数据库中查询显示时出现乱码
处理步骤:
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
11 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
12 判断oracle版本位数的方法
有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
13 XX网有非正常数据文件的情况下的数据库rman恢复
背景:
XX网数据库在阿联重建控制文件的时候出现问题,决定使用rman的备份进行恢复,但是XX网数据库以前由于我们部门员工的误操作产生了一些非正常的数据文件,主要有以下情况:
1. 数据文件被非正常添加,然后被在操作系统内删除
2. 数据文件被非正常添加,然后由于影响双机应用被强制离线
这样在备份的时候会把这些文件跳过,而且rman也明确提示,会影响到他们相关表空间的恢复。
操作办法:
正常的控制文件和redolog还在,所以此时如果正常使用rman的restore database,系统会提示找不到备份的时候跳过的数据文件的备份,因此采用逐个恢复数据文件的方式:
这样恢复所有的可用数据文件。
然后使用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重置当前数据库;
|