Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495996
  • 博文数量: 105
  • 博客积分: 3040
  • 博客等级: 中校
  • 技术积分: 1450
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-08 13:04
文章分类

全部博文(105)

文章存档

2008年(105)

我的朋友

分类: Oracle

2008-07-16 11:23:02

 
恢复方法一:缺少初始化文件,数据库是无法启动的。如果通过RMAN备份了初始化参数,那么可以通过RMAN对初始化参数进行恢复.

初始化参数的丢失和损坏,并不会造成太严重的问题,即使是最坏的情况,导致无法进行恢复,也是可以通过手工编辑一个新的PFILE文件,来启动实例的。

而且,在数据库的alert文件中包含了每次数据库启动使用的所有非默认值初始化参数,因此重新编写一个初始化参数并不困难。

不过,既然对SPFILE进行了备份,那么完全可以采用恢复的方式来还原SPFILE

对于CATALOG方式,SPFILE的恢复相对简单很多。不过Oracle文档上对于SPFILE的恢复的描述有些小问题:SET DBID这个步骤是不能省略的,否则会报错。

$ rman target / catalog

      RMAN> startup force nomount;

            restore spfile to 'filename' from autobackup;

缺少初始化文件,数据库是无法启动的。如果通过RMAN备份了初始化参数,那么可以通过RMAN对初始化参数进行恢复。

二、前面介绍了CATALOG方式下的SPFILE的恢复问题,这里讨论NOCATALOG的恢复方式。对于NOCATALOG,如果开启了AUTOBACKUP,那么恢复数据库的SPFILE也是很简单的问题。

首先检查alert文件,确定最近的自动备份的名称。

$ tail -200 /opt/ora9/admin/testdata/bdump/alert_testdata.log |grep c-
handle '/data1/backup/testdata/c-2270762593-20070629-00'

根据得到的信息不但可以确定自动备份的名称和位置,还可以得到数据库的DBID,当前的例子中,2270762593就是数据库的DBID

下面就可以利用RMAN进行恢复了,仍然必须SET DBID,然后利用RMAN的默认参数进行启动:

$ rman target /

Recovery Manager: Release 9.2.0.4.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

connected to target database (not started)

RMAN> set dbid 2270762593

executing command: SET DBID

RMAN> startup force nomount

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/ora9/product/9.2/dbs/inittestdata.ora'

trying to start the Oracle instance without parameter files ...
Oracle instance started

Total System Global Area 97588504 bytes

Fixed Size 451864 bytes
Variable Size 46137344 bytes
Database Buffers 50331648 bytes
Redo Buffers 667648 bytes

RMAN> run
2> {
3> set controlfile autobackup format for device type disk to '/data1/backup/testdata/%F';
4> allocate channel c1 device type disk;
5> restore spfile from autobackup;
6> }

executing command: SET CONTROLFILE AUTOBACKUP FORMAT


allocated channel: c1
channel c1: sid=9 devtype=DISK

Starting restore at 29-6 -07

channel c1: looking for autobackup on day: 20070629
channel c1: autobackup found: /data1/backup/testdata/c-2270762593-20070629-00
channel c1: SPFILE restore from autobackup complete
Finished restore at 29-6
-07
released channel: c1

对于不存在autobackup的情况,问题就比较复杂了。首先第一个问题就是要DBID,第二个还要确定目前的备份集中哪个是包含SPFILE的。

对于第一个问题,如果对数据文件的格式有一定的,可以直接从数据文件头中获取,这里就不介绍具体的方法了。

对于第二个问题,最差的方法不过是挨个尝试所有的备份集。

如果两个问题就可以,那么没有AUTOBACKUP,恢复SPFILE也是很容易的:

RMAN> restore spfile from '/data1/backup/testdata/2kilbkkg_1_1';

Starting restore at 29-6 -07

allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
channel ORA_DISK_1: autobackup found: /data1/backup/testdata/2kilbkkg_1_1
channel ORA_DISK_1: SPFILE restore from autobackup complete
Finished restore at 29-6
-07
startup force

 

前面介绍对于不存在autobackup的情况,SPFILE的恢复问题比较复杂。

如果仅仅是SPFILE丢失,控制文件仍然存在的话,那么还有一种相对简单的恢复方法。首先手工编辑一个初始化参数文件,指明数据库名称和控制文件位置。相对于上一篇文章的DBID而言,这些是很容易得到的。

[oracle@demo2 oracle]$ vi init.ora

db_name=testdata
instance_name=testdata
control_files='/data/oradata/testdata/control01.ctl'
db_block_size=8192

注意,如果DB_BLOCK_SIZE的值可以通过alert文件中查到,如果alert文件丢失,可以尝试多次,当发现下面的错误时,关闭实例,重新修改INIT.ORA文件,再次启动。

RMAN> startup mount pfile=/home/oracle/init.ora

Oracle instance started
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 07/05/2007 20:32:11
ORA-00209: control file blocksize mismatch, check alert log for more info

下面用RMAN将数据库启动到MOUNT状态,就可以利用控制文件中保存的备份信息去恢复SPFILE了。

[oracle@demo2 oracle]$ rman target /

Recovery Manager: Release 9.2.0.4.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

connected to target database (not started)

RMAN> startup mount pfile=/home/oracle/init.ora

Oracle instance started
database mounted

Total System Global Area 97588504 bytes

Fixed Size 451864 bytes
Variable Size 46137344 bytes
Database Buffers 50331648 bytes

Redo Buffers 667648 bytes

RMAN> list backup of spfile;

using target database controlfile instead of recovery catalog

List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1154 Full 0 DISK 00:00:01 06-7
-07
BP Key: 2042 Status: AVAILABLE Tag: TAG20070706T130211
Piece Name: /data1/backup/testdata/4dim5buh_1_1
SPFILE Included: Modification time: 27-2
-07

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1156 Full 0 DISK 00:05:09 06-7
-07
BP Key: 2044 Status: AVAILABLE Tag: TAG20070706T130423
Piece Name: /data1/backup/testdata/4jim5c2n_1_1
SPFILE Included: Modification time: 27-2
-07

RMAN> restore spfile;

Starting restore at 06-7 -07

allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=10 devtype=DISK
channel starting datafile backupset restore
channel restoring SPFILE
output filename=/opt/ora9/product/9.2/dbs/spfiletestdata.ora
channel restored backup piece 1
piece handle=/data1/backup/testdata/4jim5c2n_1_1 tag=TAG20070706T130423 params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 06-7

RMAN> startup force;

Oracle instance started
database mounted
database opened

Total System Global Area 1175525576 bytes

Fixed Size 452808 bytes
Variable Size 335544320 bytes
Database Buffers 838860800 bytes
Redo Buffers 667648 bytes

使用这种,只需要指定DBNAME,控制文件的位置,并确保控制文件没有丢失就可以了。

不再需要控制文件的AUTOBACKUP,以及DBID的值,也不需要挨个备份集尝试去恢复SPFILE

阅读(1270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~