在Linux系统上同时监控多个Oracle数据库表空间的方法
作者:goldensun 发布时间:2024-01-20 20:29:29
一,设计背景
由于所在公司ORACLE数据库较多,传统人工监控表空间的方式较耗时,且无法记录历史表空间数据,无法判断每日表空间增长量,在没有gridcontrol/cloudcontrol软件的情况下,笔者设计如下表空间监控方案,大家也可以根据自己的实际情况对下面的方案进行修改。
二,设计思路
通过dblink将来查询到的表空间数据集中汇总到一张表里通过crontab跑定时任务从各台服务器获取表空间使用情况信息。
三,具体实施步骤
1.所在oracle数据库ip地址信息(下面为举例说明具体情况要根据所在环境设置)
2.在tbsmonitor主机上创建tbsmonitor表空间
create tablespace tbsmonitor datafile '/opt/u01/app/oradata/tbsmonitor/tsmonitor.dbf' size 50M autoextend on;
3.在tbsmonitor和database1/database2/database3上建立tbsmonitor用户用来做表空间监控。
create user tsmonitor identified by I11m8cb default tablespace tsmonitor;
4.为了tbsmonitor用户赋权用来查找表空间使用情况。
grant resource to tbsmonitor;
grant create session to tbsmonitor;
grant create table to tbsmonitor;
grant select on dba_data_files to tbsmonitor;
grant select on dba_free_space to tbsmonitor;
5.在tbsmonitor上建立database1/ database2/ database3的tnsnames.ora连接,在tnsnames.ora文件中加入
DATABASE1 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.21.1)(PORT=1521))
(CONNECT_DATA=(SID= database1)))
DATABASE2 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.21.2)(PORT=1521))
(CONNECT_DATA=(SID= database2)))
DATABASE3 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.21.3)(PORT=1521))
(CONNECT_DATA=(SID= database3)))
6.修改/etc/hosts文件,如果有dns服务器的话可以略过
10.1.21.2 database1
10.1.21.3 database2
10.1.21.4 database3
7.在tbsmonitor主机设置dblink,这样就能通过dblink从被监控服务器远程抽取表空间信息。
create database link TO_DATABASE1
connect to TSMONITOR identified by I11m08cb
using 'DATABASE1';
create database link TO_DATABASE2
connect to TSMONITOR identified by I11m08cb
using 'DATABASE2';
create database link TO_DATABASE3
connect to TSMONITOR identified by I11m08cb
using 'DATABASE3';
8.建立tbsmonitor表,表空间统计数据将插入这张表。
create table tbsmonitor.tbsmonitor
(
ipaddress VARCHAR2(200),
instancename VARCHAR2(200),
tablespace_name VARCHAR2(200),
datafile_count NUMBER,
size_mb NUMBER,
free_mb NUMBER,
used_mb NUMBER,
maxfree NUMBER,
pct_used NUMBER,
pct_free NUMBER,
time DATE
) tablespace tbsmonitor;
9. 在crontab中运行每日0点1分更新数据库表空间信息的脚本tbsmonitor.sh(我根据业务需要每日统计一次,大家也可以通过业务要求修改统计频率)
1 0 * * * /opt/u01/app/oracle/tbsmonitor.sh
#!/bin/bash
#FileName: tbsmonitor.sh
#CreateDate:2016-01-1
#version:1.0
#Discription:take the basic information to insert into the table tbs_usage
# Author:FUZHOU HOT
#Email:15980219172@139.com
ORACLE_SID= tbsmonitor
ORACLE_BASE=/opt/u01/app
ORACLE_HOME=/opt/u01/app/oracle
PATH=$ORACLE_HOME/bin:$PATH;export PATH
export ORACLE_SID ORACLE_BASE ORACLE_HOME
date>>/opt/u01/app/oracle/tbsmonitor.sh
sqlplus sys/I11m08cb as sysdba <<EOF >> /opt/u01/app/oracle/tbsmonitor.log 2>&1
@/opt/u01/app/oracle/tbsmonitor/ tbsmonitor.sql;
@/opt/u01/app/oracle/tbsmonitor/database1.sql;
@/opt/u01/app/oracle/tbsmonitor/database2.sql;
@/opt/u01/app/oracle/tbsmonitor/database3.sql;
EOF
echo >> /opt/u01/app/oracle/ tbsmonitor.log
11.创建插入脚本(拿database1举例,以此类推)
/opt/u01/app/oracle/tbsmonitor/database1.sql; /opt/u01/app/oracle/tbsmonitor/database2.sql;
/opt/u01/app/oracle/tbsmonitor/database3.sql;
/opt/u01/app/oracle/tbsmonitor/ tbsmonitor.sql;
Sql脚本如下
insert into tsmonitor.tbsmonitor SELECT utl_inaddr.get_host_address('DATABASE1') ipaddress,
(select instance_name from v$instance) instancename,
df.tablespace_name,
COUNT(*) datafile_count,
ROUND(SUM(df.BYTES) / 1048576) size_mb,
ROUND(SUM(free.BYTES) / 1048576, 2) free_mb,
ROUND(SUM(df.BYTES) / 1048576 - SUM(free.BYTES) / 1048576, 2) used_mb,
ROUND(MAX(free.maxbytes) / 1048576, 2) maxfree,
100 - ROUND(100.0 * SUM(free.BYTES) / SUM(df.BYTES), 2) pct_used,
ROUND(100.0 * SUM(free.BYTES) / SUM(df.BYTES), 2) pct_free,sysdate time
FROM dba_data_files@TO_DATABASE1 df,
(SELECT tablespace_name,
file_id,
SUM(BYTES) BYTES,
MAX(BYTES) maxbytes
FROM dba_free_space@TO_DATABASE1
GROUP BY tablespace_name, file_id) free
WHERE df.tablespace_name = free.tablespace_name(+)
AND df.file_id = free.file_id(+)
GROUP BY df.tablespace_name
ORDER BY 6;
12.查看表空间使用占比可以使用如下语句(如果要查看某台机器可以带上条件where ipaddress='xxxx' and instance='xxxxx' and to_char(time,'yyyy-mm-dd')='xxxx-xx-xx')
SELECT IPADDRESS ,
Instancename,
tablespace_name,
datafile_count,
size_mb "表空间大小(M)",
used_mb "已使用空间(M)",
TO_CHAR(ROUND((used_mb) / size_mb * 100,
2),
'990.99') "使用比",
free_mb "空闲空间(M)"
FROM tbsmonitor. tbsmonitor order by "使用比" desc
13.查看每日增量可以使用如下脚本。(下面显示的是4-8日10.1.21.2表空间增长的情况)
select a.tablespace_name,(b.used_mb-a.used_mb) increase,a.ipaddress from
(select * from tsmonitor.tbs_usage where to_char(time,'yyyy-mm-dd')='2016-01-04') a,
(select * from tsmonitor.tbs_usage where to_char(time,'yyyy-mm-dd')='2016-01-08') b
where a.tablespace_name=b.tablespace_name and a.IPADDRESS=b.IPADDRESS order by increase desc
select * from tbsmonitor. tbsmonitor where ipaddress='10.1.21.2' and to_char(time,'yyyy-mm-dd')='2016-01-08'
猜你喜欢
- 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。 在Python
- 这篇文章主要介绍了Python接口自动化判断元素原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 在利用opencv进行图片处理时,经常需要查看图片关心区域或位置的像素数值,苦于没有应手的小软件,我用python3.6+opencv3.4
- 一般删除文件时使用os库,然后利用os.remove(path)即可完成删除,如果删除空文件夹则可使用os.removedirs(path)
- 今天笔者想对pandas中的行进行去重操作,找了好久,才找到相关的函数先看一个小例子from pandas import Series, D
- 大家好,我叫斑马纹列表中使用两种相同的样式但颜色不同的背景,来间隔显示的内容。当然这个释义我是借鉴《designing interfaces
- 随着互联网的快速发展和数据交换的广泛应用,各种数据格式的处理成为软件开发中的关键问题。JSON 作为一种通用的数据交换格式,在各种应用场景中
- 我们知道,Diango 接收的 HTTP 请求信息里带有 Cookie 信息。Cookie的作用是为了识别当前用户的身份,通过以下例子来说明
- 一、项目介绍爬取网址:CSDN首页的Python、Java、前端、架构以及数据库栏目。简单分析其各自的URL不难发现,都是https://w
- 列表列表是Python中最具灵活性的有序集合对象类型。与字符串不同的是,列表可以包含任何类型的对象:数字、字符串甚至其他列表。列表是可变对象
- 1、什么是AspJpeg?AspJpeg是一款功能强大的基于Microsoft IIS环境的图片处理组件,网络上对其进行详细和深入介绍的中文
- 前言:pandas 中的索引意味着只需从系列中选择特定数据。索引可能意味着选择所有数据,其中一些数据来自特定列。索引也可以称为子集选择。使用
- 如下所示:# -*-coding:utf-8 -*-def do_telnet(Host, username, password, fini
- 本文主要向大家分享了Python编程中通过Django模块实现用户注册以及邮箱验证功能的简单介绍及代码实现,具体如下。用户注册:类似于用户登
- pycharm安装cv2模块安装失败和无法使用的解决步骤一我们先到这个网址:cv2下载地址去下载与自己python版本号和电脑位数对应的op
- 1.bisect模块概述bisect是python的内置模块, 用于有序序列的插入和查找。 插入的数据不会影响列表的排序, 但是原有列表需要
- 检测剪刀石头布三种手势,通过摄像头输入,方法如下:选用合适颜色空间及阈值提取皮肤部分使用滤波腐蚀膨胀等方法去噪边缘检测寻用合适方法分类Ope
- 在Python3.6提供f-Strings新的字符串格式化语法。不仅更加可读、简洁,相比其他方式也不易造成错误,而且还更快。看完本文你将学习
- Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。Python本身也内置一组模块(
- 如下所示:#python解决字符串倒序输出def string_reverse(m): num=len(m) a=[] for i in r