数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

让我们一起学做业余DBA!


发布日期:2022年01月08日
 
让我们一起学做业余DBA!

前言

这篇文章介绍了DBA每天在监控Oracle数据库方面的职责讲述了如何通过shell脚本来完成这些重复的监控工作本文首先回顾了一些DBA常用的Unix命令以及解释了如何通过Unix Cron来定时执行DBA脚本同时文章还介绍了个重要的脚本来监控Oracle数据库

检查实例的可用性

检查监听器的可用性

检查alert日志文件中的错误信息

在存放log文件的地方满以前清空旧的log文件

分析table和index以获得更好的性能

检查表空间的使用情况

找出无效的对象

监控用户和事务

DBA需要的Unix基本知识

基本的UNIX命令

以下是一些常用的Unix命令

ps显示进程

grep搜索文件中的某种文本模式

mailx读取或者发送mail

cat连接文件或者显示它们

cut选择显示的列

awk模式匹配语言

df显示剩余的磁盘空间

以下是DBA如何使用这些命令的一些例子

显示服务器上的可用实例

$ ps ef | grep smon

oracle Feb ? : ora_smon_oradb

oracle Feb ? : ora_smon_oradb

dliu :: pts/ : grep smon

oracle :: ? : ora_smon_oradb

oracle Mar ? : ora_smon_oradb

显示服务器上的可用监听器

$ ps ef | grep listener | grep v grep

(译者注grep命令应该加上i参数即grep i listener该参数的作用是忽略大小写因为有些时候listener是大写的这时就会看不到结果)

oracle Feb ? : //bin/tnslsnr listener_db inherit

oracle :: ? : //bin/tnslsnr listener_db inherit

oracle Feb ? : //bin/tnslsnr listener_db inherit

oracle Mar ? : //bin/tnslsnr listener_db inherit

查看Oracle存档目录的文件系统使用情况

$ df k | grep oraarch

/dev/vx/dsk/proddg/oraarch % /u/oraarch

统计alterlog文件中的行数

$ cat alertlog | wc l

列出alertlog文件中的全部Oracle错误信息

$ grep ORA alertlog

ORA: internal error code arguments: [kcrrrfswda] [] [] [] [] []

ORA: internal error code arguments: [] [] [] []

CRONTAB基本

一个crontab文件中包含有六个字段

分钟

小时

月中的第几天

月份

星期几 with = Sunday

Unix命令或者Shell脚本

要编辑一个crontab文件输入

Crontab e

要查看一个crontab文件输入

Crontab l

* * /dba/admin/analyze_tableksh

* * /dba/admin/hotbackupksh /dev/null >&

在上面的例子中第一行显示了一个分析表的脚本在每个星期am运行第二行显示了一个执行热备份的脚本在每个周三和周六的am运行

监控数据库的常用Shell脚本

以下提供的个shell脚本覆盖了DBA每日监控工作的%你可能还需要修改UNIX的环境变量

检查Oracle实例的可用性

oratab文件中列出了服务器上的所有数据库

$ cat /var/opt/oracle/oratab

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

## /var/opt/oracle/oratab ##

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

oradb:/u/app/oracle/product/:Y

oradb:/u/app/oracle/product/:Y

oradb:/u/app/oracle/product/:N

oradb:/u/app/oracle/product/:Y

以下的脚本检查oratab文件中列出的所有数据库并且找出该数据库的状态(启动还是关闭)

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

## ckinstanceksh ## ###################################################################

ORATAB=/var/opt/oracle/oratab

echo `date`

echo Oracle Database(s) Status `hostname` :\n

db=`egrep i :Y|:N $ORATAB | cut d: f | grep v \# | grep v \*`

pslist=`ps ef | grep pmon`

for i in $db ; do

echo $pslist | grep ora_pmon_$i > /dev/null >$

if (( $? )); then

echo Oracle Instance $i: Down

else

echo Oracle Instance $i: Up

fi

done

使用以下的命令来确认该脚本是可以执行的

$ chmod ckinstanceksh

$ ls l ckinstanceksh

rwxrr oracle dba Mar : ckinstanceksh*

以下是实例可用性的报表

$ ckinstanceksh

Mon Mar :: PST

Oracle Database(s) Status for DBHOST server:

Oracle Instance oradb: Up

Oracle Instance oradb: Up

Oracle Instance oradb: Down

Oracle Instance oradb: Up

检查Oracle监听器的可用性

以下有一个类似的脚本检查Oracle监听器如果监听器停了该脚本将会重新启动监听器

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

## cklsnrsh ##

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

#!/bin/ksh

DBALIST=priano;export DBALIST

cd /var/opt/oracle

rm f lsnrexist

ps ef | grep mylsnr | grep v grep > lsnrexist

if [ s lsnrexist ]

then

echo

else

echo Alert | mailx s Listener mylsnr on `hostname` is down $DBALIST

TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN

ORACLE_SID=db; export ORACLE_SID

ORAENV_ASK=NO; export ORAENV_ASK

PATH=$PATH:/bin:/usr/local/bin; export PATH

oraenv

LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH

lsnrctl start mylsnr

fi

检查Alert日志(ORAXXXXX)

每个脚本所使用的一些环境变量可以放到一个profile中

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

## oracleprofile ##

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

EDITOR=vi;export EDITOR ORACLE_BASE=/u/app/oracle; export

ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/; export

ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export

LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export

TNS_ADMIN NLS_LANG=american; export

NLS_LANG NLS_DATE_FORMAT=Mon DD YYYY HH:MI:SS; export

NLS_DATE_FORMAT ORATAB=/var/opt/oracle/oratab;export

ORATAB PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/

sbin:/usr/openwin/bin:/opt/bin:; export

PATH DBALIST=priano;export

DBALIST

以下的脚本首先调用oracleprofile来设置全部的环境变量如果发现任何的Oracle错误该脚本还会给DBA发送一个警告的email

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

## ckalertlogsh ##

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

#!/bin/ksh

/etc/oracleprofile

for SID in `cat $ORACLE_HOME/sidlist`

do

cd $ORACLE_BASE/admin/$SID/bdump

if [ f alert_${SID}log ]

then

mv alert_${SID}log alert_worklog

touch alert_${SID}log

cat alert_worklog >> alert_${SID}hist

grep ORA alert_worklog > alerterr

fi

if [ `cat alerterr|wc l` gt ]

then

mailx s ${SID} ORACLE ALERT ERRORS $DBALIST < alerterr

fi

rm f alerterr

rm f alert_worklog

done

清除旧的归档文件

以下的脚本将会在log文件达到%容量的时候清空旧的归档文件

$ df k | grep arch

Filesystem kbytes used avail capacity Mounted on

/dev/vx/dsk/proddg/archive % /u/archive<               

上一篇:Oracle弱智900问一

下一篇:Oracle技巧:用v$session