“借屍還魂”恢復Windows 9i冷備資料庫

kingsql發表於2014-10-11

 

冷備份是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的一項基本技術。從技術本身沒有什麼難度,重點在於資訊的收集和對步驟的理解。記錄下來,留待需要朋友待查。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1295459/,如需轉載,請註明出處,否則將追究法律責任。

相關文章