获取Oracle数据库段的大小

我们在日常Oracle维护中可能需要知道数据库哪个表占用的空间最大

下面这个功能可实现这个功能

开发环境

操作系统:CentOS 7.3

Python版本 :2.7

Django版本: 1.10.5

操作系统用户:oracle

建立页面的步骤

我们还是通过这张图的步骤来说明如何建立页面

Alt text

urls.py页面

首先是monitor/urls.py,这节不需要修改这个文件

urlpatterns = [
   url(r'^$', views.index, name='index'),
   url(r'^oracle_command/$',views.oracle_command, name='oracle_command'),
   url(r'^commandresult/$',views.commandresult, name='commandresult'),
]

oracle_command为执行Oracle命令的页面

commandresult为执行完Oracle命令显示结果的页面

views.py

下面为commandresult对应的函数在views.py里面的写法

    elif command_content=='check_segments_size':
        try:
            db = cx_Oracle.connect(username+'/'+password+'@'+ipaddress+':'+port+'/'+tnsname ,mode=cx_Oracle.SYSDBA)
        except Exception , e:
            content= (ipaddress+' is Unreachable,The reason is '+ str(e)).strip()
            return HttpResponse(content)
        else:

            cursor = db.cursor()
            row=getsegmentssize(cursor)
            cursor.close()
            db.close()
            title='数据库段的大小-'+ipaddress+'-'+tnsname
            tr=['OWNER','SEGMENTS_NAME','SEGMENTS_TYPE','TABLESPACE_NAME','BYTES/GB']
            dic ={'title':title,'tr':tr,'row':row}
            return render_to_response('oracle_command_result_5.html',dic)
  1. 首先获取到表单中的数据,如 ipaddress,tnsname以及执行的命令

  2. 然后通过ipaddress,tnsname从oraclelist数据库中查找获得用户名密码用于连接

  3. 再判断命令内容,如果是check_segments_size则执行函数getsegmentssize,这里的getsegmentssize函数获取Oracle大小大于1G的段并按大小降序排列,详情看具体代码

  4. 最后把页面的标题以及表格的数据放到dic变量中传到 oracle_command_result_5.html模板文件中

getsegmentssize函数

这里我们引用getsegmentssize函数来获取Oracle大小大于1G的段并按大小降序排列,具体看SQL语句

monitor/command/getoraclecommandresult.py

def getsegmentssize(cursor):
   fp1='SELECT OWNER,segment_name,SEGMENT_TYPE,TABLESPACE_NAME ,BYTES/1024/1024 FROM DBA_SEGMENTS WHERE BYTES/1024/1024>1024 ORDER BY BYTES DESC'
   s=cursor.execute(fp1)
   row=s.fetchall()
   return row

template文件

这里我们依旧使用oracle_command_result_5.html文件来显示

oracle_command_result_5.html

<div id='newadd'>
<h3>{{title}}</h3>
<table class="table">
  <thead>
    <tr>
{% for i in tr %}
        <th>{{i}}</th>
{%endfor%}
    </tr>
  </thead>
{% for a,b,c,d,e in row %}
<tbody>
            <tr>
                <td>{{a}}</td>
                <td>{{b}}</td>
                <td>{{c}}</td>
                <td>{{d}}</td>
                <td>{{e}}</td>
            </tr>
</tbody>
{% endfor %}
</table>
</div>

该模板是一个table ,通过将传过来的变量显示在前端页面

实际效果

http://10.65.202.218:8081/monitor/oracle_command/

Alt text

源码地址

源码请查看我的GitHub主页

https://github.com/bsbforever/wechat_monitor

下期将介绍如何如何通过操作系统的进程号获取对应的SQL语句