冷备份是Oracle备份还原的一种重要技术。和热备份不同的是,冷备份需要的运行技术条件比较低,不需要开启归档模式。在允许特定时间停机的情况下,冷备份可以保存特定数据库时间点的数据镜像。随着RMAN工具的普及和数据泵Data Pump推广,冷备份,特别是直接将所有Oracle文件拷贝备份的情况,已经比较少见了。
1、问题介绍
最近遇到一个任务,是将六七年前一套Oracle数据恢复到新购买的机器上,提供对外服务。笔者实地查看资料时候发现,当时工作人员只是将$ORACLE_HOME目录全部内容“热”拷贝到移动硬盘上。当年的Oracle服务器早已报废,不可能直接拿到。
这样,留给笔者和同事的就只有上百G的数据库文件、控制文件、online重做日志。当年做备份的同事也只能依稀记住是一台32位Windows服务器。
Oracle冷备份是早期非常推崇常见的一种备份策略。说来也简单,就是在关闭数据库的情况下,将数据库核心文件:数据文件、控制文件、在线日志文件、参数文件等内容保存下来。拷贝到新的服务器之后,将所有文件替换拷贝之后,直接可以重新启动数据库。Oracle冷备份备份和还原的速度都是可以接受的,但是还存在很多潜在问题。
首先,是版本问题。Oracle数据库每个版本都有自己对应的结构和数据组织方式。如果使用标准迁移工具,如Exp/Imp、Data Pump、甚至RMAN,都可以实现不同版本之间数据迁移。但是如果选择冷备份,迁移之后Oracle版本要求是100%相同。并且版本位数(32bit或者64bit)完全对应。笔者任务数据库是接近10年前的老库,能否找到对应版本介质是一个问题。
其次,Windows版本风险。同AIX、Linux版本相比,Windows版本Oracle很多细节是隐藏在诸如注册表、服务Services中的。这些内容和我们传统Linux、AIX上配置各种环境变量是有差别的。
第三,损坏文件风险。和其他备份手段相比,冷备份直接保存数据文件。空闲空间也包括在备份范围内。而其他备份手段,直接备份保存实际数据,总量上要小很多。长期的保存,会增加文件损坏的几率。
针对这些情况,笔者采用如下策略进行恢复:
ü 利用备份信息,最大程度了解原库信息。“凡事预则立,不预则废”,周密的调研准备是任何工作成功的必须要素。利用原有备份文件内容,特别是运行alert log的分析,尽可能了解原库情况内容;
ü 找到合适OS和Oracle版本。经过分析,找到合适对应的旧版本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启动三个阶段,即nomount、mount和open阶段,相互独立但是有相互关联。操作的过程,实际上就是逐步清扫障碍、层层剥离的过程。
首先,是参数文件。默认情况下,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阶段可以通过,下面就可以整理Pfile到Spfile。
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的一项基本技术。从技术本身没有什么难度,重点在于信息的收集和对步骤的理解。记录下来,留待需要朋友待查。