2009年4月27日 星期一

Windows 下刪除 archived log files

Archived log files 是當資料庫災難發生時,確保資料完整性不可獲缺的要素之一。然而,也因為 archived log files 會伴隨著 redo log switch 持續產生的特性,變成磁碟空間管理上需特別注意的問題。

一般而言,當透過 rman 執行 full/incremental backup 時,就會一併將備份完成的全部或是某一特定時間前的 archived log files 刪除。這同時也是比較建議的作法。

倘若使用 cold backup 搭配 third party 備份軟體時,archived log files 或許就需採用手動(系統排程)的方式來刪除。在 Unix-based 平台下,只需透過 find 指令搭配 ctime 或 mtime 參數便可達成。但是同樣的動作在 Windows 下,使用 VB Script 亦可大幅簡化執行的步驟。以下便列出執行的步驟:

Step 1:將虛線區塊內的 VB Script 存檔為 arch_del.vbs
=================================================
Const WhatchFolder = "C:\temp"
Const MaxDays = 30
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(WhatchFolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
If DateDiff("d",objFile.DateCreated,now) >= MaxDays Then
objFSO.DeleteFile(objFile.Path)
End If
Next
=================================================
WhatchFolder 代表存放 archived log files 的路徑。
MaxDays 代表保存天數,若大於此數值的檔案即刪除。

Step 2:
在 windows command 模式下執行 wscript arch_del.vbs ,測試 c:\temp 目錄下建立時間超過 30 天的檔案是否已被刪除。

Step 3:將該指令列入系統排程,每日便可自動刪除 archived log files。

2009年4月26日 星期日

淺談 Oracle Data Guard

Business continuity(營運持續)和 disaster recovery(災難復原)是大部分企業高階管理者的優先考量。伴隨著日趨複雜的經濟環境、急遽變動的市場潮流以及高度的競爭壓力,一個有運作效率並且能迅速反應不可預期中斷的 7*24 營運環境已經變成組織內不可獲缺的一環。

Oracle Data Guard 正是其中一個最有效率的解決方案。它提供一個保護企業核心資產,資料,的架構來維持 7*24 運作,以及任何可能的災難或系統中斷。

一般而言,影響企業運作的 downtime(停機時間)可分為 unplanned(非預期中)與 planned(預期中)兩種。Unplanned downtime 是指因硬體或系統故障、儲存裝備故障、人為疏失、電腦病毒、軟體技術故障及自然災害等等。Planned downtime 的發生通常是為了執行某些既定計畫,像是系統或硬體升級。

什麼是 Oracle Data Guard:
Data Guard 透過建置 standby database 來維持與 production database 資料一致。Standby database 可建置在任何可透過網路連線的營運據點。倘若 production database 因任何 planned 或 unplanned 的故障而無法使用時,Data Guard 即可 switch(切換)任何一台 standby database 來成為 production database 的角色。透過此機制,不僅可以 minimizing downtime(極小化停機時間)並可避免任何的 data loss(資料遺失)。

下圖為 Data Guard 架構:



Data Guard 的功能:
Data Guard 包含一個 production / primary database 以及一個或多少 standby database。Data Guard 使用 redo log 來維持 production 與 standby database 間資料的一致性。當在 production database 上有交易發生時, redo log 會被產生並寫至本機 redo log files上。在 Data Guard 的架構下,這些 redo 資料也會傳輸到 standby 主機,並且被套用至 standby database 上來保持資料與 primary database 一致。Data Guard 允許管理者使用同步或非同步的方式來將 redo 資料傳輸至 standby database 上。

Standby Database 又可被分為 Data Guard Redo Apply(physical standby database)及 Data Guard SQL Apply(logical standby database)。

Physical standby database 是基於 "block-for-block" 基礎下,建置有著和 primary database 完全相同的 database 結構,並使用 Oracle media recovery。

反之 logical standby database 則是一個獨立的 database 但具有跟 primary database 相同的資料。它是使用 SQL statement 來進行資料的異動與更新。其中最大的優勢就是可以同時被用於 recovery 及其它工作,例如報表或查詢。

2009年4月23日 星期四

Unix 檔案加密 (data encrypt)

最近某個公家單位客戶提到該如何將 Solaris 上 Oracle DB cold backup 產出的 data files tar 檔案加密。該客戶目前做法是先將 DB 主機備份的 tar 檔傳輸到某 Windows 備份機器上後在使用 winrar 的密碼功能來進行加密,但這種作法往往要耗費掉客戶 6~7 個小時的時間。因此建議客戶使用 Unix OS command 在 server 端直接加密即可。

在此列出 Unix 下比較常見的幾個加密工具與用法:

* openssl 算是比較廣為人知的加密工具,並且提供了多種不同的加密演算法。
加密語法:openssl enc -e -des3 -in /tmp/passwd -out /tmp/passwd.cpt

解密語法:openssl enc -d -des3 -in /tmp/passwd.cpt -out /tmp/passwd

若要使用密碼檔,可先將密碼寫入至一檔案內,並在指令最後面加上 -k 密碼檔檔名,例如:
openssl enc -e -des3 -in /tmp/passwd -out /tmp/passwd.cpt -k key.cpt
openssl enc -d -des3 -in /tmp/passwd.cpt -out /tmp/passwd -k key.cpt

PS:在測試時發現,當來源檔過大時,可能會出現無法加密的錯誤訊息,或許後續版本已有修正。另外,該工具在非 linux 平台可能需要額外安裝。

* crypt 相較於 openssl,crypt 提供的加密演算法就沒有那麼豐富,但足以滿足 end-user 的需求。

加密語法:cat /tmp/passwd | crypt a12345 > /tmp/passwd.crypt

解密語法:cat /tmp/passwd.crypt | crypt a12345 > /tmp/passwd

其中的 a12345 為加解密密碼。

2009年4月16日 星期四

Auxiliary Database 實作

在標準的 RMAN 備份還原指令中,不外乎會指定(I)Target database:指定被備份或還原的資料庫。(II)Catalog database 或 controlfile:儲存歷史備份資訊與參數的 repository,但其中還有一個比較不常見但相當實用,被稱為 Auxiliary database 的語法。Auxiliary database 是指 duplicate(複製)一個與 Target database 完全相同的資料庫,另外也可以被使用來作為 Data Guard 中 Physical standby 資料庫的建立。此方法大大的簡化了複製資料庫或是建立 Physical standby 資料庫所需的程序與時間,也是 Oracle 官方主要建議的建置方法之一。

本文將實作透過 RMAN 的 Auxiliary 語法來複製名稱、結構與資料完全相同的資料庫。

預計目標:
將 Pri 主機上的 demo2 資料庫透過 RMAN 完整複製成 Std 主機上的 demo2 資料庫。

環境說明:
DB 版本:10gR2
主機:Pri 資料庫:demo2(Target DB)
主機:Std 資料庫:demo1(Catalog DB)、demo2(Auxiliary DB)

前置作業:
* 使用 RMAN 產生 Pri 上 demo2 的 incremental level 0 backupset
* 將 incremental level 0 backupset 由 Pri 複製至 Std 上,並確保存放路徑完全相同
* 在 Std 上建立與 Pri 檔案路徑完全相符的目錄,包含 datafile,redo log files 與 control files
* 將 Std 上 demo2 參數 log_file_name_convert 路徑設定為與 Pri 上放置 redo logs 的路徑相符,避免複製過程中 DB 找不到參數而直接將 redo logs 放置到 flash_recovery_area 路徑下
* 在 Std 上建立一個名稱為 demo2 的 instance,並將其啟動至 nomount 狀態

執行步驟
Step1:
[oracle@Std db_1]$ export ORACLE_SID=demo2

Step2:
[oracle@Std db_1]$ rman target sys/password@pdemo2 catalog rman_user/password@demo1 auxiliary /

若連線成功,會出現類似以下的訊息:
connected to target database: DEMO2 (DBID=3656776519)
connected to recovery catalog database
connected to auxiliary database: DEMO2 (not mounted)

Step3:
RMAN> RUN {
DUPLICATE TARGET DATABASE TO DEMO2
NOFILENAMECHECK;
}

待指令完成後,Std 上的 demo2 會被自動帶至 open 的狀態,即可進行連線測試。

2009年4月14日 星期二

開機自動啟動 Oracle DB on Solaris

主要有三個步驟:

1. 將 /var/opt/oracle/oratab 檔案內的 DBNAME:/oracle/product/9.2.0:N 改成 DBNAME:/oracle/product/9.2.0:Y

2. 在 /etc/init.d/ 建立一個為 dbora 的檔案,權限為 744,OWNER 為 root,GROUP 為 sys。檔案內容如下:
=======================================================
#!/bin/sh
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.

ORA_HOME=/oracle/product/9.2.0
ORA_OWNER=oracle

if [! -f $ORA_HOME/bin/dbstart]
then
echo "Oracle startup: cannot start"
exit
fi
case "$1" in
'start')
# Start the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start" &
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart &
;;
'stop')
# Stop the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop" &
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut &
;;
esac

