Oracle異常關閉後謹防資料檔案受損

2021-08-22 03:27:01 字數 2434 閱讀 1425

資料庫是智慧型校園下各類資訊系統的核心組成部分。oracle資料庫憑藉其強大的穩定性和可伸縮性,目前基本是國內所有高校作為軟體平台底層資料倉儲的主流選擇。

正所謂「好馬配好鞍,寶劍贈英雄」,穩定高效的oracle資料庫,自然也對運維人員技術水平和底層硬體執行環境的要求更高,一次意外的停電或乙個儲存磁碟的壞塊,都有可能讓資料庫出錯,進而導致資訊系統罷工,接下來就以一則案例「現身說法」。

問題現象

資料檔案無法讀取導致系統罷工

近期,我們頻頻接到多所高校來電諮詢,均反饋其資料庫的部分資料檔案出現無法讀取的情況,這將直接導致其對應的資訊系統無法使用,影響學校業務開展。問題出現時資料庫後台告警日誌如下,該案例顯示第6號資料檔案無法讀取:

資料庫運維工程師第一時間與現場溝通了解到,系意外斷電導致資料庫異常關閉,再重啟時出現上述問題,這也為後續問題的分析與解決縮小了排查範圍。

問題分析

異常關閉後資料庫都做了什麼

既然在問題產生前,出現過意外斷電導致的資料庫異常關閉現象,那我們就需要了解資料庫在異常關閉到重新啟動的過程中發什麼了什麼事情?同步還需要了解資料庫正常的資料操作及關閉原理,以找出差異和原因所在。

part.1

當我們在進行資料操作的時候,均會產生兩種不同型別的資料:

重做記錄

目的是確保資料庫具有可恢復性

vs

被修改資料塊本身

目的是為了保證資料庫的永續性

oracle規定:保證重作記錄先於對應的髒資料塊寫入永久層(也就是資料庫檔案)

part.2

當資料庫正常關閉與啟動時,資料庫會做三件事:

☑ oracle會發起乙個完全檢查點,此時任何新的變更將不被允許。

☑ dbwn將相對應的髒資料庫寫入資料檔案

part.3

當資料庫異常關閉與啟動時,資料庫做了什麼:

step.1

管理員發出startup命令。

step.2

開啟引數檔案,啟動例項。

step.3

開啟控制檔案。

step.4

step.5

對已經提交事務實施前滾,對沒有寫如資料檔案的髒塊寫進資料檔案。

step.6

開啟資料庫。

step.7

對沒有提交的事務實施回滾,將相當於sql命令中的rollback,將相對應的已經寫入資料檔案的塊給修改掉,完成之後資料檔案中不會存在由於上一次強制關閉而留下的,未提交的髒資料塊。

解決思路

全面檢查日誌以恢復資料檔案

經過上述分析明確故障原因後,其實對症下藥地去排障的思路就相對十分清晰了:

1

全面檢查作業系統和資料庫系統的告警日誌,定位問題發生的根本原因。

2

找出損壞的資料庫檔案,確認其目前的狀態。

3

至此,資料檔案經過恢復後,資料庫同步狀態回歸正常,受影響的資訊系統就可以重新正常訪問了。

專家建議

做好ups與容災備份雙重預防

學校做好以下預防工作:

建設ups不間斷電源並定期檢修

建議學校機房建設ups不間斷電源,並定期對ups進行檢修,有條件的情況下可以每年進行一次機房斷電演練,確保在異常斷電時核心伺服器可以正常執行。

做好容災應急恢復方案

當學校資訊系統遇到嚴重的故障時,比如核心儲存損壞、機房斷電等情況,若沒有整體有效的資料保護與應急恢復方案,學校核心資訊系統將長時間停擺,造成無法估計的損失與嚴重的社會影響。建設資訊系統容災可以在資訊系統發生嚴重故障時快速對資料與系統進行切換與恢復,減少資料丟失的可能性,保證業務連續性。目前比較主流的容災解決方案包括:儲存卷複製技術、磁碟陣列複製技術、資料庫複製技術。

Oracle 9i 資料庫異常關閉後的啟動

正在看的oracle教程是 oracle 9i 資料庫異常關閉後的啟動。oracle 資料庫啟動 oracle shutdown的時候突然斷電,導致使用sql plus啟動時無法連線到資料庫,具體描述為 connection can not permitted,shut in progress.到d...

mongoDB集群異常關閉後重新啟動失敗

問題場景描述 mongodb集群非正常關閉後,重新啟動過程中常見的問題與解決方法總結。該台主機mongodb安裝目錄為 usr local mongodb 三颱主機構成乙個mongo集群,以其中一台主機為例,bin master.conf 配置檔案為 master.conf dbpath data ...

VMware虛擬機器異常關閉後,無法啟動

最近在玩docker,碰到這麼乙個情況,可能是我隨手就把電腦關了,然後虛擬機器就一直黑屏起不來了。網上給的方法都是 cmd msconfig 然後重啟什麼的,太麻煩有的時候還不管是。然後知乎上看的直接cmd 然後輸入 netsh winsock reset 重啟下就好了。netsh winsock ...