通过shell脚本批量验证dataguard的有效性(r7笔记第96天)
时间:2022-05-04
本文章向大家介绍通过shell脚本批量验证dataguard的有效性(r7笔记第96天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我们假设一个场景,当你接触到一个新的环境,我们需要了解这个数据库是否为RAC,是否有备库。 如果有备库,那么问题来了,如果想去验证备库的状态是否有效,是否及时应用了数据变更。怎么查看呢。常规的思路是我们登录到主库使用dg broker,如果得到dg broker验证的状态为SUCCESS,在11g中我们认为备库的状态是ONLINE就是达标了,如果在10g,还不能完全说明备库没有问题。如果有一 主两备的情况,怎么查看每个备库的日志更新情况呢,我们需要使用show database verbose xxx的方式去查看更新的进度,是否有延迟,当然在这个基础上我们要查看这个备库是在哪台服务器上,使用哪个端口和主库进行交互等等,这些似乎需要一连串 熟练的命令才能搞定。 如果有100个主库,出一个难题,有的主库是一拖一,有的是一拖二,怎么判断其中的一部分备库在同一台服务器上?这种情况其实通过简单的元数据管理似乎还是很难定位,有兴趣可以琢磨一番。 当然我的意图不在于此,我是希望通过一个命令或者一个脚本把上面的这些手工工作都完成。 比如输出的结果类似下面的形式。
RAC LOG_MODE INST_ID INSTANCE_NA HOST_NAME VERSION STATUS STARTUP_TIME
----- ---------- ---------- ----------- --------------- --------------- -------- ------------------------
NO ARCHIVELOG 1 test0 stest0.test.com 11.2.0.3.0 OPEN 02:33:38 14-APR-15
,PRIMARY
.
ORACLE_HOME is:/U01/app/oracle/product/11.2.3/db_1
stest032 - Primary database SCN:348:CURRENT
.
stest0 - Physical standby database
Intended State: APPLY-ON
Transport Lag: 0 seconds
Apply Lag: 0 seconds
HOST =stcard2.test.com
PORT = 1531
SERVICE_NAME = test0
.
s2test0 - Physical standby database
Intended State: APPLY-ON
Transport Lag: 50 minutes 47 seconds
Apply Lag: 50 minutes 47 seconds
HOST =s2test0.test.com
PORT = 1531
SERVICE_NAME = test0
通过这个输出我们很清晰的看到这是一主两备的情况,备库2 存在一定的延迟应用。主库的SCN为348,数据库是在最近启动的,备库对应的主机,开放的端口也都是一目了然。 所以这也是一种细小的改进。 我们可以通过如下的脚本来实现上面的输出效果。在10g,11g中测试效果能够达到预期。
function get_pri_info
{
sudo su -l oracle <<EOS
sqlplus -s / as sysdba
REM ------------------------------------------------------------------------
set pagesize 20
set feedback off
set verify off
set head on
alter session set nls_date_format='HH:MI:SS DD-MON-YY';
col host_name for a15
col instance_name format a11
col version format a15
col status format a8
col RAC for a5
col log_mode format a10
col platform_name format a16
set lines 150
PROMPT
--PROMPT --------------- Instance general information ------------------
select (select decode(value,'TRUE','YES','NO')from v$option WHERE Parameter = 'Real Application Clusters') RAC,
(select log_mode||','||database_role from v$database where rownum<2)log_mode,
--(select platform_name from v$database where rownum<2)platform_name,
inst_id, instance_name, host_name, version, status, startup_time
from gv$instance
order by inst_id;
EOS
}
function get_pri_seq
{
sudo su -l oracle <<EOS
sqlplus -s / as sysdba
set feedback off
set pages 0
select 'SCN:'||sequence#||':'||status from v$log where STATUS='CURRENT';
EOS
}
function get_oracle_home
{
cat /etc/oratab | tail -1 | awk -F: '{print $2}'
}
function get_tns_std
{
sudo su -l oracle<<EOF
$ORACLE_HOME/bin/tnsping $1 |sed 's/(/n/g'|sed 's/)/n/g'|grep -i 'HOST|PORT|SERVICE_NAME|SID_NAME'
EOF
}
function dgmgrl_verbose
{
sudo su -l oracle << EOF
dgmgrl / "show database verbose "$1|grep 'Transport Lag|Apply Lag|Intended State'
EOF
}
get_pri_info
pri_seq_no=`get_pri_seq`
ORACLE_HOME=`get_oracle_home`
echo .
echo 'ORACLE_HOME is:'$ORACLE_HOME
std=`sudo su -l oracle <<EOS
dgmgrl -silent / " show configuration"
EOS`
pri_db=`echo "$std"|grep "Primary database"|tail -1`
std1=`echo "$std"|grep "Physical standby database"|tail -2|head -1`
std2=`echo "$std"|grep "Physical standby database"|tail -1`
echo $pri_db " " $pri_seq_no
echo .
if [[ $std1 = $std2 ]]; then
std2=''
echo .
echo $std1
dgmgrl_verbose $std1
get_tns_std $std1
else
echo $std1
dgmgrl_verbose $std1
get_tns_std $std1
echo .
echo $std2
dgmgrl_verbose $std2
get_tns_std $std2
fi
如果在本地环境的oracle用户去掉那个sudo即可。其实实现方式会更简便。主要的目的是借助这个脚本可以在中控机器上批量执行进行验证。
- 微信小程序开发:设置消息推送
- Mysql备份系列(1)--备份方案总结性梳理
- ASP.NET中常用的优化性能的方法(转贴,Icyer收集整理)
- 顶象全场景IoT安全方案解决物联网两大难题
- 诡异的【session丢失】和【<img src="">标签】
- TensorFlow核心使用要点
- “搜一搜”直达生活服务 微信连接移动消费新场景
- Linux服务器安全登录设置记录
- Linux系统下的ssh使用(依据个人经验总结)
- 从MapX到MapXtreme2004[4]-标注AutoLabel
- Linux下锁定账号,禁止登录系统的设置总结
- 深度解析 TypeConverter & TypeConverterAttribute (一)
- 从MapX到MapXtreme2004[7]-对Table、Feature等的理解
- 互联网赋能传统装企 “科技撬动力巨大”
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法