针对数据库升级版本信息采集脚本编写

【环境介绍】

系统环境:Linux + 11G+ 集群/单机

【背景描述】

需求:每个季度都会有数据库漏洞扫描修复的事情,了解该扫描方式是根据数据库版本来进行判断是否当前数据库版本是否修复相应漏洞。而已一般漏洞信息分DBMS/OJVM/GRID类型漏洞。如果是当前维护的数据库,自己取数据库版本信息比较容易,但是大多时候接到协助升级的时候收集信息比较麻烦。需要较快的采取数据库版本信息和系统信息来进行写方案或者判断当前数据库是否需要升级及风险判断。

【监控优化过程及思路】

对于上面描述的问题:

1,  主机信息数据采集。                         ----直接使用主机命令采集

主机名(方案),系统版本(方案及补丁集下载),IP信息(判断主机IP信息),系统空间(是否满足备份及升级空间)

2,  数据信息数据采集。                      ----使用Oracle查询信息

Opatch版本信息,数据库lsinventory信息,数据库one-of-patch信息,审计路径(备份软件排除审计日志文件)

3,  数据结构分类。                                ----单机、集群

【测试结果及脚本】

通过测试脚本。结果如下:

1,  主机数据信息:截图如下:

2,  数据库信息:截图如下:

【采集数据脚本信息】

主要实现功能的脚本如下:

1,  使用shell进行数据处理,具体脚本解释如下:

cat >oracle_message.sh

######################################################################

# oracle_message.sh

# This script is update check data

# Author CZT

######################################################################

#!/bin/bash

ORACLE_USER=`ps -ef |grep "ora_pmon_" |grep -v grep |head -1 |awk ‘{print $1}‘`

GRID_USER=`ps -ef |grep "asm_pmon_" |grep -v grep |head -1 |awk ‘{print $1}‘`

process_names=`ps -ef |grep "ora_pmon_" |grep -v grep |awk ‘{print $NF}‘`

process_asms=`ps -ef |grep "asm_pmon_" |grep -v grep |awk ‘{print $NF}‘`

instance_names=`echo ${process_names} |sed ‘s/ora_pmon_//g‘`

instance_names=`echo ${process_names} |sed ‘s/ora_pmon_//g‘`

instance_asm=`echo ${process_asms} |sed ‘s/asm_pmon_//g‘`

v_date=`date ‘+%Y-%m-%d %H:%M:%S‘ ` 》》》设置Oracle及grid的环境变量

function get_value_of_parameter{

parameter_name=${2}

typeset CONNECT_CMD=‘connect / as sysdba‘

typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"

typeset SQL_OPT="set echo off feedback off heading off underline off"

typeset SQL_CMD_CLUSTER=‘select value from v\$system_parameter where name=‘"‘${parameter_name}‘"

database_cluster=`su - ${ORACLE_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!

${CONNECT_CMD}

${SQL_EXIT_OPT}

${SQL_OPT}

${SQL_CMD_CLUSTER};

!"`

echo $database_cluster} 》》》判断数据库是否为集群函数

