当前位置: 首页 > news >正文

半自动化运维之动态添加数据文件(一) (r5笔记第55天)

在测试环境中,服务器和数据库实例真是多得数不胜数,自己也没有下意识去记住那个数据库实例在哪个服务器上,都是出了问题直接连过去解决。这么多的数据库实例需要管理,表空间的监控是极为重要的,一般来说都会在给表空间设定一个阀值,比如说表空间剩余10%,20%等等,超出了阀值就会自动发送邮件,提醒DBA去做相应的处理,表空间监控如此,文件系统监控也是类似的思路。最近处理了一些紧急的问题,看似是很小的问题,但是比较折腾人,比如说表空间超出了阀值,就会发送警告邮件,这个时候DBA就会连过去,处理问题的思路就是添加数据文件,这个时候就得考虑文件系统的空间情况。比如有下面10个挂载点。/u01,/u02,/u03....., /u10, 数据文件被打散分布在这几个挂载点上,如果对于数据文件的位置没有严格的要求,就是希望把数据文件分散分布,这个时候处理的思路就是使用df -k来得到对应的挂载点信息,然后在其中选择一个合适的,创建数据文件,仅此而已。但是这个过程如果细细来看,确实是没有太多技术含量的,而且手动处理液不够及时,能不能发送了警告邮件,然后在数据库层面创建数据文件,可以在DBA稍后进行验证,这样问题处理也很及时,也不用DBA来总是手工处理这种看似紧急的问题。这也就是我为什么说是半自动化运维的一个思路。解释了一通,来个图看看可能就更清楚了。下面就是一些挂载点,在不同的服务器上会有所不同,在监控的时候如果需要添加数据文件,就需要尽量把数据文件分散到这些挂载点上,可以使用hash或者random的方式。0?wx_fmt=png当然要实现也是看起来容易,做起来难。先来看看表空间监控的部分,我们先来看看表空间监控的部分是怎么写的,在后续的章节补充是怎么添加数据文件的。这个脚本依赖于一个配置文件。就是需要提供数据库实例名和主机名,像下面的形式,数据库TEST11G在主机oel1上。$ cat master_sid.lstTEST11G oel1DG11G oel1LOG_DIR=/home/ora11g/logsDAY=`date +%d-%m-%Y:%H:%M" CST"`HOST=`hostname`SCRIPTNAME=free_tbs_alert.kshSCR_DIR=/home/ora11g/sid_list --配置文件的路径TARGET_CONN=n1/n1export PATH=$ORACLE_SID/bin:$PATHcp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespacecp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newcp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert##MAINfor 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 << EOFconn ${TARGET_CONN}@$SIDset feed off head off set linesize 65set pagesize 0col TABLESPACE_NAME format a15col "USED (MB)" format a12col "FREE (MB)" format a10col "PER_FREE (MB)" format a17col "TOTAL (MB)" format a12spool $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alertSELECT 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_FREEFROM (SELECT TABLESPACE_NAME,ROUND (SUM (BLOCKS*(SELECT VALUE/1024 FROM V\$PARAMETERWHERE NAME = 'db_block_size')/1024)) FREE_SPACEFROM DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT TABLESPACE_NAME,ROUND (SUM (BYTES/1048576)) TOTAL_SPACEFROM DBA_DATA_FILESGROUP BY TABLESPACE_NAME) TWHERE F.TABLESPACE_NAME = T.TABLESPACE_NAMEAND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) < 10;spool off/promptexitEOFfiHOST1=`$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 ]]thencp /dev/null $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmpgrep "%" $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|awk '{ print $3}'|sort|while read _freeMBdoif [[ $_freeMB -lt 2048 ]]thengrep "%" $LOG_DIR/${1}_${SCRIPTNAME}_tablespace.alert|grep -w $_freeMB >> $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmpfidonecp /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.tmp1cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp|sort -u >> $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1cat $LOG_DIR/${1}_${SCRIPTNAME}_free_tablespace.tmp1|sed "/^$/ d;" >>$LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespaceecho "=============================================================" >>$LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespacefifidoneecho "TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FR --------------- ------------ ---------- ------------ ------ " >> $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newcat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace >> $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newecho "DBA Team"| tee -a $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newecho "Script Location on $HOST ${SCR_DIR}/${SCRIPTNAME}" | tee -a $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newif [ `cat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace|wc -l` -gt 2 ]thencat $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.newecho 'need to notify jianrong to help ' mailx -s "$1 : < 10% or 2 GB Free TableSpace Report: $DAY" ' xxxxxx@xxxx.com' < $LOG_DIR/${1}_${SCRIPTNAME}_final_report_free_tablespace.new --发送邮件fi整个过程就完成了表空间的监控,当然是一个初步的脚本还有一些不严谨的地方。这个时候我们需要继续完成操作系统级的监控,这个监控是有一定的范围的。我们可以先从得到数据库中数据文件的格式。conn_str=n1/n1print "conn $conn_strset feedback offset 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的脚本。版本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_cnttmp_random=`get_random 1 ${tmp_FS_mount_cnt}`echo $tmp_randomcat tmp_FS_mount|sed -n "${tmp_random}p"|awk '{print $3}'接下来的事情就是生成数据文件的部分了。明天继续。

相关文章:

  • 半自动化运维之动态添加数据文件(二) (r5笔记第56天)
  • 无法运行的update问题解析(r5笔记第57天)
  • shell中echo的显示格式 (r5笔记第58天)
  • 人的力量和大自然的力量 (r5笔记第59天)
  • 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
  • 巧用外部表备份历史数据(r5笔记第62天)
  • pl/sql中的forall简单测试(r5笔记第63天)
  • 一次ORA-00600问题的排查和分析(上)(r5笔记第64天)
  • 一次ORA-00600问题的排查和分析(下)(r5笔记第65天)
  • 毕业设计的小故事(r5笔记第67天)
  • 重启数据库的一场闹剧(r5笔记第68天)
  • 关于aio的设置的讨论(r5笔记第69天)
  • 一条sql语句的改进探索(r5笔记第70天)
  • 海量数据迁移之传输表空间(一) (r5笔记第71天)
  • 数据刷新中的并行改进(r5笔记第72天)
  • 《深入 React 技术栈》
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • egg(89)--egg之redis的发布和订阅
  • gulp 教程
  • Hibernate最全面试题
  • Java精华积累:初学者都应该搞懂的问题
  • leetcode-27. Remove Element
  • nginx 配置多 域名 + 多 https
  • Node 版本管理
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 阿里云Kubernetes容器服务上体验Knative
  • 前端相关框架总和
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 我感觉这是史上最牛的防sql注入方法类
  • 字符串匹配基础上
  • ​【已解决】npm install​卡主不动的情况
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​人工智能书单(数学基础篇)
  • (function(){})()的分步解析
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (一)u-boot-nand.bin的下载
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Linux下编译安装log4cxx
  • (转)程序员疫苗:代码注入
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • /usr/bin/env: node: No such file or directory
  • @JoinTable会自动删除关联表的数据
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C#] 我的log4net使用手册
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [CF407E]k-d-sequence
  • [codeforces]Checkpoints
  • [Git 1]基本操作与协同开发
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率