“借屍還魂”恢復Windows 9i冷備資料庫
冷備份是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的一項基本技術。從技術本身沒有什麼難度,重點在於資訊的收集和對步驟的理解。記錄下來,留待需要朋友待查。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1295459/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫冷備和恢復Oracle資料庫
- 資料庫異機冷備恢復資料庫
- Oracle資料庫的冷備份及冷備份異地恢復方法Oracle資料庫
- Oracle資料庫冷備份的異地恢復Oracle資料庫
- oracle冷備恢復Oracle
- SQL Server 資料庫備份還原和資料恢復SQLServer資料庫資料恢復
- 【備份恢復】從備份恢復資料庫資料庫
- Windows系統崩潰後恢復Oracle 9i資料庫WindowsOracle資料庫
- 【備份恢復】在 ARCHIVELOG 模式下執行資料庫還原和恢復操作(源庫備份源庫恢復)Hive模式資料庫
- oracle 冷備及恢復Oracle
- 講解Oracle資料庫冷備份恢復的具體步驟Oracle資料庫
- 使用冷備份與冷備份後的資料庫歸檔日誌檔案進行資料庫不完整恢復資料庫
- 【資料庫資料恢復】windows server下SqlServer資料庫的資料恢復資料庫資料恢復WindowsServerSQL
- 【備份恢復】下:還原和恢復資料庫(即將一個庫還原到另外一個庫)資料庫
- 【備份恢復】上:還原和恢復資料庫(即將一個庫還原到另外一個庫)資料庫
- oracle冷備份、恢復和異機恢復Oracle
- 備份與恢復:polardb資料庫備份與恢復資料庫
- 跨平臺還原、恢復資料庫(Windows->Linux)資料庫WindowsLinux
- oracle 9I 資料庫異機恢復( Catalog 庫 )Oracle資料庫
- 【備份恢復】noarchive模式下使用增量備份恢復資料庫Hive模式資料庫
- 資料庫資料的恢復和備份資料庫
- 達夢資料庫備份恢復資料庫
- postgresql備份與恢復資料庫SQL資料庫
- mongo資料庫備份與恢復Go資料庫
- 資料庫的備份與恢復資料庫
- Informix資料庫備份與恢復ORM資料庫
- 備份和恢復postgreSQL資料庫SQL資料庫
- Mysql資料庫備份及恢復MySql資料庫
- Oracle資料庫備份與恢復之匯出/匯入(EXP/IMP)、熱備份和冷備份Oracle資料庫
- Oracle冷備份級冷備份的不完全恢復Oracle
- 【備份恢復】RMAN catalog 恢復目錄資料庫資料庫
- 使用RMAN還原和恢復資料庫資料庫
- rman資料庫全庫備份與恢復資料庫
- 【備份恢復】閃回資料庫(四)基於可靠還原點閃回資料庫資料庫
- SqlServer資料庫恢復備份資料的方法SQLServer資料庫
- 【資料庫資料恢復】SAP資料庫資料恢復案例資料庫資料恢復
- PostgreSql資料庫的備份和恢復SQL資料庫
- Mongo 資料庫備份和恢復命令Go資料庫