专栏首页大大刺猬PYTHON 自动化运维 -- 绘制数据库表空间变化图
原创

PYTHON 自动化运维 -- 绘制数据库表空间变化图

1.获取数据库表空间变化情况:

已oracle为例(sql语句见文末:根据自己的修改,比如PDB名字,保存的位置等):

把结果保存为.txt文件

查看的内容大概是这样的

2.把它转换为CSV格式,这种格式操作起来方便点:

不会的可已用以下shell脚本跑 (shell脚本见文末,github打不开现在.....)

3.然后交给python去划图,python代码见文末:

效果如下(我的全是系统表空间,生产上使用的时候注意把单位换成G 好看些):

脚本如下

查询表空间变化的SQL

alter session set container=OGGSPDB;
set feedback off;
set pagesize 0;
set linesize 9999;
set termout off;
set heading off;
set echo off;
set trimspool on;
spool ./result/PDB_OGGSPDB_TABLESPACE_30DAYS_CHANGE.txt;
select a.name, b.*
  from v$tablespace a,
       (select tablespace_id,
               trunc(to_date(rtime, 'mm/dd/yyyy hh24:mi:ss')) datetime,
               max(tablespace_usedsize * 8 / 1024) used_size
          from dba_hist_tbspc_space_usage
         where trunc(to_date(rtime, 'mm/dd/yyyy hh24:mi:ss')) >
               trunc(sysdate - 30)
         group by tablespace_id,
                  trunc(to_date(rtime, 'mm/dd/yyyy hh24:mi:ss'))
         order by tablespace_id,
                  trunc(to_date(rtime, 'mm/dd/yyyy hh24:mi:ss'))) b
 where a.ts# = b.tablespace_id order by name,datetime;
spool off;

shell脚本 tocsv.sh

#!/bin/env bash
#write by ddcw at 20200421
for i in $@
do
	csv=$(echo $i | awk -F .txt '{print $1}').csv
	cat /dev/null > $csv
	while read line
	do
		echo $line | awk  '{for(i=1;i<=NF;i++){printf "\""$i"\","}}' >> $csv
		echo '' >> $csv
	done < $i
	sed -i 's/\(.*\)\(.\)/\1/g' $i
done

python 把这个表空间的信息画成图:

import csv
import matplotlib.pyplot as plt
# old_tablespace_name='SYSTEM'
old_tablespace_name=''
date_one_month=list(range(30))
day_x=[]
days=0
min_size=99999999
max_size=0
total_change=0
used_size=[]
first_day_size=-1
last_day_size=0
#for your csv file about TABLESPACE CHANGE
with open('.//result//PDB_OGGSPDB_TABLESPACE_30DAYS_CHANGE.csv', 'r') as f:
    reader = csv.reader(f)
    t = reader
    t=0
    for inx,row in enumerate(reader):
        if inx == 0 :
            old_tablespace_name=str(row[0])
        if first_day_size == -1:
            first_day_size=float(row[3])
        if row[0]==old_tablespace_name:
            used_size.append(float(row[3]))
            old_tablespace_name=str(row[0])
            day_x.append(row[2].split('-')[0])
            if max_size < float(row[3]):
                max_size = float(row[3])
            if min_size > float(row[3]):
                min_size = float(row[3])
            last_day_size=float(row[3])
            days += 1
        else:
            total_change += last_day_size-first_day_size
            plt.plot(day_x,used_size,label='SIZE/DAYS AVG '+str(round((last_day_size-first_day_size)/days ,2))+' MB')
            plt.legend()
            plt.title(old_tablespace_name+'  +'+str(round(last_day_size-first_day_size ,2))+' MB',fontsize = 24)
            plt.ylabel("SIZE_MB",fontsize = 14)
            plt.xlabel("IN "+str(days)+" DAYS",fontsize = 14)
            plt.show()
            #init parameters
            days=0
            min_size=99999999999999
            max_size=0
            day_x=[]
            day_x.append(row[2].split('-')[0])
            first_day_size=float(row[3])
            used_size=[]
            used_size.append(float(row[3]))
            first_day_size=-1
            days += 1
            old_tablespace_name=str(row[0])

#             plt.legend()
print('TOTAL CHANGE:',round(total_change,2),'GB')

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 制作RPM包

    redhat系列的linux使用RPM来管理安装软件很方便,把自己常用的脚本变成RPM包之后,用起来就方便了。

    大大刺猬
  • 从 1 到 0 构建博客项目(2) -- 操作系统篇(2)--定制Centos

    删除检查选项的默认(不删除的话,就不得行,只能有一个默认,当然你手选也行,但就没得定制镜像的意义了撒)

    大大刺猬
  • python: 1-2+3-4+5....+99

    大大刺猬
  • 【Go 语言社区】Go语言Slice去重

    package main import ( "fmt" ) func main() { a := []int{2, 1, 2, ...

    李海彬
  • 408. 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示) 样例 a = 11 b = 1 返回 100 非常惭愧还不是自己想来的算法,注意到几点: 1.数...

    和蔼的zhxing
  • 老司机带你走进Core Animation 之CAAnimation

    开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理。不过既然我现在回来了,那么这将是一个井喷的时节...

    老司机Wicky
  • 一日一技:如何更好地理解归并排序?

    在昨天的文章里面,我们已经知道,可以使用 heapq.merge把两个有序列表合并成新的有序列表。

    青南
  • 彻底了解CSS3帧动画

    animation-name 可以指定多个值,每个用 , 隔开,多个值表明有多个帧动画。

    多云转晴
  • 页面copyright部分始终居于页面底部

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html...

    欢醉
  • 视频云端流媒体平台EasyNVR如何ping通外网地址?

    像我们做技术的人员,应该对ping这个命令非常熟悉,ping命令是用来bai检测你的电脑和你所输入的IP地址是否都有数据通讯,以判断网络通不通。在我们做视频云端...

    EasyNVR

扫码关注云+社区

领取腾讯云代金券