生成oracle database awr 邮件报告 python脚本

news/2025/3/28 6:34:26/文章来源:https://www.cnblogs.com/oradba/p/18784805

import cx_Oracle
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
import datetime

# Oracle数据库连接信息
oracle_user = 'your_oracle_user'
oracle_password = 'your_oracle_password'
oracle_dsn = 'your_oracle_dsn' # 例如:'localhost:1521/orcl' 或 RAC的TNS名称

# 邮件服务器和账户信息
smtp_server = 'your_smtp_server'
smtp_port = 25 # 或其他端口,如587(TLS)或465(SSL)
email_from = 'your_email@example.com'
email_to = 'recipient@example.com'
email_subject = 'Oracle AWR Report - Last 8 Hours'

# 其他配置
report_type = 'html'
report_filename = f'awr_report_{datetime.datetime.now().strftime("%Y%m%d_%H%M%S")}.html'

def generate_awr_report():
try:
# 连接到Oracle数据库
connection = cx_Oracle.connect(oracle_user, oracle_password, oracle_dsn)
cursor = connection.cursor()

# 获取开始和结束的快照ID
cursor.execute("""
SELECT MIN(snap_id), MAX(snap_id)
FROM dba_hist_snapshot
WHERE begin_interval_time BETWEEN SYSDATE - INTERVAL '8' HOUR AND SYSDATE
""")
snap_ids = cursor.fetchone()
if not snap_ids:
raise Exception("No snapshots found in the last 8 hours.")

begin_snap, end_snap = snap_ids

# 生成AWR报告的SQL*Plus命令
awr_cmd = f"""
SET HEADING OFF FEEDBACK OFF PAGESIZE 0 LINESIZE 1000 TRIMSPOOL ON
SPOOL {report_filename}
@?/rdbms/admin/awrrpt.sql
{report_type}
{begin_snap}
{end_snap}
/
SPOOL OFF
EXIT;
"""

# 执行生成AWR报告的命令
cursor.execute("BEGIN DBMS_OUTPUT.ENABLE(1000000); END;")
cursor.execute(f"SPOOL {report_filename};")
for line in awr_cmd.splitlines():
cursor.execute(line)
cursor.execute("SPOOL OFF;")

# 关闭数据库连接
cursor.close()
connection.close()

print(f"AWR report generated successfully: {report_filename}")
except Exception as e:
print(f"Error generating AWR report: {e}")
os.remove(report_filename) # 清理未完成的报告文件
raise

def send_email_with_attachment(filename):
try:
# 构建邮件内容
msg = MIMEMultipart()
msg['From'] = email_from
msg['To'] = email_to
msg['Subject'] = email_subject

# 附加AWR报告作为邮件附件
with open(filename, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(filename)}')
msg.attach(part)

# 发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.sendmail(email_from, email_to, msg.as_string())
print("Email sent successfully with AWR report attachment.")
except Exception as e:
print(f"Error sending email: {e}")

if __name__ == '__main__':
try:
# 生成AWR报告
generate_awr_report()

# 发送带有AWR报告的邮件
send_email_with_attachment(report_filename)

# 清理生成的报告文件(如果需要)
# os.remove(report_filename)
except Exception as e:
print(f"An error occurred: {e}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902384.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3月10号-3月16号笔记三合一+两篇面经

2025.3.10 学习 八股 blocked和waiting有啥区别 触发条件:线程进入BLOCKED状态通常是因为试图获取一个对象的锁(monitor lock),但该锁已经被另一个线程持有。这通常发生在尝试进入synchronized块或方法时,如果锁已被占用,则线程将被阻塞直到锁可用。线程进入WAITING状态是…

Dicom纯js的三维重建影像浏览器

主要功能介绍 实现通过浏览器浏览Dicom影像阅片。主要功能:支持标准DIcom影像的2D浏览,预设窗位,伪彩,序列间,序列内多种布局方式。 影像处理,提供影像翻图、缩放、移动、透镜、反相、旋转、截图等操作 影像测量,提供箭头、直线、十字架、角度、Cobb、心胸比、椭圆、矩形…

电子签借贷真实吗?315报道引发的行业地震!电子签到底冤不冤?

看了315的相关报道后,曝光套路贷本来是正向的,却将电子签和高利贷混为一谈。这种无意识的混淆不仅会误导大众,也不利于新兴技术的健康发展。电子签作为一种替代纸质合同签署的新兴技术,有着独特的优势和重要的意义。在过去,不同主体之间签订合同往往需要面对面进行签署,这…

C#反编译

偶遇C#逆向题,IDA拼尽全力无法战胜,只给我一团乱码。 这时可以使用dnSpy来反编译: https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8 1.dnSpy使用方法: 将你要反编译的程序的整个文件夹拖到那里,似乎只有.dll那里才能看到源码, 例题:https://www.nssctf.cn/problem/3…

Windows11跳过Microsoft账户登录方法

新版Win11默认必须联网并且使用Microsoft账户登录,不然不能进去系统,以下是不联网进入方法1、在开机出现登录界面时,按下Ctrl+Shift+F3快捷键,然后系统会自动重启,重启 后会出现一个不需要登录Microsoft账户的启动界面,直接进入Windows11系统,系统中会弹窗,点确定。 2、…

android studio 真机wifi调试经验汇总

--------------- 2025/03/11 真机连接连不上wifi调试可能的原因: 1.手机没有开启开发者模式 2.手机没有开启usb调试以及wifi调试 3.手机应该改为传输文件模式 4.手机和电脑应该连接同一个wifi 5.在电脑cmd窗口输入adb connect ip:port(前提电脑需要配好adb环境)adb连接手机教…

广度优先搜索(BFS)走迷宫:

广度优先搜索(BFS)走迷宫: 广度优先搜索(BFS)是一种经典的图遍历算法,在解决路径查找、迷宫问题、拓扑排序等问题 前置知识:队列: 队列与栈类似,但是先进先出,而不是栈的先进后出。 原理: 相当于爆破,将所有的位置都走一遍 通用迷宫代码实现: #include <iostre…

TEA与XTEA算法:

TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1…

ui中的控件stackwidget如何拖拽添加widget

QStackedWidget界面的操作步骤-百度经验

UPX加壳原理,加壳及去壳:

加壳: 先写一个简单的代码:生成text.exe文件,然后把这个文件放到与upx同一个文件夹里: 输入指令./upx text.exe 即可加壳 使用IDA打开,可以明显发现被upx加壳了,其大小也由原来的55kb压缩到42KB: 去壳: 工具去壳: 使用指令./upx -d text.exe即可脱壳大小也变回去了,用…

vscode remote ssh内存异常占用高问题

参考:https://blog.csdn.net/sigmarising/article/details/107615035 点开设置搜索search.follow。在用户/远程/工作区都取消勾选Follow Symlinks,如图所示。

Hook(钩子技术)

一.介绍 1.当代码执行到某行时,获取寄存器值和内存里的值,进行调试分析,例如hook明文包. 2.当代码执行到某行时,插入想执行的代码.例如迅雷拦截发包函数. 3.当代码执行到某行时,修改寄存器,达到某些篡改目的. 拿FishingKit这道题举例就是本来运行流程是: a--->b 而使用了H…