EXP/IMP 學習(六)

楊奇龍發表於2010-06-28

3.1  相關設定
3.1.1  設定ARCHIVELOG與NONARCHIVELOG模式
重做日誌組是以迴圈方式使用的,重做日誌組會被覆蓋重做日誌資訊就會丟失。為
了儲存歷史以來的重做日誌,資料庫可以執行在日誌歸檔模式下(archivelog mode)。 在日誌歸檔模式下,當日志組撤換到下一個組時後臺程式  ARCn  將上一個日誌檔案復
制到另一個地方(oracle 10g  使用快速恢復區會歸檔到該區)儲存。資料庫預設為非歸檔
模式(noarchivelog mode)。
設定 ARCHIVELOG模式步驟:
1.  關閉資料庫,備份已有的資料,改變資料庫的執行方式是對資料庫的重要改動,所
以要對資料庫做備份,對可能出現的問題作出保護。
2.  修改初試化引數:  使用 PFILE,修改初始化引數檔案 init[SID].ora log_archive_start=true #啟動自動歸檔 log_archive_format=ARC%T%S.arc #歸檔檔案格式 log_archive_dest=/arch12/arch             #歸檔路徑
3.  啟動 Instance 到 Mount狀態,即載入資料庫但不開啟資料庫:
SQL > startup mount;
4.  發出修改命令
SQL > alter database archivelog; SQL > alter database open;
設定 NONARCHIVELOG模式步驟同上,只需修改相應引數值即可。

3.1.2 LOGGING  與  NOLOGGING
表空間、表、索引、分割槽可以設定為  NOLOGGING,用於快速裝入資料(Direct Load)。 在插入資料時只寫入最小的重做日誌和回滾資料。在歸檔資料庫模式下,執行  Direct  Load 操作後應立即進行備份,否則不能使用之前的備份進行恢復。另外,使用者可以設定資料庫的 強制日誌模式,使用所有操作都記入日誌。
LOGGING 與 NOLOGGING  的區別:
LOGGING NOLOGGING
所有的更改寫入 REDO 最小寫入 REDO LOG
從最近備份中完全恢復 不能從最近備份中完全恢復
不需要增加備份 需要增加備份
NOLOGGING  的操作:
CREATE TABLE … NOLOGGING AS SELECT    語句
INSERT /*+APPEND*/    INTO NOLOGGING    SELECT  語句
INSERT /*+ PARALLEL(,)達式*/ INTO NOLOGGING SELECT  語句
SQL*LOADER  的  DIRECT 方法
例:
SQL>CREATE TABLE emp1 NOLOGGING AS SELECT * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;
SQL>INSERT /*+ APPEND */ INTO emp1 NOLOGGING SELECT* * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;
SQL>ALTER DATABASE NO FORCE LOGGING;
3.1.3  歸檔路徑
在歸檔模式下進行自動歸檔時,或者在恢復時設定歸檔所在的位置,需要設定歸檔路徑
初始化引數:
LOG_ARCHIVE_DEST_n=”LOCATION=path MANDATORY|OPTIONAL REOPEN=n”
LOG_ARCHIVE_DEST_n=”SERVICE=standby MANDATORY|OPTIONAL REOPEN=n

3.2 NONARCHIVELOG 模式
3.2.1  離線冷備與恢復
冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的數 據庫。冷備份是將關鍵性檔案複製到另外位置的一種說法。對於備份  Oracle  資訊而言,冷 備份是最快和最安全的方法。
冷備份的優點:
1.是非常快速的備份方法(只需複製檔案)
2.容易歸檔(簡單複製即可)
3.容易恢復到某個時間點上(只需將檔案再複製回去)
4.能與歸檔方法相結合,作資料庫“最新狀態”的恢復。
5.低度維護,高度安全。
冷備份的不足:
1.單獨使用時,只能提供到“某一時間點上”的恢復。
2.在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。也就是說,在
冷備份過程中,資料庫必須是關閉狀態。
3.若磁碟空間有限,只能複製到磁帶等其它外部儲存裝置上,速度會很慢。
4.不能按表或按使用者恢復。
如果可能的話(主要看效率),應將資訊備份到磁碟上,然後啟動資料庫(使使用者可以 工作)並將所備份的資訊複製到磁帶上(複製的同時,資料庫也可以工作)。冷備份中必須 複製的檔案包括:
1.所有資料檔案
2.所有控制檔案
3.所有聯機 REDO LOG 檔案
4.引數化引數 Init.ora 檔案(可選)。
 
