重建物理備庫案例兩則

myownstars發表於2011-09-07

上週末兩個生產庫的物理備庫都出現了問題,週末分別重建了一把,兩庫出的問題一樣,建立的方法也不同,以下是詳細資訊;

 

場景1

備庫b上的監控指令碼失效,從78號就開始與主庫不一致,直到上週末才發現;檢視alertlog,發現archive gap相差很多,且很多在主庫上都已不存在,考慮主庫資料更新比較頻繁,決定重新建立備庫;

但是主庫server磁碟容量有限,此時只剩200g左右,而資料庫大小有600g,使用rman備份來建立備庫不太合適,於是採用rmancopy命令替代;

具體方法為:將備庫關閉,並將其datafile全部刪除;對主庫中的資料檔案,先使用copy命令將其放到磁碟上,然後scp傳輸至備庫,接著刪除磁碟上的copy以騰出磁碟空間,重複這一步驟,直到所有檔案都傳輸至備庫為止;

使用pl/sql生成相應指令碼

declare

begin

  dbms_output.put_line('rman target / ');

  for i in (select file#,name from v$datafile) loop

    dbms_output.put_line('copy datafile '||i.file#||' to ''/data/oracle/copy/'||substr(i.name,instr(i.name,'/',-1,1)+1)||''';');

    dbms_output.put_line('host ''scp /data/oracle/copy/'||substr(i.name,instr(i.name,'/',-1,1)+1)||' *.*.*.*:/data/oracle/oradata/standby'';');

    dbms_output.put_line('host ''rm /data/oracle/copy/'||substr(i.name,instr(i.name,'/',-1,1)+1)||''';');

  end loop;

end;

/

輸出結果如下

rman target /

copy datafile 1 to '/data/oracle/copy/system.dbf';

host 'scp /data/oracle/copy/ system.dbf  *.*.*.*:/data/oracle/oradata/standby';

host 'rm /data/oracle/copy/ system.dbf ';

在主庫開一個screen視窗,執行以上命令,傳輸完畢後即可開始recover備庫

注:

1、從copy第一個資料檔案起生成的redo log都需要儲存完整,備庫recover的時候需要用到

2、執行前需要配置主備庫的ssh使用者等價,否則每次scp都要輸入密碼;

 

場景2

生產庫上的另一套dataguard系統出現archive gap,有別與第一個案例,雖然相應的日誌檔案在主庫也已不存在,但這次發現時間比較早,備庫較之主庫只延遲了兩天,無須推倒重建,在此採用incremental recover的方式恢復備庫。

先確定備庫的current scn,以此在主庫上執行incremental backup,將備份傳至備庫,使用recover noredo方式恢復備庫

具體步驟為:

1

檢視物理備庫的scn

SQL> select to_char(current_scn) from v$database;

 

TO_CHAR(CURRENT_SCN)

----------------------------------------

20032338311

2

在主庫執行incremental備份

run

{allocate channel d1 type disk;

allocate channel d2 type disk;

allocate channel d3 type disk;

allocate channel d4 type disk;

backup as compressed backupset incremental from SCN 20032338311 database format '/data/oracle/backup/rman/standby_%d_%T_%U.bak'

include current controlfile for standby filesperset=5  tag 'FOR STANDBY';

release channel d1;

release channel d2;

release channel d3;

release channel d4;

}

3

將備份集傳輸到備庫的/data/oracle/backup/rman目錄

4

RMAN>catalog start with '/data/oracle/backup/rman';

run {

allocate channel dsk0 type disk;

allocate channel dsk1 type disk;

allocate channel dsk2 type disk;

restore standby controlfile to '/u01/app/oracle/control01.ctl';

recover database noredo;

}

5

關閉standby資料庫

/u01/app/oracle/control01.ctl覆蓋現有的控制檔案

6

啟動物理備庫檢查

SQL> startup mount

SQL> select to_char(current_scn) from v$database;

 

TO_CHAR(CURRENT_SCN)

----------------------------------------

20133423174

SQL> SELECT * FROM V$ARCHIVE_GAP;

 

no rows selected

為備庫增加standby redolog

開啟recover程式

SQL> alter database recover managed standby database disconnect from session using current logfile;

然後觀察alertlog一段時間,確保不會有錯誤發生

7

如果備份用不到了,則現在可以刪除

RMAN> DELETE BACKUP TAG ‘FOR STANDBY’;

 

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

相關文章