ORACLE之常用FAQ V1.0 (3)

來源:互聯網
上載者:User
oracle 第三部分、備份與恢複
[Q]如何開啟/關閉歸檔
[A]如果開啟歸檔,請保證log_archive_start=true開啟自動歸檔,否則只能手工歸檔,如果是關閉了歸檔,則設定該參數為false
注意:如果是OPS/RAC環境,需要先把parallel_server = true注釋掉,然後執行如下步驟,最後用這個參數重新啟動
1、開啟歸檔
a. 關閉資料庫shutdown immediate
b. startup mount
c. alter database archivelog
d. alter database opne
2、禁止歸檔
a. 關閉資料庫shutdown immediate
b. startup mount
c. alter database noarchivelog
d. alter database open
歸檔資訊可以通過如下語句查看
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination E:\oracle\ora92\database\archive
Oldest online log sequence 131
Next log sequence to archive 133
Current 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 on
begin
dbms_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#) loop
dbms_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#) loop
dbms_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 mount
SQL>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 n
2、如果是當前日誌損壞,一般不能clear,則可能意味著遺失資料
如果有備份,可以採用備份進行不完全恢複
如果沒有備份,可能只能用_allow_resetlogs_corruption=true來進行強制恢複了,但是,這樣的方法是不建議的,最好在有Oracle support的指導下進行。
[Q]怎麼樣建立RMAN恢複目錄
[A]首先,建立一個資料庫使用者,一般都是RMAN,並給予recovery_catalog_owner角色許可權
sqlplus sys
SQL> 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/rman
RMAN> create catalog tablespace tools;
RMAN> exit;
最後,你可以在恢複目錄註冊目標資料庫了
rman catalog rman/rman target backdba/backdba
RMAN> 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 nomount
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 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 ystem01.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 793
ORA-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 internal
SQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
3.重新編譯該包
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=American
2、用類似如下的方法執行
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'));


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。