3.2.2  案例
1.9i  離線冷備/恢復的例子:
(1)  關閉資料庫
$ sqlplus /nolog
SQL> connect /as sysdba
SQL> shutdown normal;
(2)  用複製命令備份/恢復全部的時間檔案、重做日誌檔案、控制檔案、初始化引數 檔案
SQL > host cp    xx       xx;
 
可以使用以下冷備指令碼:
#!/bin/bash
##############################################################
##    名稱:    coldback_gen.sh
##    功能:  shell 用於生成冷備份指令碼, 進行冷備份同時生成相應的恢復命令
##   可以修改後在生成後立即執行
##############################################################
##設定變數
##設定臨時檔名
tempsql=./backup.sql
##設定備份檔案存放路徑
backdate=`date -u +%Y%m%d`
backupdir=/u04/oracle/coldback/$backdate
 
mkdir $backupdir
##設定備份指令碼檔名
backupsh=$backupdir/coldback.sh
rcvrsh=$backupdir/recovery.sh
echo "正在生成冷備份指令碼[$backupsh]..."
##檢查 ORACLE資料庫是否啟動
oraisrun=`ps -ef|grep -c ora_`
if [ "$oraisrun" = "0" ] || [ "$oraisrun" = "1" ]
then
echo "ORACLE 資料庫尚未啟動,請先啟動 ORACLE"
echo ""
exit
fi
 
##準備工作
echo "set heading off     " > $tempsql
echo "set feedback off   " >>$tempsql
echo "set tab off              " >>$tempsql
echo "set verify off        " >>$tempsql
echo "set pagesize 0"           >>$tempsql
echo "set linesize 800    " >>$tempsql
echo "select '#!/bin/bash' from dual;"          >> $tempsql
echo "select ''                           from dual;"          >> $tempsql
echo  "select  '##  備份指令碼生成時間:  "  `date  +%Y 年%m月%d日-%H:%M:%S`  "'
from dual;" >> $tempsql
echo "select '##  備份目的路徑: $backupdir' from dual; "        >> $tempsql
echo "select '' from dual; " >> $tempsql
 
echo ""
echo "select 'echo ''開始進行離線冷備...''' from dual; "               >> $tempsql
echo "select 'echo ''備份目的路徑: $backupdir ''' from dual; "      >> $tempsql
 
