「借屍還魂」恢復Windows 9i冷備數據庫

冷備份是Oracle備份還原的一種重要技術。和熱備份不一樣的是,冷備份須要的運行技術條件比較低,不須要開啓歸檔模式。在容許特定時間停機的狀況下,冷備份能夠保存特定數據庫時間點的數據鏡像。隨着RMAN工具的普及和數據泵Data Pump推廣,冷備份,特別是直接將全部Oracle文件拷貝備份的狀況,已經比較少見了。sql

 

1、問題介紹數據庫

 

最近遇到一個任務,是將六七年前一套Oracle數據恢復到新購買的機器上,提供對外服務。筆者實地查看資料時候發現,當時工做人員只是將$ORACLE_HOME目錄所有內容「熱」拷貝到移動硬盤上。當年的Oracle服務器早已報廢,不可能直接拿到。服務器

這樣,留給筆者和同事的就只有上百G的數據庫文件、控制文件、online重作日誌。當年作備份的同事也只能依稀記住是一臺32Windows服務器。網絡

Oracle冷備份是早期很是推崇常見的一種備份策略。說來也簡單,就是在關閉數據庫的狀況下,將數據庫核心文件:數據文件、控制文件、在線日誌文件、參數文件等內容保存下來。拷貝到新的服務器以後,將全部文件替換拷貝以後,直接能夠從新啓動數據庫。Oracle冷備份備份和還原的速度都是能夠接受的,可是還存在不少潛在問題。架構

首先,是版本問題。Oracle數據庫每一個版本都有本身對應的結構和數據組織方式。若是使用標準遷移工具,如Exp/ImpData Pump、甚至RMAN,均可以實現不一樣版本之間數據遷移。可是若是選擇冷備份,遷移以後Oracle版本要求是100%相同。而且版本位數(32bit或者64bit)徹底對應。筆者任務數據庫是接近10年前的老庫,可否找到對應版本介質是一個問題。oracle

其次,Windows版本風險。同AIXLinux版本相比,Windows版本Oracle不少細節是隱藏在諸如註冊表、服務Services中的。這些內容和咱們傳統LinuxAIX上配置各類環境變量是有差異的。ide

第三,損壞文件風險。和其餘備份手段相比,冷備份直接保存數據文件。空閒空間也包括在備份範圍內。而其餘備份手段,直接備份保存實際數據,總量上要小不少。長期的保存,會增長文件損壞的概率。工具

針對這些狀況,筆者採用以下策略進行恢復:網站

 

ü  利用備份信息,最大程度瞭解原庫信息。「凡事預則立,不預則廢」,周密的調研準備是任何工做成功的必需要素。利用原有備份文件內容,特別是運行alert log的分析,儘量瞭解原庫狀況內容;spa

ü  找到合適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的一項基本技術。從技術自己沒有什麼難度,重點在於信息的收集和對步驟的理解。記錄下來,留待須要朋友待查。

相關文章
相關標籤/搜索