金 鑫,閆龍川,劉 軍,耿 亮
(1. 國家電網公司信息通信分公司,北京 100761;2. 全球能源互聯網集團有限公司,北京 100031)
面向企業級數據庫的故障分析及運維研究:以Oracle數據庫為例
金 鑫1,閆龍川1,劉 軍1,耿 亮2
(1. 國家電網公司信息通信分公司,北京 100761;2. 全球能源互聯網集團有限公司,北京 100031)
數據庫是信息系統的核心組件,數據庫故障是信息系統故障的主要因素,數據庫運維是信息系統運行維護工作的重點。基于Oracle數據庫的架構分析和故障機理深層次研究,創新性提出故障原因分類體系,提出實用運維操作方法,給出數據庫故障典型案例,為信息系統運維工作人員做好數據庫運維工作的提供系統方法論。
Oracle;數據庫故障;診斷分析
數據庫承擔數據的存儲、讀取等功能,是信息系統重要組成部分,數據庫故障可能導致信息系統癱瘓,對企業運營和安全生產的威脅極大,數據丟失可能會對企業造成不可挽回的影響。對某大型企業近年來發生的信息系統故障進行粗略統計,發現數據庫故障占比最高,因此數據庫性能是信息系統運維人員關注的焦點[1-2]。本文結合數據庫組成架構和故障機理的深入研究,總結出數據庫故障原因分類體系,提出數據庫實用的性能監控、故障處理等運維操作,給出典型故障場景及解決方法,對于企業信息系統運維人員進行數據庫故障快速診斷處置具有重要參考價值。
Oracle數據庫是當前使用最為廣泛的大型數據庫之一[3-4],其體系結構主要包括內存結構、進程結構、文件系統、存儲結構等,如圖1。
數據庫內存主要由系統全局區 SGA(System Global Area)和程序全局區PGA(Program Global Area)和軟件代碼區構成[5]。SGA主要包括共享池(SharedPool)、數據緩沖區(Database Buffer Cache)和日志緩沖區(Redo Log Buffer)、大型池(Large Pool)、Java池(Java Pool)、流池(Streams Pool)和其他結構(如固定SGA、鎖管理)等。PGA主要包括棧、游標和用戶會話數據等。
數據庫后臺進程主要包括系統監控進程(SMON)、進程監控進程(PMON)、數據庫寫進程(DBWn)、日志寫進程(LGWR)、檢查點進程(CKPT)、全局隊列監控進程(LMON)、歸檔進程(ARCH)、封鎖進程(LCKn)、分布式數據庫恢復進程(RECO)等。
數據庫存儲信息主要依靠控制文件、日志文件、數據文件[6]。數據庫表空間可以存儲數據文件,數據庫默認存在 6個表空間,分別是 EXAMPLE、SYSAUX、SYSTEM、TEMP、UNDOTBS1、USERS。
數據庫中使用事務和鎖保證數據庫中數據一致性,防止出現錯誤數據。事務是一組包含一條或多條語句的邏輯單元[7],為實現事務之間的并發執行,引入鎖機制。鎖按照模式分為排他鎖和共享鎖,按照作用對象分為DML鎖(分為行級鎖和表級鎖)、DDL鎖、內部閂鎖。某些情況下,由于占用資源不及時釋放,造成鎖等待,嚴重影響數據庫性能。特殊情況下,兩個會話互相占用資源,會造成死鎖。
2.1 數據庫故障原因分類
經過對大量企業數據庫故障案例的分析總結,將數據庫故障原因分為性能原因、SQL語句設計原因、參數配置原因、網絡原因、運行原因、軟件bug原因、硬件原因等。
2.1.1 性能原因
性能原因[8],是指數據庫設計的資源容量與實際承載的業務量不匹配引起的數據庫故障,是最為普遍的情況,此類問題主要是由于對業務量需求評估不準確或未隨用戶需求進行動態擴容造成,主要體現在訪問連接數、進程、內存、I/O、表空間、日志空間、鎖等方面[9-10]。具體情況主要包括:連接數資源不足造成應用程序無法與數據庫建立連接,導致用戶無法使用數據庫;數據庫創建進程需要內存、CPU、I/O等資源支持,CPU、內存、I/O等資源不足導致進程執行緩慢甚至中止,嚴重時數據庫自動關閉或保護性自動重啟;表空間或歸檔空間不足、磁盤空間不足等造成數據庫響應緩慢甚至自動關閉等。
2.1.2 SQL語句設計原因
SQL語句設計原因,是指因SQL查詢語句低效或SQL查詢語句設計考慮不周引起的數據庫故障,也是較為常見的情況,此類問題主要是由于建設期間代碼設計不合理造成。具體情況主要包括:SQL語句效率低下、未建立表索引、對大數據量表進行全表掃描等情況造成 SQL語句消耗大量的數據庫內存、I/O等資源,或產生進程鎖等待,數據庫性能快速下降造成數據庫響應緩慢或自動關閉;SQL查詢語句執行時間過長,應用程序不能及時釋放與數據庫的連接,導致連接數被占滿,應用程序無法再與數據庫新建連接;SQL語句錯誤導致發生循環產生日志文件等異常情況,造成磁盤空間快速被占滿,數據庫自動關閉;SQL語句未能屏蔽用戶輸入的錯誤字符,導致用戶輸入非法字符時,數據庫運行崩潰等。
2.1.3 參數配置原因
參數配置原因,是指由于參數等配置不恰當引起的數據庫故障,也是較為常見的情況,此類問題主要是由于運維工作不到位造成,主要包括賬號權限、密碼期限、license、環境變量、SCN headroom值等配置錯誤。具體情況主要包括:數據庫的密碼變更,但操作系統、應用程序中的策略未同步調整,導致數據庫無法登錄;數據庫密碼設置了有效期限,但未在到期前更換密碼,導致數據庫無法登錄;環境變量配置錯誤,導致數據庫可遠程登錄卻無法在本機操作系統登錄;數據庫間采用DB-Link的互連方式,使多臺數據庫之間時間戳互相傳染,部分數據庫SCN headroom值快速降低,導致數據庫存在宕機危險。
2.1.4 其它原因導致的數據庫故障
運行原因,是指數據庫長時間運行后產生的故障。包括:數據庫長期運行,發生文件有壞塊情況,當損壞的文件讀入到內存后,內存中產生邏輯壞塊,導致數據庫自動重啟;數據庫集群仲裁機制踢出某臺故障數據庫而重啟集群等。
網絡原因,是指由于網絡、通信問題引起的數據庫故障。包括:數據庫由于 Linux操作系統與Oracle版本不兼容導致IPC通信失敗,數據庫后臺進程自動關閉實例;存儲鏈路抖動,導致 I/O占用高,數據庫響應緩慢等。
硬件原因,是指由于數據庫板卡等硬件損壞引起的數據庫故障,如硬盤、HBA卡故障等。包括:數據庫連接心跳的網線松動,造成數據庫心跳帶寬下降,引起數據庫腦裂;數據庫HBA卡硬件故障,造成數據庫服務器訪問存儲設備異常,無法讀寫數據文件等。
軟件bug原因,是指因某種情況觸發了數據庫自身bug引起的數據庫故障。包括:運行程序或SQL語句執行時觸發數據庫 bug,造成數據庫相關進程異常關閉;數據庫網關程序觸發 bug,導致數據庫服務器虛擬地址失效,無法正常提供服務;磁盤組管理軟件ASM Lib包存在bug,導致數據庫無法掛載磁盤組,無法正常啟動;數據庫Bug引起監聽異常,導致數據庫自身正常運行時外圍系統或客戶端無法連接;數據庫bug導致數據庫集群keepalive進程異常停止,數據庫無法ping通,應用無法連接數據庫;I/O異常情況下數據庫 LMON進程觸發了Bug,引起LMON進程性能大幅下降,導致數據庫服務異常等。
2.2 數據庫故障現象歸納
經過對大量企業數據庫故障案例的分析總結,數據庫故障現象主要包括應用程序無法與數據庫建立連接、數據庫響應時間過長、數據庫自動關閉、數據庫自動重啟、數據庫無法登錄、數據庫ping不通、數據庫服務器指示燈告警等。
Oracle數據庫基礎運維操作主要包括內存分配監控,進程管理、會話管理等[11]。
可通過查詢V$SGAINFO視圖,查找當前實例分配的SGA詳細信息,查看SGA分配情況;通過V$PGASTAT視圖,查詢PGA詳細信息,查看PGA分配情況;通過V$PROCESS視圖,監控PGA分配與進程相關信息;通過 V$MEMORY_DYNAMIC_COMPONENTS視圖,查詢動態SGA+PGA分配信息;通過V$PROCESS視圖和V$BGPROCESS視圖查詢正在運行的進程信息;通過跟蹤路徑查看該路徑所記錄的跟蹤文件的名稱,去查找錯誤進程信息;通過v$statname和v$sesstat視圖查看各進程消耗的資料,如CPU、占用內存等;通過V$SESSIO視圖查看整個會話相關信息,包括前臺和后臺會話信息,找出非活動狀態會話和會話正在執行的SQL語句和阻塞會話等;通過 V$TRANSACTION視圖查詢事務狀態,找出未提交事務。
3.2 數據庫性能調整與故障診斷操作
Oracle數據庫性能調整與故障診斷操作主要是借助性能視圖,包括SQL語句實時監控、會話歷史與性能診斷、SQL語句性能診斷、內存調整、I/O效率診斷等操作。
可通過V$SESSION、V%SQLAREA、V$SQL視圖,查詢正在執行的SQL語句信息,包括會話信息、操作對象,獲取 SQL語句等待時間;可通過 V$SESSION_LONGOPS視圖,查詢長時間運行的應用信息,包括會話信息、已用去時間、還需要運行時間等;可通過 V$SQL_MONITOR視圖監控長時間運行的SQL語句;可通過V$SESSION與V$SESSTAT視圖查詢使用CPU最高的會話;通過V$STATNAME、V$SESSTAT視圖統計會話消耗資料信息,如CPU、I/O、物理讀取、邏輯讀取、排序操作等信息;通過V$ACTIVE_SESSION_HISTORY視圖查詢5分鐘前等待的歷史會話數據,獲取頂級會話等待等數據,獲取使用CPU高的SQL語句;通過X$BH視圖與DBA_OBJECTS數據字典找出占用內存大的對象;通過V$SQL視圖找出反應最慢的SQL語句。
4.1 數據庫故障診斷思路
試驗在眉山中車緊固件科技有限公司完成。轉向架制動杠桿1、2鉚接位置預先鉚接完成,試驗的檢測對象為轉向架制動杠桿的4個鉚接位置(3、4、5、6號位置)的鉚接狀態。
針對應用程序無法連接數據庫的情況,依次從數據庫連接池、數據庫響應速度、數據庫賬號權限、數據庫是否已自動關閉或重啟等方面繼續排查;數據庫響應緩慢情況最為常見,主要是性能原因導致;賬號權限、連接池資源等問題排查和處置較為簡單;數據庫自動關閉或自動重啟情況,往往是由于SMON、PMON、LMON等后臺進程遇到意外情況主動中止實例導致,可繼續從硬件、性能、運行、參數或網絡等方面排查;若以上情況都不是,則是較為少見的原因造成,需進一步分析。
4.2 數據庫故障排查診斷常用方法
對于數據庫故障,應急情況下可進行數據庫重啟進行臨時處置,后續再根據診斷出的故障原因,采取不同的整改解決措施。對于性能原因,可考慮邏輯層面、容器層面、存儲結構、環節層面的優化[12],可考慮利用鎖分散、排隊等機制優化,可通過資源配置優化、資源擴容解決;對于SQL語句問題,可通過優化SQL語句效率解決;對于參數配置原因,可通過調整參數設置解決;對于運行原因,可臨時通過重啟方法解決;對于硬件原因,可通過更換硬件解決;對于軟件bug原因,可通過對升級數據庫版本或打補丁解決。
4.3 數據庫故障排查診斷工具
可通過查看數據庫自帶的工具了解數據庫的運行狀態,進行故障排查診斷,如數據庫AWR、ASH、ADDM、SQL Profile、SQL Monitor、網管告警等[13]。
5.1 內存資源不足引起數據庫故障的案例
2016年1月,某應用系統的數據庫服務器無法連接,某應用系統監測指標開始丟失。首先通過SSH方式、telnet方式連接數據庫失敗,初步判定為AIX操作系統出現問題。進入機房使用 HMC工具通過console連接方式登錄操作系統,可正常登錄到操作系統。查看AIX系統的錯誤日志,發現Oracle數據庫已經不能分配內存(包括 swap)。查看數據庫的告警日志,發現數據庫進程由于操作系統沒有足夠內存(包括swap)停止了,進而導致程序發生錯誤和崩潰。查看ASM實例故障日志,Oracle ASM實例報出內存不足導致進程啟動失敗。經分析,本次故障原因為數據庫服務器物理內存和SWAP內存耗盡,導致操作系統夯住。該服務器物理內存為256GB,SWAP為 32GB,數據庫(SGA+PGA)即占用157GB以上,由于AIX操作系統的maxperm%參數和maxclient%參數采用默認值90,即文件最大可以占用內存的90%(256*90%=230G),當緩存文件量較大時,導致物理內存與SWAP均耗盡。為盡快恢復業務,開展應急處置,對操作系統、數據庫和集群進行重啟,重啟后應用系統恢復正常。為防止故障再次出現,調整AIX操作系統maxperm%為5(256*5%=12.75GB),maxclient%為 5。
5.2 SQL語句不合理引起數據庫故障的案例
2016年1月,某應用系統的監測指標丟失。登陸到應用節點服務器查看日志,發現報連接池滿的錯誤。登陸到數據庫服務器節點1查看日志,發現中間件連接數已達到上限,應用程序無法從數據庫中取數。排查數據庫 AWR報告,發現該時段存在兩條資源占用較高的復雜的SQL語句,該兩條語句均對同一張數據庫表采用模糊查詢,進行全表掃描,經查詢,該數據庫表中的數據記錄已達到5.4億條,執行全表查詢耗時較長,數據庫在執行語句過程中無法及時響應。用戶頻繁點擊,將相關表、視圖不斷鎖定,資源無法及時釋放,Weblogic數據庫連接池占滿。為盡快恢復業務,進行應急處置,調大中間件連接數臨時解決故障。為防止故障再次出現,新建表索引,優化查詢功能模塊SQL語句,并增加了限制用戶頻繁重復點擊功能。
5.3 內存參數配置不當引起數據庫故障的案例
2016年3月,某應用系統的監測指標丟失。發現數據庫服務器節點2和節點3實例為stop狀態。排查本地Weblogic日志,發現JDBC連接失敗,導致I/O錯誤。排查Oracle數據庫日志,發現數據庫進程因未知原因中斷,導致數據庫實例 down掉。從操作系統的HugePage內存信息中看到,原本是要分配215040個大內存塊,可實際上只分配了21243個大內存塊。經查,故障原因為大內存塊分配錯誤,導致數據庫實例的SGA分配不足,數據庫實例非正常 down掉。為盡快恢復業務,進行應急處置,重啟數據庫實例,應用系統的監控指標恢復正常。為防止故障再次出現,調整HugePage內存分配配置,具體步驟為,停止數據庫實例,修改內核參數,添加 vm.nr_hugepages,編輯/etc/sysctl.conf文件,使內核參數生效,啟動數據庫實例。
5.4 bug引起數據庫故障的案例
2016年3月,某應用系統的數據庫實例1無法連接,應用系統的監測指標丟失。登錄數據庫服務器節點1,發現該數據庫實例1正在自動重啟。排查數據庫實例1 alert告警日志,出現數據庫進程hang告警,實例1日志出現ASM連接錯誤告警以及無法分配共享內存資源告警。經查詢 Oracle官方文檔,該異常為內存資源(share pool)占用時間過長,導致資源耗盡并觸發了BUG(13914613),引發數據庫實例自動重啟。數據庫實例自動重啟后,應用系統恢復正常。為防止故障再次出現,升級數據庫軟件版本。
本文結合某大型企業信息系統運維工作實踐,收集了大量關于信息系統數據庫故障的案例,結合數據庫內部架構,研究了故障原因與故障現象的關聯關系和故障機理,創新采用逆向思維和聚焦收斂分析方式,提出了故障原因分類體系,并給出實用運維操作和典型故障案例,為運維人員快速診斷分析定位數據庫故障點提供了參考。本方法符合企業信息系統運維工作實際需求,具有廣闊的實用價值和應用前景。下一步,還將結合深度學習、人工神經網絡等方法開展數據庫故障自動診斷分析研究工作,不斷提升信息系統運維自動化、智能化水平。
[1] 賀鵬程. 基于Oracle的數據庫性能優化研究[J]. 電子設計工程, 2016, 24(9): 1-3.
[2] 王曉軍. Oracle數據庫性能調整與優化技術分析[J]. 通訊世界, 2015, 10: 198-199.
[3] 李鵬. IT運維之道[M]. 北京: 人民郵電出版社. 2016.
[4] 胡晨光, 徐楠楠. Oracle數據庫共享池空間管理調優[J]. 現代電子技術, 2015, 4: 69-72.
[4] 陳靜, 范乃吉, 袁曉東, 蔣一嵐. Matlab環境下的Oracle數據庫訪問技術[J]. 計算機應用, 2015, S1: 78-82.
[5] 劉文娟, 陳永勝. 淺析HP小型機上Oracle數據庫內存使用[J]. 科技信息, 2009, 33: 59-59.
[6] 秦靖, 劉存勇. Oracle從入門到精通[M]. 北京: 機械工業出版社, 2016.
[7] 何洪舟. Java程序中訪問Oracle數據庫的技術分析與實現[J]. 計算機應用與軟件, 2007, 24(5):79-80.
[8] 李智慧. 大型網站技術架構:核心原理與案例分析[M]. 北京: 電子工業出版社, 2013
[9] 劉鐵軍, 張宏利. 數據庫故障及容錯對策[J]. 工業技術經濟, 2005, 6: 127-127.
[10] 趙元杰. Oracle數據庫管理員日常操作手冊[M].北京: 電子工業出版社, 2015
[11] 高揚, 衛崢, 尹會生. 白話大數據與機器學習[M]. 北京:機械工業出版社, 2016
[12] 楊建榮. Oracle DBA工作筆記: 運維、數據遷移與性能調優[M]. 北京: 中國鐵道出版社, 2016
Research on Failure Analysis and Operational Maintenance focused on Enterprise Databases: an Example on Oracle
JIN Xin1, YAN Long-chuan1, LIU Jun1, GENG Liang2
(1. State Grid Information & Telecommunication Branch, Beijing 100761, China;2. Global Energy Interconnection Group Co., Ltd., Beijing 100031, China)
Database is the core component of information system, database failure is the main factor of information system failure, database operation and maintenance is the focus of information system operation and maintenance work. Based on the Oracle database architecture analysis and deep research on failure mechanism, innovatively proposed fault classification system, put forward the practical operation and maintenance operation method,given the typical case of database failure, and provided system methodology for the information system operation and maintenance staff to do the work of database operation and maintenance.
: Oracle; Database failures; Diagnosis and analysis;
TP319
A
10.3969/j.issn.1003-6970.2017.10.035
本文著錄格式:金鑫,閆龍川,劉軍,等. 面向企業級數據庫的故障分析及運維研究:以Oracle數據庫為例[J].軟件,2017,38(10):178-181
金鑫(1985-),女,國家電網公司信息通信分公司職員,工程師,主要從事信息運維工作;閆龍川(1979-),男,國家電網公司信息通信分公司處長,高級工程師,主要從事信息運維工作;劉軍(1970-),男,國家電網公司信息通信分公司主任,高級工程師,主要從事信息通信運維管理工作;耿亮(1985-),男,全球能源互聯網集團有限公司職員,工程師,主要從事能源研究工作。