一個閃回區報警的資料恢復(r11筆記第63天)
今天在火車上接到一個電話說,資料庫有個報警,讓我看看是怎麼回事。
看著報警資訊一直重複出現,看來是有些問題了。
這是一個統計庫,出現了DG相關的報警(自定義配置的),看起來是備庫端接收歸檔的時候出現了問題。
Error 270 creating remote archivelog file 'sgstatdb3'
我們知道備庫端其實是有一個80%的閾值控制閃回區的,當時限於在火車上,網路,訊號不順暢,所以讓同事幫忙看了下,大體是說閃回區滿了,但是系統層面設定了crontab定期去刪除歸檔,每個小時會觸發一次。
這樣聽起來閃回區依舊滿好像也沒有道理啊。我聯絡其之前碰到的類似問題,大體有幾個猜測,一個是發生了SQL的效能問題,導致產生了大量的歸檔,導致閃回區使用率暫時還恢復不過來。另外一種就是閃回區設定太小,一些例行操作可能短時間生成歸檔,閃回區還一時應付不過來。
結果沒過一會,我發現自己的設想都不對,那是什麼問題呢。
首先嚐試手工執行定時任務指令碼來刪除過期歸檔,竟然丟擲了警告。
RMAN-08120: WARNING: archived log not deleted, not yet applied by standby
archived log file name=+ARCH/sgstatdb3/archivelog/2017_01_31/thread_1_seq_176745.384.934727315 thread=1 sequence=176745
我們在RMAN中設定了歸檔的刪除策略是必須要應用到備庫之後才可以刪除。所以目前基本斷定應該是在之前出現了一個斷點。
接著檢視資料庫日誌發現近期的歸檔接收都是沒有問題的,最新的歸檔都傳輸過來了,最後歸檔滿了,新的歸檔接收不了了。
原本的ADG現在狀態是READ ONLY了。SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY 那麼我們就需要找到之前是在哪個時間點出現了斷點。
我讀到了下面的一段日誌內容,原來是在之前的一個時間點建立資料檔案的時候報錯了。
Datafile #872: '+DATA/sgstatdb3/datafile/tlbb_data.1197.933781165'
Fri xxx 15:41:40 2017
Errors in file /U01/app/oracle/diag/rdbms/sgstatdb3/statdb2/trace/statdb2_pr00_28125.trc:
ORA-01119: error in creating database file '+data'
ORA-17502: ksfdcre:4 Failed to create file +data
ORA-15041: diskgroup "DATA" space exhausted
File #873 added to control file as 'UNNAMED00873'.
Originally created as:
'/U01/app/oracle/oradata/statdb29/tlbb_data16.dbf'
Recovery was unable to create the file as a new OMF file.
MRP0: Background Media Recovery terminated with error 1274
Errors in file /U01/app/oracle/diag/rdbms/sgstatdb3/statdb2/trace/statdb2_pr00_28125.trc:
ORA-01274: cannot add datafile '/U01/app/oracle/oradata/statdb29/tlbb_data16.dbf' - file could not be created
Managed Standby Recovery not using Real Time Apply
Recovery interrupted!
透過這段日誌可以看出,建立資料檔案其實是這樣一個動作,建立的時候空間慢了無法建立就會生成一個控制程式碼,會預設在$ORACLE_HOME/dbs下生成。
我在備庫端檢視的情況如下:
SQL> select name from v$datafile where file#=873;
/U01/app/oracle/product/11.2.3/db_1/dbs/UNNAMED00873
檔案管理的設定如下:
SQL> show parameter standby_file_management
NAME TYPE VALUE
------------------------------------ ----------- --------
standby_file_management string AUTO當然問題的原因到底是什麼呢,是磁碟組的裡出現了問題,備庫端使用了ASM,才兩個磁碟組,資料檔案的磁碟組剩餘16G左右,而歸檔所在的磁碟組剩餘56M,而問題的原因是在哪裡呢。是在資料檔案的磁碟組+DATA上。
NAME TOTAL_MB FREE_MB
----------------- ----------
ARCH 204800 56
DATA 6383104 16214
這個問題該怎麼解釋呢,因為主庫建立一個資料檔案,大概是30G,這個操作會對映到備庫,也會在備庫建立一個30G的資料檔案,唯一的不同是資料檔名可以根據對映規則不同,但是在主庫中空間充足,建立沒有問題,在備庫資料檔案所在的磁碟組滿了,建立不了一個30G的檔案,所以這個操作就會生成一個斷點,導致MRP直接異常退出,而我們設定的歸檔刪除策略是保證歸檔應用到備庫才可以刪除,所以閃回區就會越放越滿,直到幾百GB的空間都滿了。
問題原因已經說明清楚了,接下來該怎麼處理呢。這就是一個不太常規的思路了。我們就得做減法。備庫空間不足,目前還無法直接擴容,所以問題處理的空間就有一定的侷限性。
我們知道主庫和備庫其實是有一些檔案是不同的,比如temp檔案,主庫為30G,備庫為1G也沒有問題,是一種外掛式的功能,而且不是必須的。所以要緊縮空間,temp就是一個首要考慮的選擇,如果空間還不夠怎麼辦,我們直接resize檔案是不行的,因為主庫resize的操作得等到之前的變更在備庫應用完成之後才可以。那麼還有哪些檔案是可以暫時可清理,來應急處理這個問題呢。還有就是standby logfile了。一般是建議2*n+1的公式,我們可以在這個情況下先刪掉幾組,把空間先省出來,後續再調整。簡單來說就是刪temp檔案,刪除部分備庫日誌檔案。
SQL> alter tablespace temp drop tempfile '+DATA/sgstatdb3/tempfile/temp.910.840550051';
Tablespace altered
.刪除備庫日誌檔案,如果報錯,可以使用如下的方式處理。
SQL> alter database drop logfile group 26;
alter database drop logfile group 26
*
ERROR at line 1:
ORA-01624: log 26 needed for crash recovery of instance statdb2 (thread 1)
ORA-00312: online log 26 thread 1: '+DATA/sgstatdb3/onlinelog/group_26.907.840501783'
ORA-00312: online log 26 thread 1: '+DATA/sgstatdb3/onlinelog/group_26.908.840501785'
這樣處理即可。
SQL> alter database clear unarchived logfile group 26;
Database altered.
SQL> alter database drop standby logfile group 26;
Database altered.
然後使用如下的方式重置資料檔案,比如下面的例子:
alter database create datafile '/U01/app/oracle/product/11.2.3/db_1/dbs/UNNAMED00874' as '+DATA/sgstatdb3/datafile/tlbb_data17.dbf';
然後重新開啟日誌應用,但是發現RMAN開始不聽話了。
$ rman target /
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-00604: error occurred at recursive SQL level 1
ORA-01219: database not open: queries allowed on fixed tables/views only
ORA-06508: PL/SQL: could not find program unit being called: "SYS.X$DBMS_BACKUP_RESTORE"
ORA-06512: at line 1
RMAN-04015: error setting target database character set to ZHS16GBK
看錯誤是在x$的一個物件上過不去了。這個時候簡單想想x$是記憶體表,是在資料庫啟動的過程中初始化的,我們可以採用如下的策略來解決。
先讓MRP開啟歸檔日誌應用,應用一部分歸檔,然後重啟資料庫到Mount狀態,開啟RMAN清理。這樣閃回區的問題就解決了,都得算計著用空間。
就這樣花了個把小時的時間,問題總算是順利解決了。
----------------------------------------------------------------------------------------
最後發起一個小活動,最近讀了一些書,也交了一些書友,如果有願意一起來參與讀書的小夥伴們,我們們一起來吧,不限職業年齡,要求只有一個,喜愛讀書即可。當然入群要推薦一本書。
因為微信群掃碼已滿,需要加入的同學可以加我微信 jeanron100,說明來意和你推薦的一本書即可,我來加你入群。
沒啥目的,沒啥動機,讀書的事情我就不強求了,豐富自己,也可以互相聊聊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2133002/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 閃回區報警引發的效能問題分析(r11筆記第11天)筆記
- 閃回恢復一個表中的資料
- 關於閃回區溢位導致的資料hang(r11筆記第12天)筆記
- Oracle資料庫的閃回恢復區Oracle資料庫
- 閃回資料庫不是“萬金油”(r11筆記第73天)資料庫筆記
- 【備份恢復】閃回資料庫(一)閃回資料庫的管理資料庫
- 一個細小問題觸發的報警(r11筆記第68天)筆記
- Oracle閃回恢復區Oracle
- 閃回原理測試(二)(r11筆記第23天)筆記
- (f)--閃回恢復區---實踐2---閃回表(閃回DML部分資料會用到閃回查詢)
- Orcale利用閃回功能恢復資料
- Oracle -- 閃回恢復區---實踐1---閃回庫Oracle
- Oracle閃回原理-Logminer解讀redo(r11筆記第17天)Oracle筆記
- 【備份恢復】閃回資料庫(五)RMAN 命令列閃回資料庫資料庫命令列
- 【備份恢復】閃回資料庫(二) 基於 SCN 閃回資料庫資料庫
- 閃回查詢恢復誤刪資料
- oralce恢復誤刪除的表中的資料(閃回、閃回查詢)
- Oracle閃回刪除恢復誤刪資料Oracle
- 兩個資料庫的問題(r11筆記第4天)資料庫筆記
- 【備份恢復】閃回資料庫(三)基於時間戳閃回資料庫資料庫時間戳
- Oracle10g閃回恢復區詳解--開啟,設定閃回區Oracle
- Oracle閃回功能恢復偶然丟失的資料(轉)Oracle
- 使用閃回查詢恢復誤刪除的資料
- 用Oracle閃回功能恢復偶然丟失的資料Oracle
- 【備份恢復】閃回資料庫(四)基於可靠還原點閃回資料庫資料庫
- Oracle閃回查詢恢復delete刪除資料Oracledelete
- Oracle資料庫的閃回恢復區及多歸檔路徑的設定Oracle資料庫
- Oracle10g閃回恢復區詳解Oracle
- (f)--閃回恢復區-- 並行載入對閃庫的影響並行
- 循序漸進oracle第8章:Oracle的閃回特性之恢復truncate刪除表的資料Oracle
- 一個關於資料庫閃回區問題的處理資料庫
- 【備份恢復】 閃回技術之閃回刪除
- MySQL誤運算元據恢復的簡單實踐(r11筆記第67天)MySql筆記
- Oracle DBA2 ---- 閃回恢復Oracle
- 閃回查詢恢復過程
- (f)--閃回恢復區---實踐3---閃回查詢(基於AUM (auto undo managemet))
- 【備份恢復】閃回技術之閃回版本查詢
- oracle 閃回基於時間的恢復Oracle