冷備份是Oracle備份還原的一種重要技術。和熱備份不一樣的是,冷備份須要的運行技術條件比較低,不須要開啓歸檔模式。在容許特定時間停機的狀況下,冷備份能夠保存特定數據庫時間點的數據鏡像。隨着RMAN工具的普及和數據泵Data Pump推廣,冷備份,特別是直接將全部Oracle文件拷貝備份的狀況,已經比較少見了。sql
1、問題介紹數據庫
最近遇到一個任務,是將六七年前一套Oracle數據恢復到新購買的機器上,提供對外服務。筆者實地查看資料時候發現,當時工做人員只是將$ORACLE_HOME目錄所有內容「熱」拷貝到移動硬盤上。當年的Oracle服務器早已報廢,不可能直接拿到。服務器
這樣,留給筆者和同事的就只有上百G的數據庫文件、控制文件、online重作日誌。當年作備份的同事也只能依稀記住是一臺32位Windows服務器。網絡
Oracle冷備份是早期很是推崇常見的一種備份策略。說來也簡單,就是在關閉數據庫的狀況下,將數據庫核心文件:數據文件、控制文件、在線日誌文件、參數文件等內容保存下來。拷貝到新的服務器以後,將全部文件替換拷貝以後,直接能夠從新啓動數據庫。Oracle冷備份備份和還原的速度都是能夠接受的,可是還存在不少潛在問題。架構
首先,是版本問題。Oracle數據庫每一個版本都有本身對應的結構和數據組織方式。若是使用標準遷移工具,如Exp/Imp、Data Pump、甚至RMAN,均可以實現不一樣版本之間數據遷移。可是若是選擇冷備份,遷移以後Oracle版本要求是100%相同。而且版本位數(32bit或者64bit)徹底對應。筆者任務數據庫是接近10年前的老庫,可否找到對應版本介質是一個問題。oracle
其次,Windows版本風險。同AIX、Linux版本相比,Windows版本Oracle不少細節是隱藏在諸如註冊表、服務Services中的。這些內容和咱們傳統Linux、AIX上配置各類環境變量是有差異的。ide
第三,損壞文件風險。和其餘備份手段相比,冷備份直接保存數據文件。空閒空間也包括在備份範圍內。而其餘備份手段,直接備份保存實際數據,總量上要小不少。長期的保存,會增長文件損壞的概率。工具
針對這些狀況,筆者採用以下策略進行恢復:網站
ü 利用備份信息,最大程度瞭解原庫信息。「凡事預則立,不預則廢」,周密的調研準備是任何工做成功的必需要素。利用原有備份文件內容,特別是運行alert log的分析,儘量瞭解原庫狀況內容;spa
ü 找到合適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的一項基本技術。從技術自己沒有什麼難度,重點在於信息的收集和對步驟的理解。記錄下來,留待須要朋友待查。