暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

DG standby time 监控脚本部署

原创 布衣 2022-11-10
2031

背景

从遇到DG 同步延迟之奇怪的经典报错:ORA-16191这个报错,从而受到启发,再通过DG standby_time 监控脚本优化逻辑,完成以下脚本的编写,希望对大家有所有帮助。

一、创建主库的tns_name

Primary_DB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.30)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = primary)
    )
  )

二、脚本

  • 注意:这个位置要修改成上面的tns_name
    image.png
  • 监控阀值:2处都需要调
    1、这里可调天、时、分
    image.png
    2、 这里只能调分
    image.png
#!/bin/bash export ORACLE_SID= export ORACLE_UNQNAME= export ORACLE_BASE=/u01/oracle export con_sys='sqlplus -s system/密码' f_check_standby_time(){ standby_time=`$con_sys<< EOF set serveroutput on; set pagesize 0; SET FEEDBACK off; SET HEADING off; declare VALUE_day number(2); VALUE_hour number(2); VALUE_mins number(2); VALUE_sec number(2); VALUE_result varchar(20); VALUE_null number(1); begin -- value 字段截取 select count(1) into VALUE_null from v\\$dataguard_stats where name = 'apply lag' and VALUE is not null; if VALUE_null=1 then select substr(VALUE, 2, 2), substr(VALUE, 5, 2), substr(VALUE, 8, 2), substr(VALUE, 11, 2), VALUE into VALUE_day, VALUE_hour, VALUE_mins, VALUE_sec, VALUE_result from v\\$dataguard_stats where name = 'apply lag'; #监控阀值 天 时 分 if VALUE_day > 0 or VALUE_hour > 0 or VALUE_mins > 10 then dbms_output.put_line(VALUE_result); else dbms_output.put_line('+00 00:00:00'); end if; else dbms_output.put_line('VALUE_null'); end if; end; / EOF` if [ "$standby_time" = '+00 00:00:00' ] ; then # 测试连接主库情况,tnsping 报TNS-12543 表示主库异常 tns_num=`tnsping Primary_DB | grep 'TNS-12543' | wc -l` if [ $tns_num -eq 1 ] ; then echo "Primary db not ok!" else pri_res=`$con_sys@Primary_DB <<EOF set pagesize 0; SET FEEDBACK off; SET HEADING off; select to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v\\$database; EOF` standby_res=`$con_sys <<EOF set pagesize 0; SET FEEDBACK off; SET HEADING off; select to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v\\$database; EOF` res=`echo $(($(date +%s -d "${pri_res}") - $(date +%s -d "${standby_res}"))) | awk '{t=split("60 s 60 mi 24 d 999 ",a);for(n=1;n<t;n+=2){if($1==0)break;s=$1%a[n]a[n+1]s;$1=int($1/a[n])}print s}'` # 延迟时间秒转换为分 res_min=$((($(date +%s -d "${pri_res}") - $(date +%s -d "${standby_res}"))/60)) # 监控阀值 if [ $res_min -gt 10 ];then standby_time=$res fi fi fi echo "$standby_time" } f_check_standby_time

脚本下载:check_standby_time.sh

执行:

-- 输出:
[oracle@standby ~]$ sh check_standbt_time.sh  
standby_time: +00 00:00:00    -------->apply lag 的值
pri_res: 2022-11-08 21:50:13  --------> 主库的scn时间
standby_res: 2022-11-08 21:47:24 --------> 备库的scn
2mi49s                         --------> 脚本最终输出值
-- 同步正常
[oracle@standby ~]$ sh check_standbt_time.sh  
+00 00:00:00
-- 同步异常:
[oracle@standby ~]$ sh check_standbt_time.sh  
3mi43s

欢迎赞赏支持或留言指正

最后修改时间:2025-02-10 10:05:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论