=======================================================

3. 在 /etc/rc3.d 目錄下建立一個 S99dbora 的 soft link 至 /etc/init.d/dbora
指令為: ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora

重新開機測試資料庫是否能被自動帶起。

2009年4月11日 星期六

備份還原概論 - 3

資料庫的重建通常包含了兩個階段:1.從備份的檔案中取得所需的 Datafile。 2.套用備份時間點之後的 archived 和 online redo logs。這兩個步驟一般也被稱為 Restore 與 Recovery。

Restore 代表將 datafile 或 control file 由備份的 tape(磁帶)、disk(硬碟)或是其他 media 取回至硬碟上。

Recovery 是令 restore 完成的 datafile 去套用 archived redo logs 來將資料庫還原至備份時間點後的某特定 SCN(System Change Number)/時間。



以上圖為例,資料庫在 SCN 100 時執行了一次包含 Datafile 的備份,而且 SCN 100 之後所有的 redo logs 皆有被 archving。隨後資料庫在SCN 500 時因為硬體故障而需要還原,這時候便須要 restore 在 SCN 100 時所備份的 datafile,然後 recover 在 SCN 100 之後所備份的 archived redo logs。(亦可將SCN想像為某一特定時間點)

另外 Complete Recovery(完整回復)與 Incomplete/Point-In-Time recovery(不完整/時間點回復)在備份還原策略中也是經常被提及的兩種型態。

