第三部分、備份與恢複[Q]如何開啟/關閉歸檔[A]如果開啟歸檔,請保證log_archive_start=true開啟自動歸檔,否則只能手工歸檔,如果是關閉了歸檔,則設定該參數為false注意:如果是OPS/RAC環境,需要先把parallel_server = true注釋掉,然後執行如下步驟,最後用這個參數重新啟動1、開啟歸檔a. 關閉資料庫shutdown immediateb. startup mountc. alter database archivelogd. alter database opne2、禁止歸檔a. 關閉資料庫shutdown immediateb. startup mountc. alter database noarchivelogd. alter database open歸檔資訊可以通過如下語句查看SQL> archive log listDatabase log mode Archive ModeAutomatic archival EnabledArchive destination E:\oracle\ora92\database\archiveOldest online log sequence 131Next log sequence to archive 133Current log sequence 133[Q]怎樣設定定時歸檔[A]9i以上版本,保證歸檔的最小間隔不超過n秒設定Archive_lag_target = n單位:秒 範圍:0~7200[Q]不同版本怎麼匯出/匯入[A]匯出用低版本,匯入用目前的版本如果版本跨越太大,需要用到中間版本過渡[Q]不同的字元集之前怎麼導資料[A]a.前條件是保證匯出/匯入符合其他字元集標準,如客戶環境與資料庫字元集一致。b.修改dmp檔案的2、3位元組為目標資料庫的字元集,注意要換成十六進位。參考函數(以下函數中的ID是十進位的):nls_charset_name 根據字元集ID獲得字元集名稱nls_charset_id 根據字元集名稱獲得字元集ID[Q]怎麼樣備份控制檔案[A]再線備份為一個二進位的檔案alter database backup controlfile to '$BACKUP_DEPT/controlfile.000' [reuse];備份為文字檔方式alter database backup controlfile to trace [resetlogs|noresetlogs];[Q]控制檔案損壞如何恢複[A]1、如果是損壞單個控制檔案只需要關閉資料庫,拷貝一個好的資料檔案覆蓋掉壞的資料檔案即可或者是修改init.ora檔案的相關部分2、如果是損失全部控制檔案,則需要建立控制檔案或從備份恢複建立控制檔案的指令碼可以通過alter database backup controlfile to trace擷取。[Q]怎麼樣熱備份一個資料表空間[A]Alter tablespace 名稱 begin backup;host cp 這個資料表空間的資料檔案 目的地;Alter tablespace 名稱 end backup;如果是備份多個資料表空間或整個資料庫,只需要一個一個資料表空間的操作下來就可以了。[Q]怎麼快速得到整個資料庫的熱備指令碼[A]可以寫一段類似的指令碼SQL>set serveroutput onbegindbms_output.enable(10000);for bk_ts in (select distinct t.ts#,t.name from v$tablespace t,v$datafile d where t.ts#=d.ts#) loopdbms_output.put_line('--'||bk_ts.name);dbms_output.put_line('alter tablespace '||bk_ts.name||' begin backup;');for bk_file in (select file#,name from v$datafile where ts#=bk_ts.ts#) loopdbms_output.put_line('host cp '||bk_file.name||' $BACKUP_DEPT/');end loop;dbms_output.put_line('alter tablespace '||bk_ts.name||' end backup;');end loop;end;/[Q]丟失一個資料檔案,但是沒有備份,怎麼樣開啟資料庫[A]如果沒有備份只能是刪除這個資料檔案了,會導致相應的資料丟失。SQL>startup mount--ARCHIVELOG模式命令SQL>Alter database datafile 'file name' offline;--NOARCHIVELOG模式命令SQL>Alter database datafile 'file name' offline drop;SQLl>Alter database open;注意:該資料檔案不能是系統資料檔案[Q]丟失一個資料檔案,沒有備份但是有該資料檔案建立以來的歸檔怎麼恢複[A]保證如下條件a. 不能是系統資料檔案b. 不能丟失控制檔案如果滿足以上條件,則SQL>startup mountSQL>Alter database create datafile 'file name' as 'file name' size ... reuse;SQL>recover datafile n; -檔案號或者SQL>recover datafile 'file name';或者SQL>recover database;SQL>Alter database open;[Q]聯機日誌損壞如何恢複[A]1、如果是非當前日誌而且歸檔,可以使用Alter database clear logfile group n來建立一個新的記錄檔如果該日誌還沒有歸檔,則需要用Alter database clear unarchived logfile group n2、如果是當前日誌損壞,一般不能clear,則可能意味著遺失資料如果有備份,可以採用備份進行不完全恢複如果沒有備份,可能只能用_allow_resetlogs_corruption=true來進行強制恢複了,但是,這樣的方法是不建議的,最好在有Oracle support的指導下進行。[Q]怎麼樣建立RMAN恢複目錄[A]首先,建立一個資料庫使用者,一般都是RMAN,並給予recovery_catalog_owner角色許可權sqlplus sysSQL> create user rman identified by rman;SQL> alter user rman default tablespace tools temporary tablespace temp;SQL> alter user rman quota unlimited on tools;SQL> grant connect, resource, recovery_catalog_owner to rman;SQL> exit;然後,用這個使用者登入,建立恢複目錄rman catalog rman/rmanRMAN> create catalog tablespace tools;RMAN> exit;最後,你可以在恢複目錄註冊目標資料庫了rman catalog rman/rman target backdba/backdbaRMAN> register database;[Q]怎麼樣在恢複的時候移動資料檔案,恢複到別的地點[A]給一個RMAN的例子run {set until time 'Jul 01 1999 00:05:00';allocate channel d1 type disk;set newname for datafile '/u04/oracle/prod/sys1prod.dbf'to '/u02/oracle/prod/sys1prod.dbf';set newname for datafile '/u04/oracle/prod/usr1prod.dbf'to '/u02/oracle/prod/usr1prod.dbf';set newname for datafile '/u04/oracle/prod/tmp1prod.dbf'to '/u02/oracle/prod/tmp1prod.dbf';restore controlfile to '/u02/oracle/prod/ctl1prod.ora';replicate controlfile from '/u02/oracle/prod/ctl1prod.ora';restore database;sql "alter database mount";switch datafile all;recover database;sql "alter database open resetlogs";release channel d1;}[Q]怎麼從備份片(backuppiece)中恢複(restore)控制檔案與資料檔案[A]可以使用如下方法,在RMAN中恢複備份片的控制檔案restore controlfile from backuppiecefile;如果是9i的自動備份,可以採用如下的方法restore controlfile from autobackup;但是,如果控制檔案全部丟失,需要指定DBID,如SET DBID=?自動備份控制檔案的預設格式是%F,這個格式的形式為c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII就是DBID至於恢複(restore)資料檔案,oracle 816開始有個包dbms_backup_restore在 nomount 狀態下就可以執行,可以讀 815甚至之前的備份片,讀出來的檔案用於恢複可以在SQLPLUS中運行,如下SQL>startup nomountSQL> DECLARE2 devtype varchar2(256);3 done boolean;4 BEGIN5 devtype := dbms_backup_restore.deviceallocate('', params=>'');6 dbms_backup_restore.restoresetdatafile;7 dbms_backup_restore.restorecontrolfileto('E:\Oracle\oradata\penny\control01.ctl');8 dbms_backup_restore.restoreDataFileto(1,'E:\Oracle\oradata\penny\system01.dbf');9 dbms_backup_restore.restoreDataFileto(2,'E:\Oracle\oradata\penny\UNDOTBS01.DBF');10 dbms_backup_restore.restoreDataFileto(3,'E:\ORACLE\ORADATA\PENNY\USERS01.DBF');11 dbms_backup_restore.restorebackuppiece('D:\orabak\BACKUP_1_4_04F4IAJT.PENNY',done=>done);12 END;13 /PL/SQL 過程已成功完成。SQL> alter database mount;[Q]Rman的format格式中的%s類似的東西代表什麼意義[A]可以參考如下%c 備份片的拷貝數%d 資料庫名稱%D 位於該月中的第幾天 (DD)%M 位於該年中的第幾月 (MM)%F 一個基於DBID唯一的名稱,這個格式的形式為c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII為該資料庫的DBID,YYYYMMDD為日期,QQ是一個1-256的序列%n 資料庫名稱,向右填補到最大八個字元%u 一個八個字元的名稱代表備份組與建立時間%p 該備份組中的備份片號,從1開始到建立的檔案數%U 一個唯一的檔案名稱,代表%u_%p_%c%s 備份組的號%t 備份組時間戳記%T 年月日格式(YYYYMMDD)[Q]執行exec dbms_logmnr_d.build('Logminer.ora','file directory'),提示下標超界,怎麼辦[A]完整錯誤資訊如下,SQL> exec dbms_logmnr_d.build('Logminer.ora','file directory')BEGIN dbms_logmnr_d.build('Logminer.ora','file directory'); END;*ERROR 位於第 1 行:ORA-06532: 下標超出限制ORA-06512: 在"SYS.DBMS_LOGMNR_D", line 793ORA-06512: 在line 1解決辦法為:1.編輯位於"$ORACLE_HOME/rdbms/admin"目錄下的檔案"dbmslmd.sql"改變行:TYPE col_desc_array IS VARRAY(513) OF col_description;為TYPE col_desc_array IS VARRAY(700) OF col_description;並儲存檔案2. 運行改變後的指令碼SQLPLUS> Connect internalSQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql3.重新編譯該包SQLPLUS> alter package DBMS_LOGMNR_D compile body;[Q]執行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:無效的月份,這個是什麼原因[A]我們分析start_logmnr包PROCEDURE start_logmnr(startScn IN NUMBER default 0 ,endScn IN NUMBER default 0,startTime IN DATE default TO_DATE('01-jan-1988','DD-MON-YYYY'),endTime IN DATE default TO_DATE('01-jan-2988','DD-MON-YYYY'),DictFileName IN VARCHAR2 default '',Options IN BINARY_INTEGER default 0 );可以知道,如果TO_DATE('01-jan-1988','DD-MON-YYYY')失敗,將導致以上錯誤所以解決辦法可以為1、Alter session set NLS_LANGUAGE=American2、用類似如下的方法執行execute dbms_logmnr.start_logmnr (DictFileName=> 'f:\temp2\TESTDICT.ora', starttime => TO_DATE('01-01-1988','DD-MM-YYYY'), endTime=>TO_DATE('01-01-2988','DD-MM-YYYY'));