基于Oracle数据库的油田数据库实时监控系统
2015-01-15任伟建王子维霍凤财于博文
任伟建 王子维 霍凤财 于博文 朱 珊 孙 辉
(1.东北石油大学电气信息工程学院,黑龙江 大庆 163318;2.大庆油田有限责任公司天然气分公司,黑龙江 大庆 163000)
目前,油田服务器中含有大量应用系统,而每个应用系统都要占用数据库服务器资源。造成数据库中数据结构复杂、混乱。如何针对每个应用系统的数据进行有效的监控和管理是目前亟待解决的问题。
监控数据库比较主流的方法有两种:一种是安装Oracle自带的Logminer工具包对数据库的日志文件进行分析[1]。这种方法可以获取到数据库用户的操作信息,如操作类型及操作时间等,但是存在以下不足:一是无法获取到用户的具体操作内容;二是无法监控到数据库用户的系统信息,如登录时间、退出时间及IP地址等;三是大量占用数据库存储空间,影响数据库性能,Logminer分析器将监控产生的数据全部堆积到日志文件中,数据调用十分繁琐,而且还会生成大量的冗余信息,对数据库性能造成很大影响。第二种方法是创建数据库触发器,调用系统监听函数获取用户在数据库中的行为[2],通过即时触发的方式进行信息记录[3]。这种监控方式可以捕获到数据库用户的IP地址[4]及在数据库中的活动时间等系统信息,但由于系统函数存在的权限问题,无法获取到与用户操作有关的信息。由于油田数据库要针对业务部门的各个应用系统的使用情况进行全方位的监控,必须同时包含详细的用户操作信息内容和系统信息,因此以上两种传统的数据库监控方法都有不足之处。
而Oracle数据库特有的细粒度审计功能,可以解决一部分问题。细粒度审计功能可以记录用户具体操作的SQL语句和变量绑定值。基于这种情况,笔者利用Oracle的细粒度审计功能,提出一种基于Oracle数据库细粒度审计技术与数据库触发器触发监控技术相结合的混合式监控技术,开发了一种基于Oracle数据库的数据库监控系统。系统通过对数据库用户的系统信息和操作行为的监控,为数据库管理员提供管理和维护数据库的辅助分析工具,提高数据库管理员的工作效率,确保业务部门应用系统的不间断运行。
笔者所开发的监控系统依托于Oracle10g数据库,主要开发语言为SQL脚本代码。网页框架和页面设计开发工具为Visual Studio 2010,主要编程语言为C#和JavaScript脚本语言。
数据库监控系统采用B/S模式的3层系统架构,即应用层、业务逻辑层和数据层。监控服务器端与监控数据库之间的交互是双向的,服务器端既可以从数据库中读取数据,也可以将服务器实时监控数据写入数据库中;客户端与服务器端的交互是单向的,客户端从服务器端读取数据并进行数据的查询、调用和分析。
2 监控系统的实现
数据库监控分为3个步骤:
a. 定义监控策略。为了节省数据库资源,通过自定义监控方式,建立相应的监控策略。
b. 开发监控数据字典。为了使大量监控数据结构化存储,方便管理员有针对性地查询分析,开发监控体系所需要的数据字典。
c. 实施监控查询调用。在建立了监控策略并构建了监控数据字典之后,即可实现监控的查询调用,管理员可以从用户的系统信息和具体操作内容的角度进行数据分析,全方位了解业务部门的数据使用情况。
2.1 定义监控策略
为了使监控数据能够更好地被查询、调用和管理,首先需要定义一个监控策略。监控策略能够针对每张不同的数据表进行自定义监控方式,用以监控不同数据表的不同操作。这样既可以防止数据库资源过多地被占用,又可以更加规范地管理监控过程所产生的大量监控数据。
监控策略的定义位于最高权限SYS管理员用户下的数据字典DBA_AUDIT_POLICIES视图中。该策略视图中包含监控动态视图中一些重要列的简短描述。笔者通过开发审计策略处理器模块,编写程序脚本,在SYSTEM本地管理员用户下执行添加。这样一来,管理员通过输入不同的审计策略命令即可添加对不同数据表的监控策略。在监控策略表中,每一行数据代表一个监控策略。PNAME字段下即审计策略名,STMT_TYPE为监控策略的不同类型,可以任意监控SELECT、INSERT、DELETE和UPDATE这4种操作方式的任意组合。
2.2 开发监控数据字典
在Oracle数据库中,对数据进行归类整理后形成的数据集称作数据字典。数据字典是Oracle数据库存储数据库结构信息的地方[5],同时也是用来描述数据库数据组织方式的,具体由数据表和视图组成。数据字典具有维护数据库系统稳定性的重要作用,由于数据库监控过程中产生的监控数据量巨大,如果不对监控数据进行有效地管理则会大量占用数据库资源,对数据库性能产生影响。笔者通过执行编写好的Catalog.sql监控数据字典脚本,构造数据库监控所必须的监控数据表和动态性能视图。对监控数据字典的设计主要从以下几个方面展开。
监控视图,即动态性能视图配置。在进行数据库监控之前,需配置好标准结构的监控数据动态性能视图,动态性能视图是一组反映数据库当前活动信息的虚拟表,所有者为SYS,以v$或者gv$开头,是管理员监控和调优数据库的重要工具,如v$process、v$session及v$sqltest等视图,这些视图存储监控用户的系统信息和具体操作SQL语句,为数据表查询数据提供数据源。
监控数据表,即表结构、表关系及属性数据类型等。在进行数据库监控之前,必须建立起用于存储不同类型监控信息的数据表以及表间关系。其目的是为了使大量数据库监控信息结构化存储,避免进入审计日志中。同时,依靠表关系可以让各类监控数据以有意义的方式联系到一起,便于分析查询。
监控数据的存储结构和存储方法设计。提前构建存储不同业务部门监控数据的数据表和表结构,防止造成数据存储混乱,致使查询分析速度过慢。
监控数据操作权限配置。在初始化数据字典代码时,要定义数据字典的安全级别,本系统由于涉及监控信息,程序设定数据字典为控制级,即在系统外无法对数据字典进行篡改。
数据字典是在监控系统部署之前通过编写好的Catalog.sql脚本直接生成的,杜绝了篡改数据字典的可能。保证了监控数据的安全可靠。同时监控数据字典提供不同接口,使不同业务部门的监控数据存入指定的监控数据表,充分发挥了数据字典的灵活性,使查询代码量大为减少,提高了管理员分析监控数据的速率。监控数据字典构建流程如图1所示。
图1 监控数据字典构建流程
2.3 数据库实时监控和监控数据查询调用
2.3.1用户操作数据监控
笔者所开发的数据库监控系统允许将单个的DML语句连同数据库用户提交的确切语句一起进行审计。除了简单地跟踪代码之外,该技术还通过在每次用户选择特定的数据集时执行数据库内部代码。将监控数据利用上文所提及的步骤自动添加到SYS最高管理员权限下名为FGA_LOG$的系统表中。其中记录了监控事件的时间戳、执行操作的数据库用户ID、操作对象表的名称和所有者,最后还有确切的DML语句SQL代码。用户操作数据监控流程如图2所示。
图2 用户操作数据监控流程
2.3.2系统信息监控
仅开发基于Oracle的细粒度审计数据监控还不足以满足油田数据库监控应用系统的要求。要全方位的获取应用系统的使用情况还需要清楚数据库用户确切的系统信息,如IP地址、登录数据库时间及退出数据库时间等。为了获取数据库用户操作的系统信息,笔者构建了一个具有系统权限的触发器。当触发事件发生的时候,可以启动该触发器。通过调用系统事件函数(Event Attribute Functions)来获取系统信息,利用数据库自带函数SYS_CONTEXT来追踪系统事件。通过触发器的即时监控,用户可以进行包括审计、把对象PIN入共享池及进行一些维护等操作。
Logon/Logoff触发器。Logon/Logoff触发器可以用来记录用户在数据库中的活动时间。在使用系统级触发器前,首先要确认系统参数_system_trig_enabled是否设置为TRUE。在用户登录和退出数据库时,触发系统监听函数,通过数据库底层脚本编写触发器并构建标准结构的用来记录系统监控信息的数据表。
关联触发器。由于Oracle数据库是关系型数据库,笔者通过构建关联触发器将数据字典中用户操作监控数据表与触发器触发监控生成的系统信息监控表相关联。将用户操作监控数据表中的操作内容SQL语句、数据表名、时间戳字段和系统信息监控表的用户名、IP地址字段分别提取出来关联到一张数据表内。具体操作步骤如下:
a. 在SYS用户下构建AFTER触发器,在用户操作后执行该触发器代码;
b. 声明变量,用于存储监控信息内容,数量和类型要与监控表中字段类型一致;
c. 利用session_id、时间戳这两张表中共有的字段作为相关查询条件,将相同时间两张表中需要的字段信息提取出来;
d. 将提取出来的字段信息赋给之前声明的变量,利用SQL代码统一插入到一张新的数据表中,作为相关业务部门的监控数据表。
这样就将两张数据表中的不同字段信息通过触发器统一关联到一张新的数据表中了,在查询分析时方便快捷,所需查询时间很少。而直接在数据库中通过嵌套查询的复杂SQL语句关联查询多表也可以实现这个功能,但是计算量过大,所需时间以分钟为单位,用户体验极差。
在获取到用户的操作信息和IP地址系统信息之后,笔者应用ASP.NET技术[6~8]编写链接数据库字符串,以B/S架构的方式将监控信息可视化展现在浏览器端。设置时间段等智能查询方式便于管理员有针对性地查询。
3 结束语
笔者所开发的数据库监控系统是基于Oracle数据库细粒度审计技术与数据库触发器触发监控技术相结合的混合式监控技术。该技术已经在油田数据库中试运行了一段时间,通过实践证明,该监控系统能够有效地监控数据库用户在应用系统中对数据库进行的一切操作和数据库用户在数据库中的详细系统信息。通过定义监控策略及构建监控数据字典等步骤将大量监控数据结构化存储,进行了有效的管理,便于管理员查看和调用。通过分析监控数据,管理员可以对数据库中的所有被监控用户和应用系统的重点表进行全方位的掌控,从而避免某些应用系统数据维护不及时及冗余操作过多等现象发生,对数据库的管理和性能调优非常有必要。
[1] 张立奎,闫子熙.基于LogMiner的Oracle数据库日志分析[J].计算机与网络,2013,39(z1):145~147.
[2] 支馨悦.触发器在实现数据库安全方面的几种应用[J].林区教学,2011,(5):95~96.
[3] 钟亚妹.触发器在SQL Server数据库开发中的应用与研究[J].电脑知识与技术,2011,7(11):2492~2494.
[4] 韦晨艳,杨键鸣,姚斯立.SQL数据库中存储过程、触发器的应用研究[J].中国信息界,2011,(6):59~60.
[5] 刘晓华.企业数据字典标准化管理平台解决方案探讨[J].武汉工程大学学报,2008,30(1):101~103.
[6] 尚肖飞.基于ASP.NET高职院校教务管理系统的设计与实现[D].哈尔滨:黑龙江大学,2011.
[7] Li T H,Feng W.Design and Implementation of Blood Management System Based on B/S[J].Journal of Capital Medical University,2010,31(6):821~823.
[8] 向才凤,张岳衡.基于ASP.NET的企业进销存管理信息系统的设计与实现[J].中国管理信息化,2011,14(3):35~36.