Ok, donc pour commencer, je dois souligner que j'utilise le travail communautaire ici, donc pardonnez tout malentendu. Cela dit, nous avons un serveur de base de données avec PostgreSQL 9.6 et un serveur Zabbix en version 3.2 qui écrit dans cette base de données. Nous avons configuré le partitionnement en fonction de la documentation suivante:Le script de nettoyage de partition Zabbix avec PostgreSQL retourne la ligne vide après avoir vérifié la récupération
Tout va bien, les données sont écrites dans les tables correctes et toutes les tables sont créées. Nous sommes maintenant au point où nous sommes sur le point d'atteindre notre période de repos et nous essayons d'obtenir la configuration et l'exécution du script de maintenance. J'utilise le script (avec quelques modifications dues à des erreurs) de cette page. Le script est configuré en tant que tel pour s'assurer que la base de données n'est pas en mode de récupération, donc il exécute un proc qui retourne t/f. Le proc fonctionne, si je l'exécute à partir du shell manuellement, j'obtiens un f comme je m'y attendais. C'est là que le problème arrive, il renvoie également une ligne vide après la ligne avec le f. Le script est le suivant sur mon système:
#!/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 "[email protected]"
exit $?
Si j'exécutez la commande suivante manuellement je reçois le résultat avec la ligne supplémentaire après: /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$
toute idée pourquoi la ligne blanche est retournée à la fin, et toute idée d'un moyen de contourner ce avec ce script, nous ne voulons certainement pas à effectuer notre maintenance DB s'il se trouve en cours de récupération, donc je suis assez hésitant à supprimer cette validation. Je sais que si j'exécute ce proc à partir de psql, j'obtiens juste le résultat d'une ligne comme je m'y attendais.
Merci d'avance pour toute assistance. EDIT POUR LA CLARTÉ: Juste pour clarifier, cela importe parce qu'en raison de la vérification de condition il ne retourne pas non en récupération ainsi le manuscrit ne passe jamais à l'étape où il effectuerait la maintenance.