半自动化运维之动态添加数据文件(一)

简介: 在测试环境中,服务器和数据库实例真是多得数不胜数,自己也没有下意识去记住那个数据库实例在哪个服务器上,都是出了问题直接连过去解决。 这么多的数据库实例需要管理,表空间的监控是极为重要的,一般来说都会在给表空间设定一个阀值,比如说表空间剩余10%,20%等等,超出了阀值就会自动发送邮件,提醒DBA去做相应的处理,表空间监控如此,文件系统监控也是类似的思路。
在测试环境中,服务器和数据库实例真是多得数不胜数,自己也没有下意识去记住那个数据库实例在哪个服务器上,都是出了问题直接连过去解决。
这么多的数据库实例需要管理,表空间的监控是极为重要的,一般来说都会在给表空间设定一个阀值,比如说表空间剩余10%,20%等等,超出了阀值就会自动发送邮件,提醒DBA去做相应的处理,表空间监控如此,文件系统监控也是类似的思路。
最近处理了一些紧急的问题,看似是很小的问题,但是比较折腾人,比如说表空间超出了阀值,就会发送警告邮件,这个时候DBA就会连过去,处理问题的思路就是添加数据文件,这个时候就得考虑文件系统的空间情况。
比如有下面10个挂载点。
/u01,/u02,/u03....., /u10, 数据文件被打散分布在这几个挂载点上,如果对于数据文件的位置没有严格的要求,就是希望把数据文件分散分布,这个时候处理的思路就是使用df -k来得到对应的挂载点信息,然后在其中选择一个合适的,创建数据文件,仅此而已。
但是这个过程如果细细来看,确实是没有太多技术含量的,而且手动处理液不够及时,能不能发送了警告邮件,然后在数据库层面创建数据文件,可以在DBA稍后进行验证,这样问题处理也很及时,也不用DBA来总是手工处理这种看似紧急的问题。这也就是我为什么说是半自动化运维的一个思路。
解释了一通,来个图看看可能就更清楚了。
下面就是一些挂载点,在不同的服务器上会有所不同,在监控的时候如果需要添加数据文件,就需要尽量把数据文件分散到这些挂载点上,可以使用hash或者random的方式。

当然要实现也是看起来容易,做起来难。
先来看看表空间监控的部分,我们先来看看表空间监控的部分是怎么写的,在后续的章节补充是怎么添加数据文件的。
这个脚本依赖于一个配置文件。就是需要提供数据库实例名和主机名,像下面的形式,数据库TEST11G在主机oel1上。
$ cat master_sid.lst
TEST11G oel1
DG11G oel1


LOG_DIR=/home/ora11g/logs
DAY=`date +%d-%m-%Y:%H:%M" CST"`
HOST=`hostname`
SCRIPTNAME=free_tbs_alert.ksh
SCR_DIR=/home/ora11g/sid_list      --配置文件的路径
TARGET_CONN=n1/n1
export PATH=$ORACLE_SID/bin:$PATH
cp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace
cp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new
cp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert

##MAIN
for SID in ` cat $SCR_DIR/master_sid.lst |grep -v "^\#"|awk '{print $1}'`
do
_hst=`grep -iw $SID $SCR_DIR/master_sid.lst |grep -v "^\#"|awk '{ print $2}'`


#if [ `grep -iw $_hst $SCR_DIR/maint_hosts| wc -l ` -eq 0 ]
#then
$ORACLE_HOME/bin/sqlplus -s /nolog conn  ${TARGET_CONN}@$SID
set feed off head off 
set linesize 65
set pagesize 0
col TABLESPACE_NAME format a15
col "USED (MB)" format a12
col "FREE (MB)" format a10
col "PER_FREE (MB)" format a17
col "TOTAL (MB)" format a12
spool $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert
SELECT F.TABLESPACE_NAME,
TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),'999999') "USED (MB)",
TO_CHAR (F.FREE_SPACE, '999999') "FREE (MB)",
TO_CHAR (T.TOTAL_SPACE, '999999') "TOTAL (MB)",
TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||' %' PER_FREE
FROM (SELECT TABLESPACE_NAME,
ROUND (SUM (BLOCKS*(SELECT VALUE/1024 FROM V\$PARAMETER
WHERE NAME = 'db_block_size')/1024)) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES/1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME
AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) spool off
/
prompt
exit
EOF
#fi

HOST1=`$ORACLE_HOME/bin/tnsping $SID | tr -d " "|tr 'A-Z' 'a-z'|grep host |awk -F "host=" ' { print $2} '| awk -F ")" '{ print $1}'`

if [[ `cat $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|wc -l` -gt 0 && `grep ORA- $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|wc -l` -lt 1 ]]
then
cp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp
grep "%" $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|awk '{ print $3}'|sort|
while read _freeMB
do
if [[ $_freeMB -lt 2048 ]]
then
grep "%" $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|grep -w $_freeMB >> $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp
fi
done


