挽救DG中主庫的nologging操作的塊
眾所周知我們的Data Guard資料同步是基於日誌流的。所以在主庫執行nologging操作是不被允許的。這也就是為什麼我們需要在配置Data Guard階段需要使用Force Logging。但是這也會帶來很多問題(SQL執行效率),例如:當我們使用資料泵進行遷移時我們希望最少停機時間完成,這時候我們就可能會考慮到以最小日誌匯入的方式以加快匯入速度,然後重新同步備庫。
在一些場景中,我們會去使用nologging操作去節省大量資料插入的時間,而這種操作所帶來的問題就是,如果該庫在有備庫的情況下,因為主庫的nologging插入操作不會生成redo,所以不會在備庫上傳輸和應用,這會導致備庫的資料出現問題。
在Oracle 11g,如果遇到這樣的問題,可以透過在備庫恢復有問題的資料檔案來解決問題,示例如下:
在一個具有主備關係的主庫上將force_logging設定為nologging模式,隨後建立一張表,設定為nologging模式
點選(此處)摺疊或開啟
-
SQL> alter database no force logging;
-
SQL> create table DEMO tablespace users pctfree 99 as select rownum n from xmltable('1 to 1000');
- SQL> alter table DEMO nologging;
之後使用/* +append*/插入資料並提交
點選(此處)摺疊或開啟
-
SQL> insert /*+ append */ into DEMO select rownum n from xmltable('1 to 100000');
- SQL> commit
這時候在備庫對該表進行查詢會看到如下報錯資訊
點選(此處)摺疊或開啟
-
SQL>select count(1) from demo;
-
select count(1) from demo
-
*
-
ERROR at line 1:
-
ORA-01578: ORACLE data block corrupted (file # 4, block # 819)
-
ORA-01110: data file 4: '/data/data1/ORCL2/datafile/o1_mf_users_3ft1e9qb_.dbf'
- ORA-26040: Data block was loaded using the NOLOGGING option
而要修復這個問題,需要將包含缺少的資料的資料檔案從主庫複製到物理備庫。
步驟一
1、查詢主庫
點選(此處)摺疊或開啟
-
SQL> SELECT NAME, UNRECOVERABLE_CHANGE# FROM V$DATAFILE;
-
NAME UNRECOVERABLE_CHANGE#
-
--------------------------------------------------------------------------- ---------------------
-
+DATADG/orcl/datafile/system.270.972381717 0
-
+DATADG/orcl/datafile/sysaux.265.972381717 0
-
+DATADG/orcl/datafile/undotbs1.261.972381717 0
-
+DATADG/orcl/datafile/users.259.972381717 6252054
-
+DATADG/orcl/datafile/example.264.972381807 0
-
+DATADG/orcl/datafile/undotbs2.258.972381927 0
-
+DATADG/orcl/datafile/example.266.972400297 0
- +DATADG/orcl/datafile/ax.268.973612569 0
2、查詢備庫
點選(此處)摺疊或開啟
-
sys@ORCL>SELECT NAME, UNRECOVERABLE_CHANGE# FROM V$DATAFILE;
-
NAME UNRECOVERABLE_CHANGE#
-
--------------------------------------------------------------------------- ---------------------
-
/data/data1/ORCL2/datafile/o1_mf_system_3dt1e9op_.dbf 0
-
/data/data1/ORCL2/datafile/o1_mf_sysaux_3ct1e9nb_.dbf 0
-
/data/data1/ORCL2/datafile/o1_mf_undotbs1_3gt1e9qq_.dbf 0
-
/data/data1/ORCL2/datafile/o1_mf_users_3ft1e9qb_.dbf 5383754
-
/data/data1/ORCL2/datafile/o1_mf_example_3et1e9ps_.dbf 0
-
/data/data1/ORCL2/datafile/o1_mf_undotbs2_3ht1e9r1_.dbf 0
-
/data/data1/ORCL2/datafile/o1_mf_example_3at1e9nb_.dbf 0
- /data/data1/ORCL2/datafile/o1_mf_ax_3bt1e9nb_.dbf 0
3、比較主資料庫和備用資料庫的查詢結果
在兩個查詢結果中比較UNRECOVERABLE_CHANGE#列的值。如果主庫中UNRECOVERABLE_CHANGE#列的值大於備庫中的同一列,則需要將這些資料檔案在備庫恢復。
步驟二
將主庫對應的資料檔案複製至備庫
點選(此處)摺疊或開啟
-
SQL> alter tablespace users begin backup
-
SQL> exit
-
ASMCMD>cp +DATADG/orcl/datafile/users.259.972381717 /tmp
-
$ scp /tmp/users.259.972381717 10.10.60.123:/data/data1/ORCL2/datafile/
- SQL> alter tablespace users end backup
步驟三
備庫將舊的資料檔案rename至新的資料檔案
點選(此處)摺疊或開啟
-
SQL> alter database recover managed standby database cancel;
-
SQL> alter system set standby_file_management=manual; #在備庫執行rename操作時,需要此引數為manual
-
SQL> alter database rename file '/data/data1/ORCL2/datafile/o1_mf_users_3ft1e9qb_.dbf' to '/data/data1/ORCL2/datafile/users.259.972381717';
-
SQL> alter system set standby_file_management=auto;
- SQL> alter database recover managed standby database using current logfile disconnect from session;
之後就可以在備庫查詢到例項表DEMO
點選(此處)摺疊或開啟
-
SQL> select count(1) from demo;
-
COUNT(1)
-
----------
- 101000
對於這種情況,在12.1版本中,RMAN提供了一種便捷的方式讓我們不需要在主庫上進行資料檔案的備份傳輸而可以在備庫使用 restore database (or datafile ) from service去從主庫進行恢復。
當然,Oracle的RMAN是足夠聰明的:如果資料檔案是正常的狀態,RMAN可以根據它們的資料檔案頭進行跳躍恢復。如果,由於nologging操作導致某些塊被標記為損壞的,那麼這部分資料檔案就是需要恢復的,然後怎麼辦?在恢復命令中有FORCE選項。但我們可能並不需要它。因為有些時候資料檔案是同步的,實時日誌應用程式還是在執行的。這個時候,為了恢復,我們需要停止應用。
一旦我們停止了應用,那麼我們就不需要執行RESOTORE DATABASE FORCE操作,因為現在資料檔案的狀態是過舊的,就算你不加FORCE選項RMAN也是不會跳過這些資料檔案的。
步驟一
備庫關掉實時日誌應用,並開啟至mount狀態。
點選(此處)摺疊或開啟
-
SQL> alter database recover managed standby database cancel;
-
SQL> shutdown immediate
-
Database closed.
-
Database dismounted.
-
ORACLE instance shut down.
-
SQL> startup mount
- ORACLE instance started
步驟二
備庫登陸RMAN,使用restore database (or datafile ) from service進行恢復
點選(此處)摺疊或開啟
-
RMAN> restore database from service 'primary_db'; #這裡的primary_db,為備庫至主庫的tns連線串的別名
-
Starting restore at 2018-05-03 17:00:35
-
using target database control file instead of recovery catalog
-
allocated channel: ORA_DISK_1
-
channel ORA_DISK_1: SID=29 device type=DISK
-
channel ORA_DISK_1: starting datafile backup set restore
-
channel ORA_DISK_1: using network backup set from service primary_db
-
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
-
channel ORA_DISK_1: restoring datafile 00001 to /data/data1/ORCL2/datafile/o1_mf_system_02t1t9ck_.dbf
-
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
-
channel ORA_DISK_1: starting datafile backup set restore
-
channel ORA_DISK_1: using network backup set from service primary_db
-
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
-
channel ORA_DISK_1: restoring datafile 00003 to /data/data1/ORCL2/datafile/o1_mf_sysaux_03t1t9d3_.dbf
-
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
-
channel ORA_DISK_1: starting datafile backup set restore
-
channel ORA_DISK_1: using network backup set from service primary_db
-
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
-
channel ORA_DISK_1: restoring datafile 00004 to /data/data1/ORCL2/datafile/o1_mf_undotbs1_04t1t9di_.dbf
-
channel ORA_DISK_1: restore complete, elapsed time: 00:00:02
-
channel ORA_DISK_1: starting datafile backup set restore
-
channel ORA_DISK_1: using network backup set from service primary_db
-
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
-
channel ORA_DISK_1: restoring datafile 00006 to /data/data1/ORCL2/datafile/o1_mf_users_05t1t9dm_.dbf
-
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
- Finished restore at 2018-05-03 17:01:34
當然要記得去起庫並開啟實時日誌應用程式!
而在12.2中,Oracle提供了一種更方便的方式去進行恢復主庫會將未記錄的塊的列表傳送至備庫,並記錄在備庫控制檔案中,我們可以從備庫的v$nonlogged_block這個檢視檢視到相關資訊。不需要傳送主庫的整個資料檔案,而是在RMAN執行一個簡單的命令來恢復它們:
RECOVER DATABASE NONLOGGED BLOCK
步驟一
停止備庫實時日誌應用
點選(此處)摺疊或開啟
- SQL> alter database recover managed standby database cancel;
步驟二
備庫登陸RMAN執行
RECOVER DATABASE NONLOGGED BLOCK
注意:執行此步驟前請確認主備庫的log_archive_config引數已經設定
點選(此處)摺疊或開啟
-
RMAN> recover database nonlogged block;
-
Starting recover at 2018-05-03 14:54:22
-
using target database control file instead of recovery catalog
-
allocated channel: ORA_DISK_1
-
channel ORA_DISK_1: SID=56 device type=DISK
-
starting recovery of nonlogged blocks
-
List of Datafiles
-
=================
-
File Status Nonlogged Blocks Blocks Examined Blocks Skipped
-
---- ------ ---------------- --------------- --------------
-
1 OK 0 0 107519
-
3 OK 0 0 262399
-
4 OK 0 0 149759
-
5 OK 0 0 31999
-
6 OK 0 0 42239
-
7 OK 0 16707 21532
-
8 OK 0 0 12799
-
9 OK 0 0 76799
-
18 OK 0 0 33279
-
19 OK 0 0 57599
-
20 OK 0 0 24959
-
21 OK 0 0 33279
-
22 OK 0 0 51199
-
23 OK 0 0 12799
-
29 OK 0 0 1310719
-
30 OK 0 0 12799
-
31 OK 0 0 33279
-
32 OK 0 0 52479
-
33 OK 0 0 923519
-
34 OK 0 16822 8777
-
35 OK 0 0 12799
-
37 OK 0 0 24959
-
Details of nonlogged blocks can be queried from v$nonlogged_block view
-
recovery of nonlogged blocks complete, elapsed time: 00:00:08
- Finished recover at 2018-05-03 14:54:32
最後別忘了開啟實時日誌應用程式。
綜上來看,12.2中這個特性在資料倉儲等一些場景是可以嘗試的。以往我們開啟force logging造成大量的redo日誌並且影響一部分dml語句的執行效率。在12.2我們可以嘗試使用nonlogging操作去節省大量資料插入的時間,然後在系統空閒時間進行備庫恢復操作。但是注意這種操作也存在弊端,這樣你的備庫的可用性就大大降低了。凡事總有取捨!
| 作者簡介
陳康,沃趣科技資料庫技術專家
主要參與公司產品實施、測試、維護以及最佳化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2154509/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 修復由於主庫NOLOGGING操作引起的備庫ORA-01578和ORA-26040錯誤
- 案例:DG主庫未設定force logging導致備庫壞塊
- DG的切換操作
- 【DATAGUARD】Oracle Dataguard nologging 塊修復Oracle
- 【DG】Data Guard主備庫Failove切換AI
- 【DG】Data Guard主備庫Switchover切換
- Oracle 修復由於主庫NOLOGGING引起的備庫ORA-01578和ORA-26040錯誤Oracle
- ORA-01578和ORA-26040--NOLOGGING操作引起的壞塊-錯誤解釋和解決方案
- [20190225]測試如何使用dg快速主庫.txt
- dg主庫建立檔案備庫未同步解決方法
- Oracle-DG最大保護模式下,dg備庫出現問題對主庫有什麼影響?Oracle模式
- oracle資料庫災難挽救應急方案之DML誤操作恢復Oracle資料庫
- 【DG】Oracle之級聯DG--(cascade dg) --(一主一備一級聯)Oracle
- oracle資料庫災難挽救應急方案之DDL誤操作恢復(drop)Oracle資料庫
- oracle資料庫災難挽救應急方案之DDL誤操作恢復(truncate)Oracle資料庫
- dg切換操作文件
- oracle dg切換操作示例Oracle
- nologging、force logging、supplemental log的理解
- Oracle DG異構主備支援Oracle
- dg和ogg的區別--oracle資料庫Oracle資料庫
- 10G DG最大可用模式下備庫發生故障時主庫保護級別的變化模式
- Mysql 從庫如果有未提交的事務主庫ddl操作導致主從延遲MySql
- 庫的操作
- Nologging對恢復的影響(二)
- Nologging對恢復的影響(一)
- DG使用中遇到的幾個錯誤
- ORACLE DG之備庫角色Oracle
- 物理DG、邏輯DG和快照DG的搭建(視訊講解)
- 【DG】備庫RMAN還原方式搭建DG(不使用duplicate命令)
- 【DG】dg中如何配置多個後臺observerServer
- Oracle:DG 的 switchoverOracle
- DG配置過程中的引數解釋
- XMES合併主分支的操作
- 【DG】Oracle 19c使用dbca來搭建物理DG--主rac備racOracle
- Oracle 11g單主搭建物理DGOracle
- 主鍵的建立、新增、刪除操作
- 在DG備庫備份資料庫並恢復到一個主機上,報錯RMAN-06820資料庫
- 【UP_ORACLE】如何給Oracle DG打補丁(三)主庫安裝補丁步驟Oracle