2017-08-22 2 views
0

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.

Répondre

0

Nécessaire pour ajouter l'indicateur -t à la commande psql pour renvoyer uniquement un tuple.