Zabbix Partition Cleanup Script with PostgreSQL 在检查是否处于恢复状态后



好的,首先我必须指出我在这里使用社区工作,所以请原谅任何误解。 也就是说,我们有一个使用PostgreSQL 9.6的数据库服务器和一个运行3.2的Zabbix服务器,可以写入该数据库。 我们根据以下文档设置分区:https://www.zabbix.org/wiki/Higher_performant_partitioning_in_PostgreSQL

这一切都很好,数据正在写入正确的表,并且创建了所有表。 我们现在正处于即将达到丢弃期的时刻,我们正在尝试设置和运行维护脚本。 我使用该页面中的脚本(由于错误进行了一些更改(。 该脚本的设置是为了确保数据库未处于恢复模式,因此它会执行返回 t/f 的过程。 proc 有效,如果我手动从 shell 执行它,我会得到一个 f,正如我所期望的那样。 这就是问题出现的地方,它还在带有 f 的行之后返回一个空行。 脚本在我的系统上如下:

#!/bin/bash
# . ~/lib/pgIsInRecovery.func
pgIsInRecovery () {
local IN_RECOVERY=$(/usr/edb/as9.6/bin/psql -d zabbix -U zabuser -c 'SELECT pg_is_in_recovery()')
#local IN_RECOVERY=$(psql -t -c zabbix -U zabuser 'SELECT pg_is_in_recovery()')
case ${IN_RECOVERY// /} in
( t ) return 0 ;;
( f ) return 1 ;;
esac
}
# . ~/lib/printUsage.func
printUsage () {
cat <<- EOT
Usage: ${0} runme
EOT
}
printSql () {
cat <<- SQL
set VERBOSITY 'terse'
SELECT zabbix_partition_maintenance('1 week', 4, 52, 1);
quit
SQL
}
main () {
case $1 in
( runme )
if ! pgIsInRecovery
then
printSql | /usr/bin/psql -U zabuser zabbix
else
echo $pgIsInRecovery
echo "PostgreSQL cluster is in recovery. Exiting."
fi
;;
( * )
printUsage
return 1
;;
esac
}
main "$@"
exit $?

如果我手动执行以下内容,我会得到带有额外行的结果:/usr/edb/as9.6/bin/psql -d zabbix -U zabuser -c 'SELECT pg_is_in_recovery(('

-bash-4.2$ psql -t -U zabuser -d zabbix -c 'SELECT pg_is_in_recovery()'
f
-bash-4.2$

任何知道为什么在最后返回空行,以及使用此脚本解决此问题的任何想法,如果它恰好在恢复中,我们绝对不想执行数据库维护,所以我很犹豫是否要删除该验证。 我确实知道,如果我从 psql 中执行该进程,我只会得到我所期望的一行结果。

提前感谢任何帮助。

为清楚起见,一个编辑:澄清一下,这很重要,因为由于条件检查,它不会返回未恢复,因此脚本永远不会继续执行维护的步骤。

需要将 -t 标志添加到 psql 命令以仅返回元组。

最新更新