Oracle 四小时异常报告(oracle4个小时报错)
Oracle 四小时异常报告
Oracle 数据库作为企业数据管理的重要工具,不可避免地会遇到各种异常情况,如服务器宕机、数据库死锁等。为及时发现异常并进行解决,我们需要一套完善的错误日志和异常报告系统,能够及时反馈数据库的异常情况和处理结果。
本文将详细介绍一套基于 Python 开发的 Oracle 四小时异常报告系统,可以实现每隔四小时,收集 Oracle 数据库的运行状况,并通过邮件报告的形式,及时反馈异常情况,以便管理员准时进行处理。
一、环境准备
1. 安装 cx_Oracle 模块
cx_Oracle 模块是 Python 连接 Oracle 数据库的重要库,需在系统中先进行安装。
可以使用 pip 工具进行安装:
pip install cx_Oracle
2. 邮件 SMTP 设置
异常报告需要通过邮件的方式进行推送,需先进行 SMTP 邮件配置。
本例中使用的 SMTP 邮箱是 QQ 邮箱,SMTP 服务器地址为 smtp.qq.com,端口号为 465,邮件用户名和密码需要先进行设置。
设置 SMTP 邮件发送的基本方法如下:
“`python
import smtplib
from eml.mime.text import MIMEText
def send_eml(to_list, subject, content):
“””
发送邮件
:param to_list: 收件人列表
:param subject: 邮件主题
:param content: 邮件内容
:return:
“””
ml_user = “xx@qq.com”
ml_pass = “xx”
ml_host = “smtp.qq.com”
ml_port = 465
msg = MIMEText(content, _subtype=’pln’, _charset=’utf-8′)
msg[‘To’] = ‘,’.join(to_list)
msg[‘From’] = ml_user
msg[‘Subject’] = subject
try:
server = smtplib.SMTP_SSL(ml_host, ml_port)
server.login(ml_user, ml_pass)
server.sendml(ml_user, to_list, msg.as_string())
server.close()
return True
except Exception as e:
print(str(e))
return False
二、异常报告核心代码
1. Oracle 数据库连接
这是连接 Oracle 数据库的基本流程,其中:
- dsn:Oracle 数据库名称和端口号- user:用户名
- password:密码
```pythonimport cx_Oracle
dsn = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168..)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))' # Oracle 数据库名称和端口号user = '' # 用户名
password = '' # 密码
conn = cx_Oracle.connect(user, password, dsn)
2. SQL 查询语句
这是本例中使用的 SQL 查询语句,用于获取 Oracle 数据库的运行状况信息,其中:
– sysdate:系统当前时间
– sysdate-1/6:系统当前时间前四小时
– dba_hist_sysstat.name IN (‘physical reads’, ‘physical writes’, ‘logical reads’, ‘user commits’, ‘user rollbacks’):查询的监控指标,可以根据需求进行修改
“`python
sql_text = “””
SELECT cpu_usage, db_time, num_sessions, physical_reads, physical_writes, logical_reads, user_commits, user_rollbacks
FROM (
SELECT ROUND(AVG(cpu_usage),2) as cpu_usage, ROUND(AVG(db_time),2) as db_time, COUNT(sid) as num_sessions
FROM v$session
WHERE sid>10 AND status=’ACTIVE’ AND WT_CLASS!=’Idle’
AND last_call_et/60>2 AND logon_time>sysdate-1/6
) s1, (
SELECT name, VALUE FROM v$sysstat
WHERE dba_hist_sysstat.name IN (‘physical reads’, ‘physical writes’, ‘logical reads’, ‘user commits’, ‘user rollbacks’)
) s2
WHERE s1.cpu_usage IS NOT NULL AND s1.db_time IS NOT NULL
“””
3. 异常检测逻辑
异常检测逻辑是本例程序的核心部分,主要功能是根据 SQL 查询的结果,判断 Oracle 数据库是否存在异常。判断逻辑如下:
- Oracle 数据库登录连接正常- 最近四小时内,有执行 SQL 的会话
- 最近四小时内,逻辑读操作比例(logical_reads / (physical_reads + logical_reads))大于 80%- 最近四小时内,事务回滚比例(user_rollbacks / (user_commits + user_rollbacks))大于 1%
- 最近四小时内,非 IDLE 等待事件的会话数量大于 10
```pythondef check_oracle(conn):
""" 检测 Oracle 数据库状态
:param conn: Oracle 数据库连接 :return: 状态值,0 表示正常,1 表示异常
""" sql_text = """
SELECT cpu_usage, db_time, num_sessions, physical_reads, physical_writes, logical_reads, user_commits, user_rollbacks FROM (
SELECT ROUND(AVG(cpu_usage),2) as cpu_usage, ROUND(AVG(db_time),2) as db_time, COUNT(sid) as num_sessions FROM v$session
WHERE sid>10 AND status='ACTIVE' AND WT_CLASS!='Idle' AND last_call_et/60>2 AND logon_time>sysdate-1/6
) s1, ( SELECT name, VALUE FROM v$sysstat
WHERE dba_hist_sysstat.name IN ('physical reads', 'physical writes', 'logical reads', 'user commits', 'user rollbacks') ) s2
WHERE s1.cpu_usage IS NOT NULL AND s1.db_time IS NOT NULL """
cursor = conn.cursor() cursor.execute(sql_text)
row = cursor.fetchone() if row:
cpu_usage = row[0] db_time = row[1]
num_sessions = row[2] physical_reads = row[3]
physical_writes = row[4] logical_reads = row[5]
user_commits = row[6] user_rollbacks = row[7]
print(f"DB: {dsn}, CPU使用率: {cpu_usage}%, 数据库响应时间: {db_time}秒, 会话数: {num_sessions}") print(
f" - 物理读: {physical_reads}, 物理写: {physical_writes}, 逻辑读: {logical_reads}, 提交: {user_commits}, 回滚: {user_rollbacks}") if num_sessions >= 10 and logical_reads / (physical_reads + logical_reads) > 0.8 and \
user_rollbacks / (user_commits + user_rollbacks) > 0.01: return 1
else: return 0
else: print(f"DB: {dsn} 状态:未连接或无数据")
return 0
4. 异常报告发送
若通过异常检测逻辑判断,Oracle 数据库存在异常情况,需要通过邮件的方式进行报告。为提高邮件的可读性,本例通过 HTML 表格的方式将异常信息进行整理。
“`python
def send_oracle_alert(receiver, db, issues):
“””
发送 Oracle 数据库异常报告
:param receiver: 邮件接收者
:param db: 异常数据库
:param issues: 异常信息
:return:
“””
subject = f”Oracle 数据库异常报告 – {db}”
content = f”以下是四小时内 Oracle 数据库异常情况汇总:\n
{‘-‘*60}\n
“
table_head = “””
DB实例 | 会话数 | CPU利用率 | 逻辑读比例 | 回滚比例 |
---|---|---|---|---|
{db} | {session_num} | {cpu_usage}% | {logical_reads_ratio}% | {rollback_ratio}% |
“
content += table_head + table_body + table_tl
if send_eml(receiver, subject, content):
print(f”{db} 异