##這裡不直接關閉資料庫,提示使用者手工關閉為好    如果需要直接關閉,請修改
echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql
echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]    ' from dual;" >>$tempsql
echo "select 'then' from dual; " >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'echo ''ORACLE 資料庫已啟動,請先關閉 ORACLE 資料庫'' ' from dual;
" >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'exit' from dual; "      >>$tempsql
echo "select 'fi'       from dual; "      >>$tempsql
 
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo "select 'echo ''正在備份控制檔案...''' from dual; "    >> $tempsql
echo "select 'cp ' ||name||' $backupdir' from v\$controlfile; "    >> $tempsql
echo "select 'echo ''控制檔案備份完畢!''' from dual; "    >> $tempsql
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo "select 'echo ''正在備份資料檔案...''' from dual; "    >> $tempsql
echo "select 'cp ' ||name||' $backupdir' from v\$datafile;      "    >> $tempsql
echo "select 'echo ''資料檔案備份完畢!''' from dual; "    >> $tempsql
echo "select 'echo ''正在備份聯機日誌...''' from dual; "    >> $tempsql
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo "select 'cp '||member||' $backupdir' from v\$logfile;      "    >> $tempsql
echo "select 'echo ''聯機日誌備份完畢!''' from dual;"    >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo ''離線冷備完畢!''' from dual;"    >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
 
##生成冷備份執行指令碼
sqlplus -s ' / as sysdba' < $tempsql > $backupsh
rm -f $tempsql
chmod +x $backupsh
cp $backupsh .
echo "正在生成冷備對應的恢復指令碼[$rcvrsh]..."
##準備工作
echo "set heading off     " > $tempsql
echo "set feedback off   " >>$tempsql
echo "set tab off              " >>$tempsql
echo "set verify off        " >>$tempsql
echo "set pagesize 0"           >>$tempsql
echo "set linesize 800    " >>$tempsql
echo "select '#!/bin/bash' from dual;"          >> $tempsql
echo "select ''                           from dual;"          >> $tempsql
echo  "select  '##  恢復指令碼生成時間:  "  `date  +%Y 年%m月%d日-%H:%M:%S`  "'
from dual;" >> $tempsql
echo "select '##  恢復檔案所在路徑: $backupdir' from dual; "        >> $tempsql
echo "select '' from dual; " >> $tempsql
echo ""
echo "select 'echo ''開始進行檔案的複製恢復...''' from dual; "                >> $tempsql
echo "select 'echo ''恢復檔案所在的路徑: $backupdir ''' from dual; "      >> $tempsql
 
##這裡不直接關閉資料庫,提示使用者手工關閉為好    如果需要直接關閉,請修改
echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql
echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]    ' from dual;" >>$tempsql
echo "select 'then' from dual; " >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'echo ''ORACLE 資料庫已啟動,請先關閉 ORACLE 資料庫'' ' from dual;
" >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'exit' from dual; "      >>$tempsql
echo "select 'fi'       from dual; "      >>$tempsql
 
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo "select 'echo ''正在恢復控制檔案...''' from dual; "    >> $tempsql
echo              "select               'cp              '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,
length(name)-instr(name,'/',-1) )||' '||name from v\$controlfile; "    >> $tempsql
echo "select 'echo ''控制檔案恢復完畢!''' from dual; "    >> $tempsql
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo "select 'echo ''正在恢復資料檔案...''' from dual; "    >> $tempsql
echo              "select               'cp              '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,
length(name)-instr(name,'/',-1) )||' '||name from v\$datafile;      "    >> $tempsql
echo "select 'echo ''資料檔案恢復完畢!''' from dual; "    >> $tempsql
echo "select 'echo ''正在恢復聯機日誌...''' from dual; "    >> $tempsql
echo "select 'echo '' '' ' from dual; "    >> $tempsql
echo           "select            'cp           '||'$backupdir'||'/'||substr(member,instr(member,'/',-1)+1,
length(member)-instr(member,'/',-1) )||' '||member from v\$logfile;        "    >> $tempsql
 
echo "select 'echo ''聯機日誌恢復完畢!''' from dual;"    >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo ''離線冷備恢復完畢!''' from dual;"    >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
 
##生成冷備恢復的執行指令碼
sqlplus -s ' / as sysdba' < $tempsql > $rcvrsh
rm -f $tempsql
chmod +x $rcvrsh
cp $rcvrsh .
echo "生成離線冷備備份與恢復指令碼完畢!"
echo "請檢查指令碼檔案: [$backupsh]"
echo "                                   [$rcvrsh]"
echo ""
#如果需要生成後立即執行備份,可增加關閉資料庫的操作,然後將以一幾行的注
釋#去掉即可
#./$backupsh
#echo "備份執行完畢,請檢查!"
#echo ""
(3)  重啟 Oracle 資料庫
$ sqlplus /nolog
SQL> connect /as sysdba
SQL> startup
2.如果自從上次離線冷備後,資料檔案錯誤,聯機日誌沒有被覆蓋,可模擬不完全恢復。
1. SQL> shutdown;
2. $ cp .. ..;         //  只恢復出錯的資料檔案
3. SQL> startup mount;
4. SQL> recover database;
5. SQL> alter database open;

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-666481/,如需轉載,請註明出處,否則將追究法律責任。