我正在尝试使用以下shell脚本在主数据库和备用数据库之间获取LAG。对于具有 1 个返回单个值的节点的实例,查询返回值"数据库不同步"或"数据库不同步"工作正常,但是对于具有两个节点的实例,我收到错误"[: 0 1:预期的整数表达式",该实例返回第一个节点和第二个节点上的 LAG 的两个值。
所以这是代码:
#!/bin/bash
get_status=$(sqlplus -s "/as sysdba" <<EOF
set pagesize 0 feedback off verify off heading off echo off;
SELECT prim.seq - tgt.seq seq_gap
FROM
(
SELECT thread#, MAX(sequence#) seq, MAX(completion_time) tm
FROM
v$archived_log
GROUP BY
thread#
)
prim,
(
SELECT thread#, MAX(sequence#) seq, MAX(completion_time) tm
FROM
v$archived_log
WHERE
dest_id IN
(
SELECT
dest_id
FROM
v$archive_dest
WHERE
target = 'STANDBY'
)
AND
applied = 'YES'
GROUP BY
thread#
)
tgt
WHERE
prim.thread# = tgt.thread#;
exit;
EOF
)
if [ "$get_status" -ge 5 ]; then
echo "DATABASE IS OUTOFSYNC"
else
echo "DATABASE IS INSYNC"
fi
有没有更好的方法来编写这个脚本?
在查询之后和之前添加typeset -p get_status
之后,如果我得到以下结果:
declare -- get_status=" 1
0"
./dgtest2.sh: line 41: [: 1
0: integer expression expected
DATABASE IS INSYNC
查询返回多个值/字符串(针对 2 个节点或线程),如图/屏幕截图所示,似乎我的脚本仅编码为处理查询生成的单个值/字符串。
在此处输入图像描述
是否可以修改脚本以解决查询生成的多个值/字符串
逻辑应该是如果返回的所有值都-ge 5
它应该报告其他"DATABASE IS OUTOFSYNC"
"DATABASE IS INSYNC"
对于返回的所有值都是-lt 5
。
一个值-lt 5
和一个值-ge 5
的逻辑是不够的,因为数据库中的值会不断变化。
数据库从0 - 4
中返回的任何值是否应报告为"DATABASE IS INSYNC"
,数据库从两个节点返回的5 upwards
中的任何值是否应报告为"DATABASE IS OUTOFSYNC"
。
一个想法是将状态值(由sqlplus
脚本返回)捕获到数组中,然后循环访问测试所述状态值的数组。
而不是:
variable=$(sqlplus ...)
我们希望:
variable=( $(sqlplus ...) )
对于 OP 的当前脚本,通过更改变量的名称,我们将替换它:
get_status=$(sqlplus -s "/as sysdba" <<EOF
set pagesize 0 feedback off verify off heading off echo off;
SELECT prim.seq - tgt.seq seq_gap
...
exit;
EOF
)
有了这个:
status_array=( $(sqlplus -s "/as sysdba" <<EOF
set pagesize 0 feedback off verify off heading off echo off;
SELECT prim.seq - tgt.seq seq_gap
...
exit;
EOF
) )
后续逻辑测试的一个想法:
- 默认数据库状态为
INSYNC
- 如果
-ge 5
任何状态值,则将数据库状态设置为OUTOFSYNC
此代码如下所示:
db_status='INSYNC'
for status in "${status_array[@]}"
do
[[ "${status}" -ge 5 ]] && db_status='OUTOFSYNC' && break
done
echo "DATABASE IS ${db_status}"
我没有设置为运行sqlplus
脚本,但我应该能够使用以下数组分配模拟结果:
status_array=(1)
status_array=(7)
status_array=(0 1)
status_array=(5 7)
status_array=(5 3)
为每个数组赋值运行我们的代码会给我们:
##################### status_array=(1)
DATABASE is INSYNC
##################### status_array=(7)
DATABASE is OUTOFSYNC
##################### status_array=(0 1)
DATABASE is INSYNC
##################### status_array=(5 7)
DATABASE is OUTOFSYNC
##################### status_array=(5 3)
DATABASE is OUTOFSYNC