Oracle 修復由於主庫NOLOGGING引起的備庫ORA-01578和ORA-26040錯誤

DBhanG發表於2020-05-29

DG資料同步是基於日誌流的,這也是為什麼在配置DG階段需要將主庫設定為FORCE LOGGING的原因。

但是,這也會帶來很多問題,例如,會導致DML型別的SQL執行效率變慢,尤其在大批量資料更新或匯入的時候顯得尤為明顯。

DBA在使用資料泵進行遷移時希望在最少停機時間內完成,這時候就可能會考慮到以最小日誌匯入的方式以加快匯入速度,

然後重新同步備庫。在這些場景中,DBA可能會使用NOLOGGING操作去節省大量資料插入的時間,

而這種操作所帶來的問題就是,如果該庫在有備庫的情況下,因為主庫的NOLOGGING插入操作不會生成Redo,

所以不會在備庫上傳輸和應用,這會導致備庫的資料出現問題,報ORA-01578和ORA-26040的錯誤。


模擬測試恢復:

prod為primary database

stddb為standby database


在一個具有主備關係的主庫上 將FORCE_LOGGING設定為NOLOGGING模式:

SYS@prod>alter database no force logging;

HR@prod>create table test as select * from employees;

進行自插入構造資料

HR@prod>insert /+APPEND/ into test select * from test;

HR@prod>commit;

HR@prod>insert /+APPEND/ into test select * from test;

HR@prod>commit;

HR@prod>insert /+APPEND/ into test select * from test;

HR@prod>commit;

HR@prod>insert /+APPEND/ into test select * from test;

HR@prod>commit;


在備庫執行查詢操作:

SYS@stddb>select count() from hr.test;

select count() from hr.test

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 4, block # 669)

ORA-01110: data file 4: ‘/u01/app/oracle/oradata/stddb/users01.dbf’

ORA-26040: Data block was loaded using the NOLOGGING option


解決辦法:

將包含缺少資料的資料檔案從主庫複製到物理備庫再重新命名資料檔案來解決問題。


主庫查詢:

SYS@prod>select name,unrecoverable_change# from v$datafile;

/u01/app/oracle/oradata/prod/users01.dbf 1151089


SYS@stddb>select name,unrecoverable_change# from v$datafile;

/u01/app/oracle/oradata/stddb/users01.dbf 0


比較主資料庫和備用資料庫的查詢結果:

在以上兩個查詢結果中,比較UNRECOVERABLE_CHANGE#列的值。

如果主庫中UNRECOVERABLE_CHANGE#列的值大於備庫中的同一列,那麼需要將這些資料檔案在備庫恢復。


將主庫對應的資料檔案拷貝至備庫:


SYS@prod>ALTER TABLESPACE USERS BEGIN BACKUP;

[oracle@service1 prod]$ cp users01.dbf /tmp/

SYS@prod> ALTER TABLESPACE USERS END BACKUP;

[oracle@service1 tmp]$ scp users01.dbf 192.168.1.104:/home/oracle/

SYS@prod>ALTER TABLESPACE USERS END BACKUP;


在備庫上,將舊的資料檔案RENAME至新的資料檔案:

由於主備資料檔名字相同,將從主庫傳輸過來的資料檔案改個名

[oracle@service2 ~]$ mv users01.dbf users02.dbf

[oracle@service2 ~]$ cp users02.dbf /u01/app/oracle/oradata/stddb/


SYS@stddb>alter database recover managed standby database cancel;

SYS@stddb>startup force mount;

SYS@stddb>alter system set standby_file_management=manual;

#在備庫執行RENAME操作時,需要此引數為MANUAL

SYS@stddb>alter database rename file ‘/u01/app/oracle/oradata/stddb/users01.dbf’ to ‘/u01/app/oracle/oradata/stddb/users02.dbf’;


SYS@stddb>alter system set standby_file_management=auto;

SYS@stddb>alter database open;

SYS@stddb>alter databsae recover managed standby database using current logfile disconnect from session;


SYS@stddb>select count(*) from hr.test;

 COUNT(*)

  1712


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

相關文章