Je veux tester si une connexion de réplication est autorisée par pg_hba.conf
sur le fournisseur avant d'émettre la commande de démarrage de la réplication, et je ne sais pas comment. (J'ai accès aux shells unix et postgresql sur les deux nœuds)
Pour la connexion sans réplication, je connecterais psql
en utilisant une connstring comme 'Host=$MASTER_IP port=5432 dbname=$DATABASE user=$DBUSER password=$DBPASSWORD'
Context: J'écris un script pour automatiser la configuration de la réplication entre les serveurs, et la configuration des serveurs est gérée via différents systèmes/référentiels (raisons héritées). Par conséquent, je veux tester si les paramètres sont corrects à chaque étape.
Il existe une vue très pratique pour cela appelée pg_hba_file_rules
.
table pg_hba_file_rules ;
line_number │ type │ database │ user_name │ address │ netmask │ auth_method │ options │ error
─────────────┼───────────┼───────────────┼─────────────┼───────────┼─────────────────────────────────────────┼─────────────┼─────────┼───────
3 │ local │ {all} │ {all} │ │ │ trust │ │
4 │ hostssl │ {all} │ {+users} │ 127.0.0.1 │ 255.255.255.255 │ pam │ │
5 │ Host │ {all} │ {all} │ 127.0.0.1 │ 255.255.255.255 │ md5 │ │
6 │ hostssl │ {all} │ {+users} │ ::1 │ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff │ pam │ │
7 │ Host │ {all} │ {all} │ ::1 │ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff │ md5 │ │
8 │ hostssl │ {replication} │ {standby} │ all │ │ md5 │ │
9 │ hostnossl │ {all} │ {all} │ all │ │ reject │ │
Pour les versions antérieures, il est un peu lourd et sujet aux erreurs (et ne fonctionne que pour les superutilisateurs, voir les notes).
La seule façon intégrée de lire pg_hba.conf
Que j'imagine actuellement est d'utiliser pg_read_file()
.
SELECT pg_read_file('pg_hba.conf');
vous renverra le fichier entier, sur une seule ligne, qui contient ensuite les caractères de nouvelle ligne (que ce soit la saveur que votre système d'exploitation aime:
[...]
# TYPE DATABASE USER ADDRESS METHOD↵
↵
# "local" is for Unix domain socket connections only ↵
local all all md5 ↵
# IPv4 local connections: ↵
Host all all 127.0.0.1/32 md5 ↵
[...]
Vous pouvez ensuite traiter cela à votre guise.
Remarques:
Le documentation nous dit ce qui suit:
Les fonctions présentées dans le tableau 9-86 [ pg_read_file () inclus - moi] fournissent un accès natif aux fichiers sur la machine hébergeant le serveur. Seuls les fichiers du répertoire du cluster de bases de données et du répertoire log_ sont accessibles. Utilisez un chemin relatif pour les fichiers du répertoire de cluster et un chemin correspondant au paramètre de configuration log_directory pour les fichiers journaux. L'utilisation de ces fonctions est réservée aux superutilisateurs.
Le peu de superutilisateurs ne devrait pas vous poser de problème, car vous configurez la réplication. Si pg_hba.conf
Ne se trouve pas dans les répertoires mentionnés, vous pouvez y ajouter un lien symbolique pour tromper le système:
postgres@Z22309: cd /var/lib/postgresql/9.5/main
postgres@Z22309:~/9.5/main$ ln -s /etc/postgresql/9.5/main/pg_hba.conf pg_hba.conf
pg_conf_load_time()
et pg_stat_file()
, comme indiqué ci-dessous. Dans le même temps, vous ne saurez toujours pas exactement quelles modifications ont été apportées depuis le dernier rechargement. De plus, comme mentionné dans un commentaire, pg_conf_load_time()
avancera même lorsque le chargement du fichier n'a pas réussi, ce qui crée de la confusion - du moins, je ne sais pas comment on pourrait dire que le rechargement a réussi ou non.SELECT pg_conf_load_time() > modification FROM pg_stat_file('pg_hba.conf');