Oracle級聯備庫0資料丟失--重建控制檔案並應用主庫online redo logfile的啟用方法
尊敬的客戶您好:
一般來說:
- 就像之前更新的那樣,根據級聯備庫的工作原理 - 它只能應用已經歸檔的日誌,因此通常意義上無法做到零資料丟失。
- 要實現零資料丟失,在 12c 上可以通過 far sync 做到對主庫效能影響最小;而在 11.2上則一定會影響主庫效能。
- 通過 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:
-
建立一個主庫: pridb
-
建立一個 real-time apply standby: stdydb
-
建立一個級聯備庫: casdb
-
在主庫上做一些變更
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 這個表
-
把 pridb 和 stdydb 殺死,破壞 datafile 和 controlfile
-
按照客戶提到的思路來操作:
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_* 等