Zabbix Partition Cleanup Script with PostgreSQL returns 检查恢复后的空行
Zabbix Partition Cleanup Script with PostgreSQL returns blank line after checking for being in recovery
好的,首先我必须指出我在这里使用的是社区工作,所以请原谅任何误解。也就是说,我们有一个带有 PostgreSQL 9.6 的数据库服务器和一个写入该数据库的 Zabbix 服务器 运行 3.2。我们根据以下文档设置了分区:https://www.zabbix.org/wiki/Higher_performant_partitioning_in_PostgreSQL
一切都很好,数据正在写入正确的表并且所有表都已创建。我们现在正处于我们即将到达下降期的地步,我们正在尝试获得维护脚本设置和 运行。我使用该页面中的脚本(由于错误而进行了一些更改)。该脚本设置为确保数据库不处于恢复模式,因此它执行 returns t/f 的过程。 proc 有效,如果我从 shell 手动执行它,我会得到 f 正如我所期望的那样。这就是问题所在,它也是 returns 在带 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: [=11=] runme
EOT
}
printSql () {
cat <<- SQL
\set VERBOSITY 'terse'
SELECT zabbix_partition_maintenance('1 week', 4, 52, 1);
\quit
SQL
}
main () {
case 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 命令以 return 仅元组。
好的,首先我必须指出我在这里使用的是社区工作,所以请原谅任何误解。也就是说,我们有一个带有 PostgreSQL 9.6 的数据库服务器和一个写入该数据库的 Zabbix 服务器 运行 3.2。我们根据以下文档设置了分区:https://www.zabbix.org/wiki/Higher_performant_partitioning_in_PostgreSQL
一切都很好,数据正在写入正确的表并且所有表都已创建。我们现在正处于我们即将到达下降期的地步,我们正在尝试获得维护脚本设置和 运行。我使用该页面中的脚本(由于错误而进行了一些更改)。该脚本设置为确保数据库不处于恢复模式,因此它执行 returns t/f 的过程。 proc 有效,如果我从 shell 手动执行它,我会得到 f 正如我所期望的那样。这就是问题所在,它也是 returns 在带 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: [=11=] runme
EOT
}
printSql () {
cat <<- SQL
\set VERBOSITY 'terse'
SELECT zabbix_partition_maintenance('1 week', 4, 52, 1);
\quit
SQL
}
main () {
case 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 命令以 return 仅元组。