function get_dba_registry_history{

typeset CONNECT_CMD=‘connect / as sysdba‘

typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"

typeset SQL_OPT="set linesize 200 pagesize 20 echo off feedback off"

typeset SQL_CMD_REGISTRY=‘select * from dba_registry_history‘

typeset SQL_CMD_VERSION=‘select * from v\$version‘

typeset SQL_CMD_AUDIT=‘show parameter audit_file_dest‘

su - ${ORACLE_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!

col action format a20

col namespace format a10

col version format a28

col comments format a40

col action_time format a30

col bundle_series format a15

${CONNECT_CMD}

${SQL_EXIT_OPT}

${SQL_OPT}

${SQL_CMD_REGISTRY};

${SQL_CMD_VERSION};

${SQL_CMD_AUDIT};

!"} 》》》查询数据库字典信息函数

function get_asm_registry_history{

typeset CONNECT_CMD=‘connect / as sysasm‘

typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"

typeset SQL_OPT="set linesize 200 pagesize 20 echo off feedback off"

typeset SQL_CMD_AUDIT=‘show parameter audit_file_dest‘

su - ${GRID_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!

col action format a20

col namespace format a10

col version format a28

col comments format a40

col action_time format a30

col bundle_series format a15

${CONNECT_CMD}

${SQL_EXIT_OPT}

${SQL_OPT}

${SQL_CMD_AUDIT};

!"} 》》》查询+ASM实例审计路径信息函数

function get_value_of_system{

echo -e ‘

==========================

Hostname

==========================

hostname;

echo -e ‘

==========================

Systemrelease

==========================

cat /etc/*release*;

echo -e ‘

==========================

System space

==========================

df -h;

echo -e ‘(4)SYSTEM HOSTS‘

echo -e ‘

==========================

System hosts

==========================

cat /etc/hosts;}  》》》采集主机信息数据函数

function get_value_of_database{

ORACLE_BASE=`cat /home/oracle/.bash_profile|grep -wi ‘export ORACLE_BASE‘|awk -F "[=:]" ‘{print $NF}‘`

ORACLE_HOME=`cat /home/oracle/.bash_profile|grep -wi ‘export ORACLE_HOME‘|awk -F "[=:]" ‘{print $NF}‘`

echo -e ‘

==========================

Opatch version

==========================

su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch version"

echo -e ‘

==========================

Opatch lsinventory

==========================

su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch lsinv"

echo -e ‘

==========================

Opatch lspatches

==========================

su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch lspatches"

}

###judge the current user if root,need to root run the script

if [ `whoami` = "root" ];then 》》》判断使用root用户执行该脚本

echo -e ‘                   *** Start of LogFile ***                                                           ‘

echo -e ‘       Oracle Database Upgrade Statistics Geting               ‘ $v_date

###check system state

echo -e ‘---------------------------------------------SYSTEM STATE-------------------------------------‘

###get system state

get_value_of_system

###judge the system have many instance

for instance in ${instance_names}

do

###judge the database cluster

v_database_cluster=`get_value_of_parameter ${instance} "cluster_database"`

if [ "${v_database_cluster}" == "TRUE" ];then

echo -e ‘

==========================

The Database Is RAC

==========================

###check database state

echo -e ‘--------------------------------------DATABASE STATE------------------------------------‘

echo -e ‘

=============================================================================

The Database Is RAC 》》》判断为集群架构

=============================================================================

###get database opatch state

get_value_of_database   》》》调用采集数据库信息函数

echo -e ‘

==========================

Dba Registry History

==========================

get_dba_registry_history  ${instance}   》》》调用采集数据库信息函数

get_asm_registry_history  ${instance_asm}  》》》调用采集ASM实例审计路径函数

else

###check database state

echo -e ‘--------------------------------------------DATABASE STATE------------------------------------‘

echo -e ‘

=============================================================================

The Database Is Standlone 》》》判断为单机架构

=============================================================================

###get database opatch state

get_value_of_database

echo -e ‘

==========================

Dba Registry History

==========================

get_dba_registry_history  ${instance}

fi

done

echo -e ‘                                                                                                                               ‘

echo -e ‘             *** End of LogFile ***                                             ‘

else

echo "Please use root run the script"

fi

【问题思考】

1,  存在系统版本限制,该脚本适用于linux Solaris系统采集数据;

2,  存在数据库版本限制,适用于11G版本数据库采集数据;

3,  存在环境变量限制,Oracle用户及grid用户的profile需要采用标准的写法设置变量。

【总结】:

1,  在对外部协助数据库漏洞核查时,使用该脚本更加快捷的采集信息,对编写方案及更快的对数据库环境的大致了解对数据库升级操作提供安全保障。

2,  本次脚本涉及使用root用户执行脚本调用Oracle及grid用户的变量,对用户的变量设置标准有较大的要求。

原文地址:https://www.cnblogs.com/zetanchen/p/8541924.html

时间: 2024-08-21 20:02:48

针对数据库升级版本信息采集脚本编写的相关文章

【转】用PowerDesigner制作数据库升级脚本

[原创]用PowerDesigner制作数据库升级脚本 很多人使用PD的时候就问有没有制作自动升级脚本的功能.其实是有的. 操作原理: 1.保存原来的版本,另存为apm的文件,生成一个Archive Model. 2.生成升级脚本,需要选择原来的版本 操作步骤: 1.打开PDM文件,选择Save as .... 另存为,在弹出的窗口中选择apm的文件类型,输入文件名保存即可. 2.修改相关的数据模型的内容,然后保存. 3.选择DataBase菜单中的modify database... 菜单 4

【升级至sql 2012】sqlserver mdf向上兼容附加数据库(无法打开数据库 &#39;xxxxx&#39; 版本 611。请将该数据库升级为最新版本。)

sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611.请将该数据库升级为最新版本.) 最近工作中有一个sqlserver2005版本的mdf文件,还没有log文件,现在需要 附加到sqlserver2012,经过网上一顿搜索,把完整的过程奉上,供大家参考 首先创建数据库 再设置数据库的兼容性(经过尝试,此步骤可以省略) 停掉sqlserver 服务,将需要附件的mdf文件替换掉创建数据生成的mdf,删除掉对应的ldf文件 再启动sqlserver 服务 执行

MySQL/MariaDB/Percona数据库升级脚本

MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本之间兼容问题,脚本默认仅支持同一大版本之间的升级,如:MySQL- 5.6.25升级到MySQL-5.6.26.MySQL-5.5.44升级到MySQL-5.5.45.MariaDB-10.0.20升级到 MariaDB-10.0.21:不能跨分支版本且不能跨大版本,如从MySQL-5.5.44升级到Perc

nginx通过shell脚本平滑升级版本

1.简介 有时候nginx发布了新BUG或者添加了新的功能时,想要更新的时候服务又不能中断,这时候就要用到nginx的平滑升级了. 该脚本同样适用于添加新扩展,添加新扩展的时候只需要把更新的版本修改为当前版本,更新的时候把需要添加的扩展加上去即可.我这里nginx安装目录为/usr/local/nginx当前系统,阿里云ECS CentOS 7 64位 2.查看nginx版本与编译信息/usr/local/nginx/sbin/nginx -V 注:这里的扩展要记录下来(重要),等下升级的时候用

数据库低版本附加高版本的问题

我的机房收费系统是在自己笔记本上敲的,敲完了以后把本上数据库拷了出来,放到台式机上,准备通过台式机来验收系统.当我附加数据库的时候,提示 "数据库'charge_sys'的版本为661,无法打开.此服务器支持655版及更低版本.不支持降级路径." 这是因为我本上的SQL是2008R2版的,而机房的电脑上的数据库是2008版的(当然,2008版以下的也会出现这种情况).暂时我知道的解决方法只有 两种: 一.就是把低版本电脑的SQL升级,升到高版本就可以了.但这样不仅浪费时间,而且很麻烦.

Greenplum数据库升级实务(上)

任何系统的升级都有个量变到质变的过渡:版本相差小的时候,通常很简单,版本相差大的时候,就是一场噩梦.不过版本相差小的时候,大伙儿往往安于现状.本文实际记录从GP4.2.7.2到4.3.5.0的升级过程,从版本号看相差不大,但是GP的版本命名中,第二位的变化就已经是大升级了.另需说明的是,本文升级的GP数据库规模不小,用户较多,管理混沌,在加上GP实在是有点儿脆弱(相比oracle等),所以遇到了较多元数据问题(请参加前4篇). 起点 数据库版本:Greenplum Database 4.2.7.

一劳永逸的数据库升级方案

数据库升级方案 一.面临的问题 在项目中数据库升级是经常遇到的事情,这个工作比较繁琐,特别是在线数据库升级需要十分小心,我们先来看一下通常面临的问题: 1.    表修改,包括增加了字段.修改了字段类型或者长度,更换了主键等.对于表的升级不能删除重建,需要单独修改,或者写脚本来升级. 2.    视图的修改,视图的修改比较简单,无非是增加了字段,取消了字段,不影响基础数据.视图的升级可以删除重建. 3.    存储过程的修改,存储过程的修改和视图一样,可以删除重建,二者都可以通过脚本来完成. 4

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3升级到11.2.0.4完整步骤 说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1升级到11.2.0.3的过程,当然RAC的升级是会有所不同.但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance. Oracle 11.2.0.4的Patchset No:19852360下载需要有Oracle Support才可以.  Patchset包含有7个

数据库升级问题—ORA-39700: database must be opened with UPGRADE option

1. 错误描述 一个数据较长时间未使用了,最近启动时出现如下错误: SQL> startup Oracle instance started. Total System Global Area 4932501504 bytes Fixed Size                  2103096 bytes Variable Size            889194696 bytes Database Buffers        4026531840 bytes Redo Buffers