- 浏览: 64354 次
- 性别:
- 来自: 广州
文章分类
package com.skywin.appmonitor.monitor.oracle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.skywin.appmonitor.db.dao.IAlarmDao;
import com.skywin.appmonitor.db.dao.IOracleDbPerfDao;
import com.skywin.appmonitor.db.vo.Alarm;
import com.skywin.appmonitor.db.vo.MonitorLimit;
import com.skywin.appmonitor.db.vo.MonitorObject;
import com.skywin.appmonitor.db.vo.OracleDbPerf;
import com.skywin.appmonitor.monitor.DataProcess;
import com.skywin.appmonitor.monitor.Monitor;
/**
* Oracle数据库监控
* @author joe
*
*/
public class MonitorOracle implements Monitor,DataProcess {
// -- 协作者 --
private IOracleDbPerfDao oracleDbPerfDao = null;
private IAlarmDao alarmDao;
public void setOracleDbPerfDao(IOracleDbPerfDao oracleDbPerfDao) {
this.oracleDbPerfDao = oracleDbPerfDao;
}
public void setAlarmDao(IAlarmDao alarmDao) {
this.alarmDao = alarmDao;
}
// -- 协作者 --
static OracleDbPerf oracledb = null;
String appName = "Oracle监控";
/**
* 缺省的构造函数
*/
public MonitorOracle(){}
public Object monitor(MonitorObject moniObj) {
oracledb = new OracleDbPerf(); //初始化
oracledb.setMonitorObjId(moniObj.getMonitorId());
String ConStr = moniObj.getMonitorConstr();
String tmpS = "";
String aryS[] = null;
String JDriver = "oracle.jdbc.driver.OracleDriver";
String conURL = "jdbc:oracle:thin:@" + getLinkmsg(ConStr, "ip") + ":"
+ getLinkmsg(ConStr, "port") + ":"
+ getLinkmsg(ConStr, "dbname");
System.out.println(conURL);
try {
Class.forName(JDriver);
} catch (java.lang.ClassNotFoundException e) {
System.out.println("ForName :" + e.getMessage());
}
try {
Connection con = DriverManager.getConnection(conURL, getLinkmsg(
ConStr, "user"), getLinkmsg(ConStr, "password"));
Statement sta = con.createStatement();
ResultSet rs = null;
ResultSetMetaData rsmd = null;
// crteate_time 数据产生时间
java.util.Date cur_date = new java.util.Date();
oracledb.setCreateTime(cur_date);
// 等待时间
// 这个操作已经测试过
/*
* WAIT_TIME ----- ------- 0.04 0.04
*/
sta
.execute("select ROUND((AVERAGE/100),2)as wait_time from SYS.V_$SYSMETRIC_SUMMARY where METRIC_NAME in ('Response Time Per Txn')");
System.out.println("测试等待时间成功");
rs = sta.getResultSet();
while (rs.next()) {
oracledb.setWaitTime(rs.getFloat("wait_time"));
}
// 表空间
String sqlStr = "";
sqlStr = " select t.tablespace_name tb_name, d.tot_size/1024/1024 tot,"
+ "(d.tot_size - f.free_size)/1024/1024 used,"
+ " free_size/1024/1024 free,"
+ " f.max_free_extent/1024/1024 max_free_extent,"
+ " n.max_next_extent/1024/1024 max_next_extent,"
+ " round(free_size/tot_size * 100,0) pct"
+ " from dba_tablespaces t,"
+ " (select tablespace_name, sum(bytes) tot_size from dba_data_files"
+ " where status = 'AVAILABLE'"
+ " group by tablespace_name) d,"
+ " (select tablespace_name, sum(bytes) free_size, max(bytes) max_free_extent"
+ " from dba_free_space"
+ " group by tablespace_name ) f,"
+ " (select tablespace_name, max(next_extent) max_next_extent "
+ " from dba_segments"
+ " group by tablespace_name ) n"
+ " where t.tablespace_name = d.tablespace_name"
+ " and d.tablespace_name = f.tablespace_name"
+ " and f.tablespace_name = n.tablespace_name"
+ " and status = 'ONLINE'" + " order by 7,1";
sta.execute(sqlStr);
System.out.println("测试表空间成功");
rs = sta.getResultSet();
int totalsize = 0;
int freesize = 0;
while (rs.next()) {
totalsize = totalsize + rs.getInt("TOT");
freesize = freesize + rs.getInt("FREE");
}
oracledb.setDbSize(totalsize);
oracledb.setDbFreeSize(freesize);
oracledb.setDbSizeRat(1.0f * freesize / totalsize);
// 当前连接数
sqlStr = "select count(*)as connects from v$session where status='INACTIVE' and username is not null";
sta.execute(sqlStr);
System.out.println("测试当前连接数");
rs = sta.getResultSet();
while (rs.next()) {
oracledb.setConnects(rs.getInt("connects"));
}
// 锁数量
sqlStr = "SELECT s.username, decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,"
+ " o.owner,o.object_name,o.object_type,s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser"
+ " FROM v$session s,v$lock l,dba_objects o"
+ " WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT NULL";
sta.execute(sqlStr);
System.out.println("测试锁数量");
rs = sta.getResultSet();
int locks = 0;
while (rs.next()) {
locks++;
}
oracledb.setLockNum(locks);
oracledb.setLockCom("用户锁");
// 数据缓冲命中率
sqlStr = "SELECT a.VALUE + b.VALUE logical_reads,c.VALUE phys_reads,"
+ " round(100*(1-c.value/(a.value+b.value)),4) hit_ratio"
+ " FROM v$sysstat a,v$sysstat b,v$sysstat c"
+ " WHERE a.NAME='db block gets' AND b.NAME='consistent gets' AND c.NAME='physical reads' ";
sta.execute(sqlStr);
System.out.println("数据缓冲命中率");
rs = sta.getResultSet();
if (rs.next()) {
oracledb.setDataBufRat(rs.getFloat("hit_ratio"));
}
// SGA命中率
sqlStr = "select a.value + b.value logical_reads, c.value phys_reads,"
+ " round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) BUFFER_HIT_RATIO "
+ " from v$sysstat a, v$sysstat b, v$sysstat c"
+ " where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40";
sta.execute(sqlStr);
System.out.println("测试SGA命中率");
rs = sta.getResultSet();
if (rs.next()) {
oracledb.setSgaRat(rs.getFloat("BUFFER_HIT_RATIO"));
}
// SGA字典缓冲命中率
sqlStr = "select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 miss_ratio,"
+ " (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 hit_ratio"
+ " from v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses";
sta.execute(sqlStr);
System.out.println("测试SGA字典缓冲命中率");
rs = sta.getResultSet();
if (rs.next()) {
oracledb.setSgaDictRat(rs.getFloat("hit_ratio"));
}
// SGA共享缓存区命中率
sqlStr = "select sum(pinhits-reloads)/sum(pins)*100 hit_radio from v$librarycache ";
sta.execute(sqlStr);
System.out.println("测试SGA共享缓存区命中率");
rs = sta.getResultSet();
if (rs.next()) {
oracledb.setSgaShareRat(rs.getFloat("hit_radio"));
}
oracledb.setResult(((short) 0));
// 将数据存储到OracleDbPerf中
this.oracleDbPerfDao.save(oracledb);
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
}
return oracledb;
}
public List process(MonitorObject monObj, MonitorLimit[] moniLmt) {
if (oracledb == null) {
return null;
}
/**
* Alarm_Type: 0:正常;1:预警;2:报警
*/
else{
List lst = new ArrayList();
Date date = new Date();
java.text.DateFormat format = new SimpleDateFormat("yyyyMMdd");
String flag_str = "";
Alarm alm[] = new Alarm[moniLmt.length];
for (int i = 0; i < moniLmt.length; i++) {
System.out.println(moniLmt[i].getFieldName() + "]--[" + i + "]--["
+ moniLmt.length);
alm[i] = new Alarm();
lst.add(alm[i]);
if (moniLmt[i].getFieldName().equals("wait_time")) {
if (oracledb.getWaitTime() <= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("等待时间 正常"); // 故障中文描述"
} else if (oracledb.getWaitTime() > moniLmt[i].getNormal()
&& oracledb.getWaitTime() <= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("等待时间 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("等待时间 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "wait_time";
} else if (moniLmt[i].getFieldName().equals("db_free_size")) {
if (oracledb.getDbFreeSize() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("剩余表空间 正常"); // 故障中文描述"
} else if (oracledb.getDbFreeSize() < moniLmt[i].getNormal()
&& oracledb.getDbFreeSize() >= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("剩余表空间 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("剩余表空间 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "db_free_size";
} else if (moniLmt[i].getFieldName().equals("db_size_rat")) {
if (oracledb.getDbSizeRat() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("表空间可用率 正常"); // 故障中文描述"
} else if (oracledb.getDbSizeRat() < moniLmt[i].getNormal()
&& oracledb.getDbSizeRat() >= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("表空间可用率 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("表空间可用率 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "db_size_rat";
} else if (moniLmt[i].getFieldName().equals("connects")) {
if (oracledb.getConnects() <= moniLmt[i].getNormal()) {
System.out.println("connects 正常");
alm[i].setAlarmType(0);
alm[i].setDescription("连接数 正常"); // 故障中文描述"
} else if (oracledb.getConnects() > moniLmt[i].getNormal()
&& oracledb.getConnects() <= moniLmt[i].getPeralarm()) {
System.out.println("connects 预警");
alm[i].setAlarmType(1);
alm[i].setDescription("连接数 预警"); // 故障中文描述"
} else {
System.out.println("connects 告警");
alm[i].setAlarmType(2);
alm[i].setDescription("连接数 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "connects";
} else if (moniLmt[i].getFieldName().equals("lock_num")) {
if (oracledb.getLockNum() <= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("锁数量 正常"); // 故障中文描述"
} else if (oracledb.getLockNum() > moniLmt[i].getNormal()
&& oracledb.getLockNum() <= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("锁数量 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("锁数量 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "lock_num";
} else if (moniLmt[i].getFieldName().equals("data_buf_rat")) {
if (oracledb.getDataBufRat() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("数据缓冲命中率 正常"); // 故障中文描述"
} else if (oracledb.getDataBufRat() < moniLmt[i].getNormal()
&& oracledb.getDataBufRat() >= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("数据缓冲命中率 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("数据缓冲命中率 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "data_buf_rat";
} else if (moniLmt[i].getFieldName().equals("sga_rat")) {
if (oracledb.getSgaRat() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("SGA命中率 正常"); // 故障中文描述"
} else if (oracledb.getSgaRat() < moniLmt[i].getNormal()
&& oracledb.getSgaRat() >= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("SGA命中率 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("SGA命中率 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "sga_rat";
} else if (moniLmt[i].getFieldName().equals("sga_dict_rat")) {
if (oracledb.getSgaDictRat() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("SGA字典缓冲命中率 正常"); // 故障中文描述"
} else if (oracledb.getSgaDictRat() < moniLmt[i].getNormal()
&& oracledb.getSgaDictRat() >= moniLmt[i].getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("SGA字典缓冲命中率 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("SGA字典缓冲命中率 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "sga_dict_rat";
} else if (moniLmt[i].getFieldName().equals("sga_share_rat")) {
if (oracledb.getSgaShareRat() >= moniLmt[i].getNormal()) {
alm[i].setAlarmType(0);
alm[i].setDescription("SGA共享缓存区命中率 正常"); // 故障中文描述"
} else if (oracledb.getSgaShareRat() < moniLmt[i].getNormal()
&& oracledb.getSgaShareRat() >= moniLmt[i]
.getPeralarm()) {
alm[i].setAlarmType(1);
alm[i].setDescription("SGA共享缓存区命中率 预警"); // 故障中文描述"
} else {
alm[i].setAlarmType(2);
alm[i].setDescription("SGA共享缓存区命中率 告警"); // 故障中文描述"
}
flag_str = monObj.getMonitorId() + "|"
+ monObj.getMonitorObjId() + "|" + monObj.getAppId()
+ "|" + "sga_share_rat";
}
alm[i].setMonitorId(monObj.getMonitorId()); // 监视器编号
alm[i].setMonitorName(monObj.getMonitorObjName()); // 监视器名称
alm[i].setMonitorObjId(monObj.getMonitorObjId()); // 监视源编号
alm[i].setMonitorObjName(monObj.getMonitorObjName()); // 监视源名称
alm[i].setAppId(monObj.getAppId()); // 应用编号
alm[i].setApplication(appName); // 应用名称
alm[i].setStatus(1); // 告警单状态
alm[i].setBeginTime(date); // 告警开始时间
alm[i].setAlarmNo(format.format(date) + ""); // 告警单序号
alm[i].setFlagStr(flag_str);
//存储Alarm数据
this.alarmDao.save(alm[i]);
}
return lst;
}
}
public String getLinkmsg(String source, String finds) {
String result = "";
String[] str_array = source.split("\\|");
if (finds == "conType") {
result = str_array[0].toString().trim();
} else if (finds == "ip") {
result = str_array[1].toString().trim();
} else if (finds == "port") {
result = str_array[2].toString().trim();
} else if (finds == "user") {
result = str_array[3].toString().trim();
} else if (finds == "password") {
result = str_array[4].toString().trim();
} else if (finds == "dbname") {
result = str_array[5].toString().trim();
}
return result;
}
// --这里是构建Spring资源文件--
protected static String basePath() {
return "WebRoot/WEB-INF/config/";
}
protected static String generatePath(String file) {
return basePath() + file;
}
protected static List applicationFiles() {
List files = new ArrayList();
files.add(generatePath("applicationContext.xml"));
files.add(generatePath("hibernateMysql-context.xml"));
files.add(generatePath("context/alarm-context.xml"));
files.add(generatePath("context/oraclePerf-context.xml"));
files.add(generatePath("monitor/monitorOracle-context.xml"));
return files;
}
// --这里是构建Spring资源文件--
public static void main(String[] args) {
//这里监控的Oracle数据库
String ss = "ORACLE|10.243.1.225|1521|simpass|skywin|simpass";
//构建MonitorObject
MonitorObject obj = new MonitorObject();
obj.setMonitorConstr(ss);
obj.setMonitorObjId(2);
obj.setAppId(3);
obj.setMonitorId(2);
obj.setMonitorObjName("ORACLE");
//构建MonitorLimit
MonitorLimit monitorLimit = new MonitorLimit();
MonitorLimit[] moniLmt = new MonitorLimit[1];
moniLmt[0] = monitorLimit;
moniLmt[0].setMonitorObjId(2);
moniLmt[0].setFieldName("wait_time");
moniLmt[0].setNormal(0.01f);
moniLmt[0].setPeralarm(0.03f);
moniLmt[0].setAlarm(0.05f);
ApplicationContext context = new FileSystemXmlApplicationContext(
(String[]) applicationFiles().toArray(new String[] {}));
Monitor oracleMonitor = (Monitor) context.getBean("oracleDbMonitorService");
DataProcess oracleProcess = (DataProcess) context.getBean("oracleDbDataProcessService");
System.out.println("============================="+oracleProcess.getClass());
if (((oracledb = (OracleDbPerf) oracleMonitor.monitor(obj))!= null)) {
oracleProcess.process(obj, moniLmt);
}
}
}
- monitor.rar (36.7 KB)
- 下载次数: 21
发表评论
文章已被作者锁定,不允许评论。
相关推荐
- **Oracle Auditd**:用于监控和记录系统活动,帮助管理员及时发现潜在的安全威胁。 - **OpenSCAP**:提供了一套全面的安全配置和评估工具,确保系统符合安全标准。 #### 六、Oracle Linux的社区支持 Oracle Linux...
该系统的设计和实现需要考虑多方面的因素,包括Linux操作系统、Oracle RAC集群数据库、数据库监控、shell脚本自动收集信息、Web网页技术、系统架构设计、数据访问、高可用性、自动化监控和实时监控等方面。
### Oracle在Linux系统中的安装使用详解 #### 一、Linux系统下Oracle 10G的安装 ##### 1) 安装环境检查 在Linux环境下安装Oracle 10G数据库之前,确保系统的硬件条件和软件环境都符合Oracle的最低要求至关重要。...
本安装包是专为Linux操作系统设计的,下面将详细介绍如何在Linux系统上安装和配置Oracle监控端。 一、Oracle客户端 Oracle客户端是连接到Oracle数据库服务器的软件工具,它包含了执行SQL查询、PL/SQL程序以及与...
Oracle Database 11g Release 2 (11.2.0.4) 是Oracle公司推出的一款数据库管理系统,它在原有的11g版本基础上进行了多项优化和改进,提供了更稳定、高效的数据存储与管理服务。11.2.0.4版本是11g系列的一个重要补丁...
4. **Manager(管理器)**:作为GoldenGate的核心组件,它负责启动、监控和管理其他所有组件,如Extract和Replicat进程,确保整体流程的协调与正常运行。 5. **Data Pump**:用于在不同的GoldenGate环境之间快速...
在Linux系统上安装Oracle 11g是一项技术性较强的任务,涉及到多个步骤和注意事项。首先,让我们了解一下Oracle 11g的基本信息。Oracle 11g是Oracle公司的一款企业级数据库管理系统,它提供了高性能、高可用性和安全...
1. 编写RHCS脚本,用于管理和监控Oracle实例。 2. 配置脚本以实现故障转移功能。 #### 六、测试 **修改RHCS添加脚本到集群**: 1. 将Oracle HA相关的脚本加入RHCS集群配置中。 2. 测试集群在故障发生时的自动恢复...
总的来说,安装Oracle 10g在Linux系统上是一项细致的工作,需要对Linux系统和Oracle数据库有深入的理解。通过合理规划、精确配置和细心操作,可以顺利完成安装,并为后续的数据库管理打下坚实的基础。
《为Oracle调整和优化Linux》 Oracle数据库在企业级应用中扮演着至关重要的角色,而其性能和稳定性往往取决于运行它的...通过持续监控和调整,可以确保系统的稳定性和高可用性,满足企业对Oracle数据库的严苛需求。
RPM(Red Hat Package Manager)包是Linux系统中广泛使用的软件包管理器,它使得软件的安装、升级、卸载等操作变得方便快捷。在这个“最全版本Oracle11gRPM包linux”中,包含了所有必要的RPM包,旨在简化在Linux环境...
8. **监控和维护**:部署监控工具,如 Oracle Enterprise Manager Cloud Control,来持续监控集群健康状态。定期应用数据库和操作系统补丁,以保持系统的安全性和稳定性。 通过这个过程,你可以构建一个在 Oracle ...
- **管理工具包**:Oracle Linux 管理工具包是专为 Linux 服务器设计的一套完整的管理工具集,包括配置管理、监控、系统管理等功能,并且对于 Basic Support 或 Premier Support 的用户是免费提供的。 - **集群软件*...
本文将围绕“Oracle在Linux上的安装”这一主题,详细讲解相关知识点,帮助你理解如何在Linux系统中部署和配置Oracle数据库。 首先,安装Oracle数据库在Linux上需要对操作系统有深入的理解,因为Oracle依赖于特定的...
【legato for oracle on linux】是指在Linux操作系统中使用Legato网络存储管理器(NetWorker)为Oracle数据库提供备份解决方案。Legato NetWorker是一个全面的数据保护软件,它提供了灵活、可扩展的备份和恢复功能,...
确保你的Linux系统版本与Oracle 10g兼容,例如RHEL或CentOS的某个稳定版本。更新系统到最新补丁,关闭防火墙和Selinux,确保足够的磁盘空间,并为Oracle用户设置适当的权限。 接下来,你需要下载Oracle 10g的二进制...
1. **glibc**:GNU C库是Linux系统的核心部分,为应用程序提供基本功能,如内存管理、线程支持和I/O操作。 2. **libaio**:异步I/O库,Oracle数据库利用这个库进行高效的磁盘I/O操作,提升数据存取性能。 3. **krb...
Linux系统作为Oracle数据库的底层平台,其稳定性也至关重要。在处理Linux紧急事件时,系统管理员需要掌握以下技能: 1. **故障诊断**:通过查看syslog、dmesg和/var/log中的日志,找出系统异常的原因。 2. **内存和...
在拷贝完成后,使用root用户登录Oracle Linux系统,执行yum install命令安装oracle-validated软件包。Oracle-validated是Oracle官方提供的一个验证工具,用于检查系统是否满足安装Oracle数据库的基本条件。 安装...