Oracle 表空间监控 - 邮件预警和自动扩容

1 背景

长春捷翼上线阶段,现场生产环境宕机事件频发。一次宕机情况就是因为 Oracle 表空间不足,没有及时扩容,导致现场停机了 15 分钟左右。在系统的使用过程中,数据库里的数据会无限制的增长,所以需要及时对表空间进行扩容,避免因为数据库表空间不足导致宕机。

2 Oracle 表空间监控的实现

这里使用 python 实现对 oracle 表空间的监控,python 的语法相对简单而且容易编写,在编写脚本上面有独特的优势。而且 python 的标准库和第三方库非常强大,应用领域很广,自带了邮件发送等插件,引入即可使用
接下来,我会从 Python 的下载安装开始,介绍是怎么样一步步实现表空间监控的

2.1 Python 下载安装

参考:https://blog.csdn.net/m0_59162248/article/details/128047979
网上有很多安装教程,这里就不多介绍了。可以使用 python 自带的集成开发环境 IDLE 来编写和编译 python,也可以下载 Pycharm,Pycharm 是 JetBrains 开发的一款 python IDE, 与 IDEA 同根同源,如果有时间可以自己下载研究一下。

2.2 表空间使用率 Sql 脚本

这里我们单独建立一个文件 tablespace_alert.sql,用于查询表空间使用,在表空间的使用率达到阈值(90%)时预警。
== 需要注意的是我们在什么时候进行预警扩容呢 ==?一般在对表空间扩容时,在一开始并不需要很大的表空间文件,所以扩容语句会指定一个初始值,比如 5GB,随着数据量增多再扩展表空间文件大小,一次增长 1GB 这样的,所以在这里查询最大容量时,应该是表空间的最大扩展大小。然后在计算使用率时,用当时的使用容量 / 最大表空间扩展大小,这样得到的使用率才是我们需要的

select a.tablespace_name,
       a.maxbytes / 1024 / 1024 / 1024 "Sum GB",
       a.bytes / 1024 / 1024 / 1024 "used GB",
       (a.maxbytes - a.bytes) / 1024 / 1024 / 1024 "free GB",
       round(((a.bytes) / a.maxbytes) * 100, 2) "percent_used%"
  from (select tablespace_name, sum(maxbytes) maxbytes, sum(bytes) bytes from dba_data_files
         where tablespace_name = upper('MESTAR_DATA')
         group by tablespace_name) a

2.3 Python 连接数据库查询表空间使用率

需要先引入 cx_oracle 模块

cmd 执行命令:pip install cx_oracle

打开我们事先安装好的 IDLE 或者 Pycharm,新建一个 tablespace_alert.py 文件。
通过这个 python 脚本,可以实现简单对表空间使用率的查询

2.4 Python 实现邮件发送

这里遇到一个问题,在用 python 发送 smtp 邮件时,指定端口用的 465 是正确的,25 端口不行。但是用之前在磁盘空间预警里介绍的 smtpmailsender 发邮件配置端口用 465 却有错误,得用 25 端口,这里的错误原因并不明确

2.5 最终实现脚本:表空间监控 - 邮件预警和自动扩容

通过前两个部分,其实我们已经可以实现对表空间使用率的监控,并且也能实现邮件发送,我们还需要将它们结合起来,如果有需求,我们甚至可以自动执行扩容 sql 语句
这里还是需要引入 cx_oracle 插件用于查询 oracle 和执行扩容语句,引入 logging 模块记录日志,将之前写的 sendMail 脚本引入用于发邮件
要想引入之前写的 sendMail.py,可以参考:https://blog.csdn.net/qq_40903527/article/details/127708087
我是将脚本放到 python 的安装目录下,与 python.exe 同级,这样比较简单高效

2.6 Python 打包

编写完上面介绍的脚本以后,经过 Python 编译已经可以实现我们想要的效果了,可以放到服务器上使用了。但我们还得给服务器下载 python,想想我们一开始安装 Python 的过程,是不是还是觉得有些麻烦呢?如果可以省去 python 安装的过程,形成一个可以独立运行的程序,那就方便很多了。这里就可以用 Python 自带打包功能进行打包,打包完以后可以形成一个独立运行的 exe 文件,无需再安装 python,直接就可以使用

需要先下载打包插件,执行命令:pip install pyinstaller
下载完成后,cd 到我们的 py 脚本工程目录下,执行打包命令
打包基础命令:pyinstaller -F test_package.py
扩展命令:pyinstaller -F -w -i test.ico test_package.py
-w:不出现 dos 窗口,不会打印 print 函数
-i test.ico 指定 ico 图标

打包完成以后会生成几个文件:build 文件夹,dist 文件夹,spec 文件
我们进入 dist 文件夹后就可以发现我们打包的 exe 文件,这个就是我们真正需要的可执行的文件

需要在 exe 同级目录下,放入之前写的 sql 文件和 logs 文件夹,不然会报错

打包后截图.png

3 结合 windows 的任务计划程序,定时执行脚本

右键计算机 -> 管理 -> 任务计划程序 -> 创建基本任务 -> 按照计划步骤配置即可

表空间预警-任务计划程序配置.png

表空间预警-任务计划程序.png

4 最终结果

邮件结果

表空间预警-邮件.png

扩容文件的生成

image-20230602120303758.png

日志生成

表空间-日志内容.png

5 附件(完整笔记 /Python 脚本)

完整笔记:Oracle 表空间监控 - 邮件预警和自动扩容.pdf
附 Python 脚本:Python 脚本.zip