1. 程式人生 > 實用技巧 >Oracle級聯備庫0資料丟失--重建控制檔案並應用主庫online redo logfile的啟用方法

Oracle級聯備庫0資料丟失--重建控制檔案並應用主庫online redo logfile的啟用方法

尊敬的客戶您好:

一般來說:

  1. 就像之前更新的那樣,根據級聯備庫的工作原理 - 它只能應用已經歸檔的日誌,因此通常意義上無法做到零資料丟失。
  2. 要實現零資料丟失,在 12c 上可以通過 far sync 做到對主庫效能影響最小;而在 11.2上則一定會影響主庫效能。
  3. 通過 real-time apply 的方式,11.2的備庫可以做到僅丟失很少資料(但不能是級聯型別的備庫)

不過通過上一個更新中的 Test Case,我們驗證了您提到的方式-在級聯備庫中應用主庫的online redo logfile,也可以做到零資料丟失。
具體的測試步驟您可以參考上一個 ODM Test Case 的更新。

Thank you, Feng Gao, Oracle Customer Services

Oracle Support	- Sunday		[ODM Test Case]

Test Case:

  1. 建立一個主庫: pridb

  2. 建立一個 real-time apply standby: stdydb

  3. 建立一個級聯備庫: casdb

  4. 在主庫上做一些變更

conn feng/feng
drop table test4 purge

備庫可以很快就看到變更

SQL> select * from tab;

TNAME TABTYPE CLUSTERID


TEST TABLE
TEST2 TABLE <===備庫上已經沒有 test4 這個表了

但是級聯備庫必須要等備庫的standby redo log切換才能看到這個變更
所以仍能看到表test4

SQL> select * from tab;

TNAME TABTYPE CLUSTERID


TEST TABLE
TEST2 TABLE
TEST4 TABLE <===級聯備庫上還可以看到 test4 這個表

  1. 把 pridb 和 stdydb 殺死,破壞 datafile 和 controlfile

  2. 按照客戶提到的思路來操作:

a). 在級聯備庫上生成一個建立 controlfile 的命令並停掉級聯備庫

SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

生成的trace會生成兩種重建 controlfile 的命令,我們使用第一種 Set #1. NORESETLOGS case 的模式。
因為我們知道主庫的最新的 redo log 還在,並且要應用在級聯備庫上,所以不需要 resetlogs

接下來停掉級聯備庫

b). 然後把當前級聯備庫上的 controlfile 重新命名,我們稍後需要重建它

mv /data01/casdb/control01.ctl /data01/casdb/control01.ctl.bak

c). 然後把當前級聯備庫上的 redo log 重新命名,我們稍後會使用主庫的 online log 來替代它們

bash-4.1$ mv casdbredo01.log casdbredo01.log.bak
bash-4.1$ mv casdbredo02.log casdbredo02.log.bak
bash-4.1$ mv casdbredo03.log casdbredo03.log.bak

d). 把主庫的 online log 拷貝到級聯備庫的redolog 所在的目錄

e). 按照步驟 a) 得到的第一部分"Set #1. NORESETLOGS case "裡重建 controlfile 的命令來啟動資料庫

SQL> STARTUP NOMOUNT
ORACLE instance started.

Total System Global Area 784998400 bytes
Fixed Size 2257352 bytes Variable Size 515903032 bytes
Database Buffers 264241152 bytes
Redo Buffers 2596864 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "PRIDB" NORESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/data01/casdbredo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/data01/casdbredo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/data01/casdbredo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
-- GROUP 4 '/data01/casdbstandby_redo04.log' SIZE 50M BLOCKSIZE 512,
-- GROUP 5 '/data01/casdbstandby_redo05.log' SIZE 50M BLOCKSIZE 512,
-- GROUP 6 '/data01/casdbstandby_redo06.log' SIZE 50M BLOCKSIZE 512,
-- GROUP 7 '/data01/casdbstandby_redo07.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/data01/casdbsystem01.dbf',
'/data01/casdbsysaux01.dbf',
'/data01/casdbundotbs01.dbf',
'/data01/casdbusers01.dbf',
'/data01/casdbtbs1',
'/data01/casdbtbs1_1.dbf',
'/data01/casdbtbs1_2.dbf',
'/data01/casdbtbs1_3.dbf'
CHARACTER SET AL32UTF8
;

Control file created.

SQL> RECOVER DATABASE <===然後 recover database
Media recovery complete.
SQL> ALTER SYSTEM ARCHIVE LOG ALL;

System altered.

SQL> ALTER DATABASE OPEN; <===然後 open database

Database altered.

f). 在級聯備庫上驗證之前主庫剛做的變更是否已經可以看到了

SQL> conn feng/feng
Connected.
SQL> select * from tab;

TNAME TABTYPE CLUSTERID


TEST TABLE
TEST2 TABLE <===主庫拷過來的redo已經被應用了

結論:重建controlfile後並把主庫的online redo logfile 拷貝到級聯備庫,就沒有資料丟失了

g). 這樣做完之後,還要梳理一下級聯備庫中的初始化引數,比如

重新 review db_file_name_convert, LOG_ARCHIVE_DEST_* 等