cp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1
#if [ `cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp |wc -l ` -gt 0 ]
if [ `cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp |grep -iv "UNDO" |wc -l ` -gt 0 ]
then 
echo "DB Name: $SID          Host: $HOST1" >> $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1
cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp|sort -u >> $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1
cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1|sed "/^$/ d;" >>$LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace
echo "=============================================================" >>$LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace
fi
fi
done

echo "TABLESPACE_NAME USED (MB)    FREE (MB)  TOTAL (MB)   PER_FR      
--------------- ------------ ---------- ------------ ------      
" >> $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new
cat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace >> $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new
echo "DBA Team"| tee -a $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new
echo "Script Location on $HOST ${SCR_DIR}/${SCRIPTNAME}" | tee -a $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new

if [ `cat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace|wc -l` -gt 2 ]
then
cat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new
echo 'need to notify jianrong to help ' 
mailx -s "$1  : fi

整个过程就完成了表空间的监控,当然是一个初步的脚本还有一些不严谨的地方。
这个时候我们需要继续完成操作系统级的监控,这个监控是有一定的范围的。
我们可以先从得到数据库中数据文件的格式。
conn_str=n1/n1
print "
conn  $conn_str
set feedback off
set pages 0
 select file_name from dba_data_files;
" |sqlplus -s /nolog |awk -F"/" '{print   "/"$2}'|sort|uniq|awk '{print "df -k |grep -i \""$1 "\""}' > df_k_chk_tmp.ksh

比如数据文件为 /u02/ora11g/oradata/TEST11G/sysaux01.dbf 我们需要得到挂载点,即 /u02,其他的数据文件,挂载点可能是 /u03,/u04....
然后使用df -k来查看这些挂载点的空间使用情况,这个地方我是使用 awk '{print "df -k |grep -i \""$1 "\""}' > df_k_chk_tmp.ksh来直接生成对应的df -k的脚本。

这个时候比如还是有10个挂载点,我们需要添加文件,比如说需要添加2G的文件,这个时候就需要在这些挂载点中进行校验,首先大小要超过2G的挂载点才可以考虑。
然后对输出的结果进行过滤。这里有一个问题是在Unix和linux下使用df -k的时候,输出可能会有一些不同。
版本1:
/dev/sda3             30969600  24844420   4552016  85% /u02
版本2:
                          30969600  24844420   4552016  85% /u02
这个时候可以根据要求反向得到最后三列的值,作为我们分析的基础。
这个部分使用一个函数即可搞定,假设我们生成的动态df -k的脚本为 df_k_chk_tmp.ksh 需要添加的数据文件大小为800M,可以这么过滤。
function get_db_file_mount
{
ksh  $1 | awk -v file_size=$2 'NR>=1{ if($(NF-2)-$file_size>0) print $(NF-2),$(NF-1),$NF}' |sort
}
get_db_file_mount df_k_chk_tmp.ksh 8100000 > tmp_FS_mount


接下来的部分就是如何做hash或者random分布了,怎么尽量把数据文件分散出去,选择一个可用的挂载点。咱们可以定义一个random函数。


function get_random
{
    min=$1;
    max=$2
    num=$(date +%s+%N);
    ((retnum=num%max+min));
    echo $retnum;    
}

通过下面的代码进行过滤,能够随机抓取到一个合适的挂载点。
tmp_FS_mount_cnt=`cat tmp_FS_mount|wc -l`
echo $tmp_FS_mount_cnt
tmp_random=`get_random 1 ${tmp_FS_mount_cnt}`
echo $tmp_random
cat  tmp_FS_mount|sed -n "${tmp_random}p"|awk '{print $3}'

接下来的事情就是生成数据文件的部分了。明天继续。
目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
61 4
|
1月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
50 4
|
1月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
|
30天前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
124 56
|
23小时前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
10天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
31 4
|
1月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
1月前
|
运维 Prometheus 监控
运维中的自动化实践每月一次的系统维护曾经是许多企业的噩梦。不仅因为停机时间长,更因为手动操作容易出错。然而,随着自动化工具的引入,这一切正在悄然改变。本文将探讨自动化在IT运维中的重要性及其具体应用。
在当今信息技术飞速发展的时代,企业对系统的稳定性和效率要求越来越高。传统的手动运维方式已经无法满足现代企业的需求。自动化技术的引入不仅提高了运维效率,还显著降低了出错风险。本文通过几个实际案例,展示了自动化在IT运维中的具体应用,包括自动化部署、监控告警和故障排除等方面,旨在为读者提供一些实用的参考。
|
1月前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
【10月更文挑战第1天】智能化运维:机器学习在故障预测和自动化响应中的应用
66 3
|
1月前
|
机器学习/深度学习 运维 监控
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维工作的重要性日益凸显。随着企业业务的不断扩展和技术的日新月异,传统的运维方式已难以满足现代企业的需求。因此,构建一个高效、智能的运维体系成为了企业发展的关键。本文将探讨如何从自动化逐步演进到智能化,以实现运维工作的高效化和智能化。