Complete recovery 是指將資料庫回復至離現在最近的一個時間點,已完成的交易資料不會有所損失。一般所指的回復通常就是 Complete recovery。

然而,也會有將資料庫回復至過去某特定時間點的需求。舉例來說,還原一些使用者造成的錯誤,像是誤刪資料或表格的情況。這種案例的話,則是需要將資料庫回復至誤刪動作發生前。這種回復方式就被稱為 Incomplete/Point-In-Time recovery。另外這種還原方式也是當 archived redo logs 有不連續或損毀情況下的唯一解決方法。

2009年4月5日 星期日

備份還原概論 - 2

Physical backup 通常是指備份供資料庫儲存的實體檔案,因此透過了解 physical database structure(資料庫實體結構)將有助於整體性策略的擬定與執行。本文將就與備份還原相關的資料庫實體結構來進行討論,其中包含了:Datafiles and Data Blocks,Redo Logs,Control Files.

* Datafiles and Data Blocks:資料庫通常是由一個/多個被稱為tablespace space(表格空間)的 logical storage units(邏輯存儲單元)所組成。而每個 tablespace 則是由一個/多個OS層中 physical files 所構成,一般稱為 datafiles。在 Datafiles 中是使用 Data Blocks 來作為存放資料的 smallest units of storage(最小儲存單元)。因此 Datafiles and Data Blocks 是備份還原中是一個很重要的部分。

* Redo Logs:Redo logs 紀錄資料庫中 data files 異動的資訊。也就是說當資料有所異動時,資料庫會將其變動的部份先紀錄在 redo logs,然後再寫入到 datafiles。Redo logs 儲存變動資料的特性在資料庫備份中也扮演了一個很重要的腳色。舉例來說,在某特定時間點備份的 datafiles,可使用在該時間點後備份的 redo logs 來將資料還原至 datafiles 備份時間點後的任一時間。

但由於 redo logs 本身是被循環使用,因此保存 redo logs 是亦是備份的一大要素。在 Oracle 中是透過 archiving 的程序來備份存有資料的 redo logs,亦被稱為 archived redo log files。

* Control Files:包含了資料庫實體結構與狀態的資訊,而這些資訊正是資料庫還原程序所不可或缺的,例如 database checkpoint,current redo log file,datafile header checkpoint。缺少 control file 將會讓整個資料庫還原變的相當困難。

接下來的主題將討論基礎的備份還原程序。

2009年4月1日 星期三

備份還原概論 - 1

一般來講,備份還原意指多種不同保護資料庫的策略與程序,避免資料遺失(Data Loss)以及任何資料遺失後的資料庫重建(Database Reconstructing)。

備份又可被區分為 physical backup(物理備份)與 logical backup(邏輯備份)。

Physical backup 通常是指備份供資料庫儲存與還原的實體檔案,例如 datafile,controlfile 和 archived redo logs。

Logical backup 一般是使用 Oracle export utility 將 logical data(例如:table,index 或是 stored procedures)匯出為 binary 檔案的動作。

通常當我們提到備份還原策略時,主要是以 physical backup 為主,logical backup 為輔。因此在本文內提到的 backup,皆是指 physical backup。

Physical backups 主要又可被區分為兩種:
* Recovery Manager(RMAN):Oracle 提供的整合性備份工具,除了提供備份與還原的功能外,還可以維護歷史性的備份。
* User-Managed Backup:使用者直接使用系統指令(OS commands)與 SQL*Plus 的功能來進行備份還原。相關文章

雖然 Oracle 提供這兩種備份還原方法,但官方建議採用 RMAN 來作為主要方案。因為 RMAN 除了使用上較 User-Managed Backup 容易外,還可建構不同系統間的備份還原以及其他相關應用.

但不論最終是採用 RMAN 或 User-Managed Backup,也應該將 data export 這種 logical backup 做為一種互補性的應用,納入整體的備份策略中。