检查恢复后,带有PostgreSQL的Zabbix分区清理脚本返回空白行

时间:2017-08-22 19:25:55

标签: bash postgresql shell partitioning zabbix

好的,首先我必须指出我在这里使用社区工作,所以请原谅任何误解。也就是说,我们有一个带有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,我只能得到一行结果。

提前感谢您的任何帮助。

一个针对清晰度的编辑:只是为了澄清,这很重要,因为由于条件检查,它不会返回而不是恢复,因此脚本永远不会进入执行维护的步骤。

1 个答案:

答案 0 :(得分:0)

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