“借屍還魂”恢復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的一項基本技術。從技術本身沒有什麼難度,重點在於信息的收集和對步驟的理解。記錄下來,留待需要朋友待查。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章