“借尸还魂”恢复Windows 9i冷备数据库

冷备份是Oracle备份还原的一种重要技术。和热备份不同的是,冷备份需要的运行技术条件比较低,不需要开启归档模式。在允许特定时间停机的情况下,冷备份可以保存特定数据库时间点的数据镜像。随着RMAN工具的普及和数据泵Data Pump推广,冷备份,特别是直接将所有Oracle文件拷贝备份的情况,已经比较少见了。

 

1、问题介绍

 

最近遇到一个任务,是将六七年前一套Oracle数据恢复到新购买的机器上,提供对外服务。笔者实地查看资料时候发现,当时工作人员只是将$ORACLE_HOME目录全部内容“热”拷贝到移动硬盘上。当年的Oracle服务器早已报废,不可能直接拿到。

这样,留给笔者和同事的就只有上百G的数据库文件、控制文件、online重做日志。当年做备份的同事也只能依稀记住是一台32Windows服务器。

Oracle冷备份是早期非常推崇常见的一种备份策略。说来也简单,就是在关闭数据库的情况下,将数据库核心文件:数据文件、控制文件、在线日志文件、参数文件等内容保存下来。拷贝到新的服务器之后,将所有文件替换拷贝之后,直接可以重新启动数据库。Oracle冷备份备份和还原的速度都是可以接受的,但是还存在很多潜在问题。

首先,是版本问题。Oracle数据库每个版本都有自己对应的结构和数据组织方式。如果使用标准迁移工具,如Exp/ImpData Pump、甚至RMAN,都可以实现不同版本之间数据迁移。但是如果选择冷备份,迁移之后Oracle版本要求是100%相同。并且版本位数(32bit或者64bit)完全对应。笔者任务数据库是接近10年前的老库,能否找到对应版本介质是一个问题。

其次,Windows版本风险。同AIXLinux版本相比,Windows版本Oracle很多细节是隐藏在诸如注册表、服务Services中的。这些内容和我们传统LinuxAIX上配置各种环境变量是有差别的。

第三,损坏文件风险。和其他备份手段相比,冷备份直接保存数据文件。空闲空间也包括在备份范围内。而其他备份手段,直接备份保存实际数据,总量上要小很多。长期的保存,会增加文件损坏的几率。

针对这些情况,笔者采用如下策略进行恢复:

 

ü  利用备份信息,最大程度了解原库信息。“凡事预则立,不预则废”,周密的调研准备是任何工作成功的必须要素。利用原有备份文件内容,特别是运行alert log的分析,尽可能了解原库情况内容;

ü  找到合适OSOracle版本。经过分析,找到合适对应的旧版本Oracle安装文件,并且在适当地OS版本下运行,是这个任务的第二个难点;

ü  “借尸还魂”加载原有的数据库文件。针对Windows版本下特点,笔者计划安装相同名称的空数据库在服务器上,之后采用手段替换切换;

 

2、环境分析和准备

 

Alert Log告警日志是Oracle工作运行轨迹记录。基本配置内容、重大变化和提示信息,都可以在Oracle Alert Log中找到痕迹。

从日志中,我们分析出原库版本为9.2.0.1基础版本。运行平台是32bit Windows,具体操作系统是Windows 2000

 

 

ORACLE V9.2.0.1.0 - Production vsnsta=0

OS

Windows 2000 Version 5.1 Service Pack 2, CPU type 586

 

 

关键数据库参数信息如下:

 

 

Character Set: ZHS16GBK

 

Important Parameter:

background_dump_dest     = D:\oracle\admin\XXX\bdump

user_dump_dest           = D:\oracle\admin\XXX\udump

core_dump_dest           = D:\oracle\admin\XXX\cdump

db_name                  = xxx (业务敏感信息,有屏蔽)

 

 

其他重要数据库日志文件、控制文件和数据文件注册信息如下:

 

 

Control File

 

D:\oracle\oradata\XXX\CONTROL01.CTL

D:\oracle\oradata\XXX\CONTROL02.CTL

D:\oracle\oradata\XXX\CONTROL03.CTL

 

Online Redo Log

 

