顯示具有 OS 標籤的文章。 顯示所有文章
顯示具有 OS 標籤的文章。 顯示所有文章

2009年5月8日 星期五

profile with multiple choice

有時候基於硬體資源上的限制,必須在同一台主機上使用同一帳號來建立不同的環境,以區隔出不同的需求。最常見的例子就是使用 oracle 帳號來建立兩個 / 多個不同的 database,例如 demo1 與 demo2。

通常使用 oracle 帳號登入系統時,只能載入一個預設的 ORACLE_SID 以及其他相對應的環境變數。如需要切換至另一個 database 時,則需另外執行 export ORACLE_SID=demo2 來改變環境變數。

倘若同一機器上有多個環境時,以上的作法不僅增加使用者的負擔,也容易混淆當前的設定。因此,建議的作法是在登入時,在 .profile / .bash_profile 設定登入環境選項,讓使用者可自由選擇所需的作業環境。

以下是 .profile 的簡單範例:
=================================================
echo "請選擇 1) 正式區 ( ORACLE_SID=demo1 ) "
echo " 2) HR區 ( ORACLE_SID=demo2 ) "
echo " 3) 測試區 ( ORACLE_SID=demo3 ) "
echo " *) nothing "
read ans;
case $ans in
1) ORACLE_SID=demo1;export ORACLE_SID
PS1='';export PS1;;
2) ORACLE_SID=demo2;export ORACLE_SID
PS1='';export PS1;;
3) ORACLE_SID=demo3;export ORACLE_SID
PS1='';export PS1;;
*) unset ORACLE_SID
PS1='';export PS1;;
esac
=================================================

當使用者登入時,會有 1、2、3 與 any key 四種選項,當選擇 1 或 2 或 3 時,即會載入該選項下的環境變數,並在 command line 顯示目前所在環境名稱與工作路徑。當選擇其他非 1、2、3 的選項時,則會使用 *) 選項下的環境變數。

若某些環境變數適合應用於所有的選項,則可直接置於 profile 的最上端。

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月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月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年3月25日 星期三

umount device

相信很多人都遇過在linux下要umount某個device時發生"umount: /u01: device is busy" 的錯誤.這個訊息代表要被umount的device正被process使用/user占用中.

此問題通常可用採以下幾個解法:

* 執行 lsof |grep XXX (XXX為要umount的目錄名稱)找出目前佔用此device的ProcessID/user,剔除掉該PID或請user離開該目錄後進行正常umount.

* 執行 fuser -m /dev/sdd1 則更直接的列出佔用此device的PID,剔除掉該PID後進行正常umount.

* 執行 umount -f /dev/sdd1 強制umount

* 若以上指令都無法生效時,就只剩下 umount -l /dev/sdd1 這種暴力umount的指令可以用了.這個指令常用於Networked File System(NFS)的 mount device.

PS: 但正常的作法應該是先停掉nfs service之後就可以umount了.