好的,首先我必须指出我在这里使用社区工作,所以请原谅任何误解。也就是说,我们有一个带有PostgreSQL 9.6的数据库服务器和一个运行3.2的Zabbix服务器写入该数据库。我们根据以下文档设置了分区:https://www.zabbix.org/wiki/Higher_performant_partitioning_in_PostgreSQL
这一切都很好,数据写入正确的表并创建所有表。我们现在正处于即将到达下降期的阶段,我们正在尝试设置和运行维护脚本。我使用该页面中的脚本(由于错误而进行了一些更改)。脚本设置为确保DB不处于恢复模式,因此它执行返回t / f的proc。 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中执行proc,我只能得到一行结果。
提前感谢您的任何帮助。
一个针对清晰度的编辑:只是为了澄清,这很重要,因为由于条件检查,它不会返回而不是恢复,因此脚本永远不会进入执行维护的步骤。
答案 0 :(得分:0)
需要在psql命令中添加-t标志以仅返回元组。