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:密码

```python
import 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

```python
def 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 = “””

“””

table_body = “”

for issue in issues:

db, session_num, cpu_usage, logical_reads_ratio, rollback_ratio = issue

table_body += f”

\n”

table_tl = “

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} 异


数据运维技术 » Oracle 四小时异常报告(oracle4个小时报错)