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}")