溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用Oracle修復(fù)ORA-01578和ORA-26040錯誤

發(fā)布時間:2021-11-04 11:06:13 來源:億速云 閱讀:580 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹“怎么用Oracle修復(fù)ORA-01578和ORA-26040錯誤”,在日常操作中,相信很多人在怎么用Oracle修復(fù)ORA-01578和ORA-26040錯誤問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Oracle修復(fù)ORA-01578和ORA-26040錯誤”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

DG數(shù)據(jù)同步是基于日志流的,這也是為什么在配置DG階段需要將主庫設(shè)置為FORCE LOGGING的原因。

但是,這也會帶來很多問題,例如,會導(dǎo)致DML類型的SQL執(zhí)行效率變慢,尤其在大批量數(shù)據(jù)更新或?qū)氲臅r候顯得尤為明顯。

DBA在使用數(shù)據(jù)泵進行遷移時希望在最少停機時間內(nèi)完成,這時候就可能會考慮到以最小日志導(dǎo)入的方式以加快導(dǎo)入速度,

然后重新同步備庫。在這些場景中,DBA可能會使用NOLOGGING操作去節(jié)省大量數(shù)據(jù)插入的時間,

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

所以不會在備庫上傳輸和應(yīng)用,這會導(dǎo)致備庫的數(shù)據(jù)出現(xiàn)問題,報ORA-01578和ORA-26040的錯誤。

模擬測試恢復(fù):

prod為primary database

stddb為standby database

在一個具有主備關(guān)系的主庫上將FORCE_LOGGING設(shè)置為NOLOGGING模式:

SYS@prod>alter database no force logging;

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

進行自插入構(gòu)造數(shù)據(jù)

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;

在備庫執(zhí)行查詢操作:

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

解決辦法:

將包含缺少數(shù)據(jù)的數(shù)據(jù)文件從主庫復(fù)制到物理備庫再重命名數(shù)據(jù)文件來解決問題。

主庫查詢:

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

比較主數(shù)據(jù)庫和備用數(shù)據(jù)庫的查詢結(jié)果:

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

如果主庫中UNRECOVERABLE_CHANGE#列的值大于備庫中的同一列,那么需要將這些數(shù)據(jù)文件在備庫恢復(fù)。

將主庫對應(yīng)的數(shù)據(jù)文件拷貝至備庫:

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;

在備庫上,將舊的數(shù)據(jù)文件RENAME至新的數(shù)據(jù)文件:

由于主備數(shù)據(jù)文件名字相同,將從主庫傳輸過來的數(shù)據(jù)文件改個名

[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;

#在備庫執(zhí)行RENAME操作時,需要此參數(shù)為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

到此,關(guān)于“怎么用Oracle修復(fù)ORA-01578和ORA-26040錯誤”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI