22
0
Fork 0

Ajout Utilisation de la réplication logique pour une upgrade de version de Postgresql

This commit is contained in:
emorino 2021-02-19 11:29:28 +01:00
parent 3ba720ca57
commit 863e1e5e46
1 changed files with 81 additions and 0 deletions

View File

@ -197,4 +197,85 @@ postgres=# CREATE ROLE monitor WITH LOGIN PASSWORD 'foo';
postgres=# GRANT EXECUTE ON FUNCTION pg_ls_dir(text) TO monitor;
~~~
## Utilisation de la réplication logique pour une upgrade de version de Postgresql
On va prendre par exemple le cas où l'on veut migrer un serveur primaire en Postgresql11 vers Postgresql13.
* Il faut vérifier que sur le primaire toutes les tables d'une base de données ont une clé primaire, on peut exécuter cette requête qui va lister les tables qui n'ont pas de clé primaire :
~~~
SELECT tbl.table_schema, tbl.table_name FROM information_schema.tables tbl WHERE table_type = 'BASE TABLE' AND table_schema NOT IN ('pg_catalog', 'information_schema') AND NOT EXISTS ( SELECT 1 FROM information_schema.key_column_usage kcu WHERE kcu.table_name = tbl.table_name AND kcu.table_schema = tbl.table_schema );
~~~
* On crée une nouvelle instance Postgresql en version 13, soit sur un serveur distant qui va être notre futur primaire, soit on crée une nouvelle instance en version 13 sur le primaire actuel, sur un port alternatif :
~~~
$ pg_createcluster 13 prim -p 5434
~~~
Si la nouvelle instance en PG13 est sur le même serveur on baisse les valeurs de shared_buffers, effective_cache_size et max_worker_processes pour ne pas saturer le serveur.
* Dans l'idéal il ne faut pas qu'il ait de changement sur la structure pendant les opérations jusqu'à la bascule.
* Faire un dump de la scructure (schema) et les rôles sur le primaire actuel et la réinjecter sur l'instance 5434 :
~~~
$ pg_dump -p 5432 --schema-only ma_base > ma_base.schema.sql
$ pg_dumpall -p 5432 -g > pg_global.sql
$ psql -p 5434 < pg_global.sql
$ psql -p 5434 ma_base < ma_base.schema.sql
~~~
* Créer la subcription sur la nouvelle instance PG13 vers le primaire actuel :
~~~
ma_base=# CREATE SUBSCRIPTION s_upgrade CONNECTION 'dbname=ma_base host=IP_PRIMAIRE port=5432 user=repl password=mypass' PUBLICATION alltables;
~~~
* Suivre la copie des tables sur l'instance 5434 en surveillant la vue _pg_subscription_rel_
~~~
ma_base=# select * from pg_subscription_rel;
~~~
* Lorsque les tables sont toutes en status 'r' c'est que la synchro de la réplication logique est terminé.
* Par précaution, ont fait un dump de l'instance primaire ainsi que les fichiers de configuration, avant la bascule :
~~~
$ pg_dumpall | gzip -c > fichier_sauvegarde.sql.gz
~~~
### Le jour ou l'on veut basculer sur l'instance PG13
Lorsque l'on voudra basculer sur l'instance PG13 faire ces étapes suivantes :
* Bloquer les connexions avec pg_hba.conf sur le primaire actuel
* Vérifié qu'il n'y ai plus de connexion depuis les serveurs web avec la vue pg_stat_activity, et kill des connections restante comme ceci :
~~~
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'ma_base' AND pid <> pg_backend_pid() AND backend_type = 'client_backend';
~~~
* Recopie de l'avancement des sequences :
Il faut recopier l'avancement des sequences faite depuis le primaire vers le futur sql11 comme ceci, par exemple :
~~~
$ psql -p 5432 -XAtqc "SELECT \$\$select setval('\$\$ || quote_ident(schemaname)||\$\$.\$\$|| quote_ident(sequencename) || \$\$', \$\$ || last_value || \$\$); \$\$ AS sql FROM pg_sequences" ma_base | psql -p 5434 ma_base
~~~
* Arrêter l'instance primaire actuelle
* Mettre à jours les paramètres shared_buffers et effective_cache_size etc... et faire écouter l'instance sur le port 5432 (si l'on a créé une instance sur le serveur primaire actuel)
* Copié le pg_hba.conf sur la nouvelle instance.
* Suppression de la souscription sur la nouvelle instance :
~~~
ma_base=# ALTER SUBSCRIPTION s_upgrade DISABLE;
ma_base=# ALTER SUBSCRIPTION s_upgrade SET (slot_name = NONE);
ma_base=# DROP SUBSCRIPTION s_upgrade;
~~~
* Redémarrage de la nouvelle instance
~~~
# systemctl restart postgresql@13-prim.service
~~~