D:\ORACLE\ORADATA\XXX\REDO01.LOG

D:\ORACLE\ORADATA\XXX\REDO02.LOG

D:\ORACLE\ORADATA\XXX\REDO03.LOG

 

Data File

 

D:\ORACLE\ORADATA\XXX\USERS01.DBF

D:\ORACLE\ORADATA\XXX\USERS02.DBF

D:\ORACLE\ORADATA\XXX\USERS03.DBF

(篇幅原因,有省略……)

D:\ORACLE\ORADATA\XXX\INDX05.DBF

 

Temp File:

D:\oracle\oradata\XXX\TEMP01.DBF

 

Undo File:

 

D:\ORACLE\ORADATA\XXX\UNDOTBS01.DBF

D:\ORACLE\ORADATA\XXX\UNDOTBS02.DBF

D:\ORACLE\ORADATA\XXX\UNDOTBS03.DBF

D:\ORACLE\ORADATA\XXX\UNDOTBS04.DBF

 

 

我们从官方网站,已经不能直接拿到9i安装介质了。但是通过Oracle内部的FTP,还是可以下载到安装介质,详细可以参见网络上一些教程资料。最后是操作系统版本,Oracle 9i不能安装在Win7环境下,即使有一些迂回手段,笔者也不想采用。最理想的操作系统是Windows 2000,很遗憾笔者没有机会拿到。最后,选择32bit WinXP作为服务器基础版本使用。

准备好介质之后,就可以进行安装和配置过程了。

 

3、操作过程

 

笔者服务器上没有配置D盘,所以直接使用C盘进行安装。采用默认方式,安装Oracle 9i软件和数据库。这个数据库就是我们计划采用的借尸还魂对象,数据库名称和还原库相同,位置采用类似架构组织方式。

配置完成之后,我们就可以逐步实施还原动作了。

Oracle启动三个阶段,即nomountmountopen阶段,相互独立但是有相互关联。操作的过程,实际上就是逐步清扫障碍、层层剥离的过程。

首先,是参数文件。默认情况下,Oracle会自动到$ORACLE_HOME/database$ORACLE_HOME/dbs Linux版本)依据文件名称规则寻找合适参数文件。具体哪个文件、启动哪一个实例要看参数ORACLE_SID的设置。由于还原库和新库名称相同,笔者尝试借用新库参数文件启动数据库。同时,在control_files参数上做文章,引导到原有的控制文件上。

 

C:\Documents and Settings\Administrator>sqlplus /nolog

 

SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 9 29 08:29:58 2014

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

 

SQL> conn / as sysdba

已连接到空闲例程。

 

SQL> create pfile from spfile;

文件已创建。

 

 

到指定位置上,找到生成的参数文件pfile,修改control_files参数。

 

 

--修改$ORACLE_HOME/database目录下的initXXX.ora文件

 

*.control_files='C:\oracle\oradata\xxx\CONTROL01.CTL','C:\oracle\oradata\xxx\CONTROL02.CTL','C:\oracle\oradata\xxx\CONTROL03.CTL'

 

 

修改control_files为:

 

*.control_files='C:\xxx_table\oradata\xxx\CONTROL01.CTL','C:\xxx_table\oradata\xxx\CONTROL02.CTL','C:\xxx_table\oradata\xxx\CONTROL03.CTL'

 

 

使用新的文本参数文件启动数据库到nomount状态。

 

 

SQL> startup nomount pfile=c:\oracle\ora92\database\INITXXX.ora

ORACLE 例程已经启动。

 

Total System Global Area  663822116 bytes

Fixed Size                   454436 bytes

Variable Size             260046848 bytes

Database Buffers          402653184 bytes

Redo Buffers                 667648 bytes

 

 

确认参数修改。

 

 

SQL> show parameter control_file

 

NAME                                 TYPE

------------------------------------ ----------------------

VALUE

------------------------------

control_file_record_keep_time        integer

7

control_files                        string

C:\XXX_table\oradata\XXX\CON

TROL01.CTL, C:\XXX_table\orad

ata\XXX\CONTROL02.CTL, C:\lif

e_table\oradata\XXX\CONTROL03

