APP下载

面向企业级数据库的故障分析及运维研究:以Oracle数据库为例

2017-12-28闫龙川

软件 2017年10期
关键词:视图日志进程

金 鑫,闫龙川,刘 军,耿 亮

(1. 国家电网公司信息通信分公司,北京 100761;2. 全球能源互联网集团有限公司,北京 100031)

面向企业级数据库的故障分析及运维研究:以Oracle数据库为例

金 鑫1,闫龙川1,刘 军1,耿 亮2

(1. 国家电网公司信息通信分公司,北京 100761;2. 全球能源互联网集团有限公司,北京 100031)

数据库是信息系统的核心组件,数据库故障是信息系统故障的主要因素,数据库运维是信息系统运行维护工作的重点。基于Oracle数据库的架构分析和故障机理深层次研究,创新性提出故障原因分类体系,提出实用运维操作方法,给出数据库故障典型案例,为信息系统运维工作人员做好数据库运维工作的提供系统方法论。

Oracle;数据库故障;诊断分析

0 引言

数据库承担数据的存储、读取等功能,是信息系统重要组成部分,数据库故障可能导致信息系统瘫痪,对企业运营和安全生产的威胁极大,数据丢失可能会对企业造成不可挽回的影响。对某大型企业近年来发生的信息系统故障进行粗略统计,发现数据库故障占比最高,因此数据库性能是信息系统运维人员关注的焦点[1-2]。本文结合数据库组成架构和故障机理的深入研究,总结出数据库故障原因分类体系,提出数据库实用的性能监控、故障处理等运维操作,给出典型故障场景及解决方法,对于企业信息系统运维人员进行数据库故障快速诊断处置具有重要参考价值。

1 数据库架构分析

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 数据库故障原因分类体系

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不通、数据库服务器指示灯告警等。

3 数据库故障运维操作

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 数据库故障解决方法

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 数据库故障案例

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),引发数据库实例自动重启。数据库实例自动重启后,应用系统恢复正常。为防止故障再次出现,升级数据库软件版本。

6 结束语

本文结合某大型企业信息系统运维工作实践,收集了大量关于信息系统数据库故障的案例,结合数据库内部架构,研究了故障原因与故障现象的关联关系和故障机理,创新采用逆向思维和聚焦收敛分析方式,提出了故障原因分类体系,并给出实用运维操作和典型故障案例,为运维人员快速诊断分析定位数据库故障点提供了参考。本方法符合企业信息系统运维工作实际需求,具有广阔的实用价值和应用前景。下一步,还将结合深度学习、人工神经网络等方法开展数据库故障自动诊断分析研究工作,不断提升信息系统运维自动化、智能化水平。

[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-),男,全球能源互联网集团有限公司职员,工程师,主要从事能源研究工作。

猜你喜欢

视图日志进程
一名老党员的工作日志
扶贫日志
债券市场对外开放的进程与展望
游学日志
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
社会进程中的新闻学探寻
一种基于粗集和SVM的Web日志挖掘模型
我国高等教育改革进程与反思