.CTL

 

 

启动到mount状态。

 

 

SQL> alter database mount;

alter database mount

*

ERROR 位于第 1 :

ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDXXX.ORA'

 

 

密码文件报错。Oracle数据库标示不仅仅是名称字符串,还包括一个DBID唯一数字。这里面报错,说明Oracle在启动过程中,发现存在一定不一致的情况。可以重建密码文件,确认启动状态。

 

 

C:\oracle\ora92\database>orapwd file=PWDXXX.ora password=oracle

 

SQL> select open_mode from v$database;

 

OPEN_MODE

----------

MOUNTED

 

 

在这个案例中,控制文件中最重要的是日志文件和数据文件的位置命名。我们虽然有文件在,但是Open的时候,Oracle会根据控制文件中写入的内容去寻找定位。所以,需要修改两种文件的路径命名。

 

 

SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER

---------- ------- ------- -----------------------------------

         3 STALE   ONLINE  D:\ORACLE\ORADATA\XXX\REDO03.LOG

         2         ONLINE  D:\ORACLE\ORADATA\XXX\REDO02.LOG

         1 STALE   ONLINE  D:\ORACLE\ORADATA\XXX\REDO01.LOG

 

 

SQL> alter database rename file 'D:\ORACLE\ORADATA\XXX\REDO01.LOG' to 'C:\XXX_TABLE\ORADATA\XXX\REDO01.LOG';

 

Database altered

 

SQL> alter database rename file 'D:\ORACLE\ORADATA\XXX\REDO02.LOG' to 'C:\XXX_TABLE\ORADATA\XXX\REDO02.LOG';

 

Database altered

 

SQL> alter database rename file 'D:\ORACLE\ORADATA\XXX\REDO03.LOG' to 'C:\XXX_TABLE\ORADATA\XXX\REDO03.LOG';

 

Database altered

 

 

外加数据文件。

 

 

SQL> select file#, name from v$datafile;

 

     FILE# NAME

---------- --------------------------------------------------------------------------------

         1 D:\ORACLE\ORADATA\XXX\SYSTEM01.DBF

         2 D:\ORACLE\ORADATA\XXX\UNDOTBS01.DBF

         3 D:\ORACLE\ORADATA\XXX\CWMLITE01.DBF

      

        19 D:\ORACLE\ORADATA\XXX\INDX03.DBF

        20 D:\ORACLE\ORADATA\XXX\INDX04.DBF

 

     FILE# NAME

---------- --------------------------------------------------------------------------------

        21 D:\ORACLE\ORADATA\XXX\INDX05.DBF

 

21 rows selected

 

SQL> alter database rename file 'D:\ORACLE\ORADATA\XXX\UNDOTBS01.DBF' to 'C:\XXX_TABLE\ORADATA\XXX\UNDOTBS01.DBF';

 

Database altered

(篇幅原因,略……)

 

 

最后是临时文件,临时文件修改不能采用rename的方法。需要建立一个临时表空间替换,并且解决Default Temporary Tablespace问题。

 

 

SQL> create temporary tablespace temp2 tempfile 'C:\XXX_TABLE\TEMP02.DBF' size 100M autoextend on;

Tablespace created

 

SQL> alter database open;

数据库已更改。

 

SQL> alter database default temporary tablespace temp2;

数据库已更改。

 

SQL> drop tablespace temp including contents and datafiles;

Tablespace dropped

 

 

Open阶段可以通过,下面就可以整理PfileSpfile

 

 

SQL> conn / as sysdba

已连接。

SQL> show parameter spfile;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----------

spfile                               string

SQL> create spfile from pfile;

 

文件已创建。

 

 

重启数据库实验。

 

 

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  663822116 bytes

Fixed Size                   454436 bytes

Variable Size             260046848 bytes

Database Buffers          402653184 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL>

 

 

操作成功。

 

4、结论

 

冷备份还原,是Oracle传统的技术之一。也是入门DBA的一项基本技术。从技术本身没有什么难度,重点在于信息的收集和对步骤的理解。记录下来,留待需要朋友待查。


你可能感兴趣的:(oracle,恢复,冷备份)