{"id":8061,"date":"2020-01-27T10:56:07","date_gmt":"2020-01-27T09:56:07","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=8061"},"modified":"2020-01-29T14:33:02","modified_gmt":"2020-01-29T13:33:02","slug":"migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/","title":{"rendered":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061&#038;title=Migration%20PostgreSQL%20via%20SLONY-I%20ou%20comment%20r%C3%A9duire%20le%20temps%20de%20coupure\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Migration%20PostgreSQL%20via%20SLONY-I%20ou%20comment%20r%C3%A9duire%20le%20temps%20de%20coupure&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>R\u00e9cemment j\u2019ai eu \u00e0 faire l\u2019upgrade d\u2019un cluster physique PostgreSQL 9.3 vers 11.<\/p>\n<h3>Contexte :<\/h3>\n<p>Pour cette migration, il y avait plusieurs contraintes:<\/p>\n<ul>\n<li>Applications critiques, ce qui impose de r\u00e9duire au maximum la coupure de service.<\/li>\n<li>Serveurs physiques avec des disques locaux uniquement<\/li>\n<li>R\u00e9utilisation des m\u00eames serveurs<\/li>\n<li>Changement de version majeure de l&#8217;OS<\/li>\n<\/ul>\n<p>Dans cet exemple je ferais abstraction de la partie cluster, ce qui ne change rien au principe expliquer dans cet article.<\/p>\n<table border=0>\n<tr>\n<td bgcolor=\"#DDDDDD\">\n\t\t<b>Attention ! <\/b> Avant de r\u00e9aliser une telle migration en production, il faut bien entendu avoir test\u00e9 la migration mais aussi le fonctionnement des applications en recette !!<br \/>\n\t\tDe plus, cela permet de tester la proc\u00e9dure sur son contexte, diff\u00e9rent de celui des autres, et de se pr\u00e9parer \u00e0 la migration de la base de production.\n\t\t<\/td>\n<\/tr>\n<\/table>\n<p>Pour r\u00e9aliser un upgrade d&#8217;instance PostgreSQL, il existe plusieurs m\u00e9thodes :<\/p>\n<ul>\n<li>pg_upgrade : n\u00e9cessite un dossier source et un cible<\/li>\n<li>pg_dump\/pg_restore : dur\u00e9e de coupure de service importante<\/li>\n<li>r\u00e9plication logique<\/li>\n<\/ul>\n<p>Nos contraintes nous imposaient d&#8217;utiliser la r\u00e9plication logique.<br \/>\nPas de disque disponible pour contenir \u00e0 la fois les donn\u00e9es sources et cibles, et l&#8217;export\/import pend beaucoup de temps.<\/p>\n<p>Il existe plusieurs outils de r\u00e9plication logique :<\/p>\n<ul>\n<li>la m\u00e9thode native, int\u00e9gr\u00e9e depuis la version 10<\/li>\n<li>pglogical, d\u00e9velopp\u00e9 par 2ndquadrant, mais compatible uniquement \u00e0 partir de la version 9.4<\/li>\n<li>SLONY-I, dont la version 2 est compatible depuis la version 8.3 (la version 1 est compatible avec les versions 7.3 \u00e0 9.1)<\/li>\n<\/ul>\n<p>Notre cas nous imposait d&#8217;utiliser SLONY-I pour r\u00e9aliser cette migration.<\/p>\n<h3>Pr\u00e9sentation de SLONY-I :<\/h3>\n<p>Slony est un outil de r\u00e9plication asynchrone pour une source vers plusieurs destinations. Une destination pouvant aussi \u00eatre une source.<br \/>\nLa r\u00e9plication fonctionne \u00e0 l\u2019aide de triggers ajout\u00e9s au niveau des tables \u00e0 r\u00e9pliquer. La r\u00e9plication peut donc se param\u00e9trer individuellement pour chaque table et est asynchrone<br \/>\n(lors d\u2019une modification sur le provider, le changement est effectu\u00e9 dans un second temps sur le subscriber).<br \/>\nSlony ne rejoue pas la requ\u00eate enti\u00e8re sur le souscripteur, il se contente de copier les nouvelles valeurs.<\/p>\n<h3>Pr\u00e9requis :<\/h3>\n<ul>\n<li>une PK sur chaque table, si besoin, on en rajoute une aux tables concern\u00e9es<\/li>\n<li>lister les s\u00e9quences (car non r\u00e9pliqu\u00e9es) (et pr\u00e9parer leur recr\u00e9ation manuelle)<\/li>\n<\/ul>\n<h3>Limitations :<\/h3>\n<ul>\n<li>pas de r\u00e9plication des champs BLOB<\/li>\n<li>pas de r\u00e9plication des modifications de sch\u00e9ma<\/li>\n<p>(<a href='http:\/\/slony.info\/documentation\/2.2\/limitations.html' target='_blank' rel=\"noopener noreferrer\">http:\/\/slony.info\/documentation\/2.2\/limitations.html<\/a>)\n<\/ul>\n<h3>Avantages majeurs :<\/h3>\n<ul>\n<li>simple \u00e0 mettre en place, mais un peu complexe \u00e0 appr\u00e9hender\/ma\u00eetriser<\/li>\n<li>tr\u00e8s grande granularit\u00e9 (choix table par table) : dans notre cas, on les prend toutes<\/li>\n<li>les souscripteurs en lecture seule (au niveau des tables et non de la base)<\/li>\n<li>mise \u00e0 jour de PostgreSQL rapide et avec le moins possible d&#8217;arr\u00eat de production (une coupure : arr\u00eat des applis, modification des s\u00e9quences, red\u00e9marrage des applis sur la nouvelle instance)<\/li>\n<\/ul>\n<h3>Inconv\u00e9nients majeurs :<\/h3>\n<ul>\n<li>pas de r\u00e9plication automatique des objets (les objets doivent \u00eatre cr\u00e9\u00e9s avant de lancer la r\u00e9plication)<\/li>\n<li>pas de r\u00e9plication du TRUNCATE avant la 8.4 (peu utile dans notre cas)<\/li>\n<li>une documentation qui, bien que compl\u00e8te, laisse \u00e0 d\u00e9sirer<\/li>\n<li>une r\u00e9plication \u00e0 cr\u00e9er par base<\/li>\n<\/ul>\n<h3>Planification:<\/h3>\n<ul>\n<li>Installation de l&#8217;OS sur le n\u0153ud 2<\/li>\n<li>Installation de postgres, cr\u00e9ation de l&#8217;instance et configuration de celle-ci<\/li>\n<li>Recr\u00e9ation des tablespaces\/users\/bases et leurs structures (tables, index, &#8230;) : (via export\/import)<\/li>\n<li>Mise en place de la r\u00e9plication via Slony-I<\/li>\n<li>Arr\u00eat des applications<\/li>\n<li>Mise \u00e0 jour des s\u00e9quences sur le n\u0153ud secondaire<\/li>\n<li>Bascule du r\u00f4le de provider<\/li>\n<li>Red\u00e9marrage des applications<\/li>\n<li>Installation de l&#8217;OS sur le n\u0153ud 1<\/li>\n<li>Installation de postgres, cr\u00e9ation de l&#8217;instance et configuration de celle-ci pour remettre en place le cluster (streaming replication)<\/li>\n<\/ul>\n<h3>Proc\u00e9dure :<\/h3>\n<ul>\n<li>Installation de slony-1, sur les deux machines. Il existe deux solutions :\n<ul>\n<li>via le gestionnaire de paquet : yum install slony1-11.x86_64<\/li>\n<li>en t\u00e9l\u00e9chargeant les sources, puis en les compilant :<\/li>\n<\/ul>\n<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">bunzip2 slony1-2.2.8.tar.bz2\r\ntar xvf slony1-2.2.8.tar\r\ncd slony1-2.2.8\r\n.\/configure --with-perltools --with-pgconfigdir=\/usr\/pgsql-9.3\/bin\r\ngmake all\r\ngmake install<\/pre>\n<\/ul>\n<ul>\n<li>Configuration de slony-1, sur les deux machines :\n<ul>\n<li>Cr\u00e9ation du user slony :<\/li>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">CREATE ROLE slony WITH SUPERUSER LOGIN REPLICATION ENCRYPTED PASSWORD 'SLONY_PASSWORD';\r\nALTER ROLE slony SET statement_timeout TO 0;<\/pre>\n<li>Ajouter le user slony dans le pg_hba.conf sur les deux n\u0153uds<\/li>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">host all slony 192.168.220.0\/24 md5\r\nselect pg_reload_conf();<\/pre>\n<li>Configuration de slony-I, sur les deux machines :<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nmkdir \/etc\/slony1\/\r\nmkdir \/var\/log\/slony1\/\r\nvi \/etc\/slony1\/slon_tools.conf &lt; &lt; EOF\r\nif ($ENV{&quot;SLONYNODES&quot;}) {\r\n    require $ENV{&quot;SLONYNODES&quot;};\r\n} else {\r\n    $CLUSTER_NAME = 'slony_replication';\r\n    $LOGDIR = '\/var\/log\/slony1';\r\n    $MASTERNODE = 1;\r\n    $DEBUGLEVEL = 2;\r\n\r\n\t## Liste des noeuds\r\n\t## Un noeud = une instance et une base\r\n\t## 2 noeuds pour une base, 4 noeuds pour 2 bases, ...\r\n\t# noeud 1\r\n    add_node(host =&gt; 'OLD_HOST', dbname =&gt; 'pagila', port =&gt;5432,\r\n        user=&gt;'slony', password=&gt;'SLONY_PASSWORD', node=&gt;1);\r\n\r\n\t# noeud 2\r\n    add_node(host =&gt; 'NEW_HOST', dbname =&gt; 'pagila', port =&gt;5432,\r\n        user=&gt;'slony', password=&gt;'SLONY_PASSWORD', node=&gt;2 );\r\n\t# noeud 3\r\n\t# ...\r\n}\r\n\r\n$SLONY_SETS = {\r\n\r\n\t# un set par base\r\n    &quot;set_pagila&quot; =&gt; {\r\n        &quot;set_id&quot;       =&gt; 1,\r\n        &quot;table_id&quot;     =&gt; 1,\r\n        &quot;sequence_id&quot;  =&gt; 1,\r\n        &quot;pkeyedtables&quot; =&gt; [\r\n            # liste des tables a repliquer\r\n\t\t\t&quot;public.actor&quot;,\r\n\t\t\t&quot;public.address&quot;,\r\n\t\t\t&quot;public.category&quot;,\r\n\t\t\t&quot;public.city&quot;,\r\n\t\t\t&quot;public.country&quot;,\r\n\t\t\t&quot;public.customer&quot;,\r\n\t\t\t&quot;public.film&quot;,\r\n\t\t\t&quot;public.film_actor&quot;,\r\n\t\t\t&quot;public.film_category&quot;,\r\n\t\t\t&quot;public.inventory&quot;,\r\n\t\t\t&quot;public.language&quot;,\r\n\t\t\t&quot;public.payment&quot;,\r\n\t\t\t&quot;public.rental&quot;,\r\n\t\t\t&quot;public.staff&quot;,\r\n\t\t\t&quot;public.store&quot;,\r\n        ],\r\n    },\r\n\t\r\n\t# set 2\r\n\t# ...\r\n};\r\n\r\nif ($ENV{&quot;SLONYSET&quot;}) {\r\n    require $ENV{&quot;SLONYSET&quot;};\r\n}\r\n\r\n# Please do not add or change anything below this point.\r\n1;\r\nEOF\r\n<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Lister les tables : (\u00e0 adapter \u00e0 votre cas)<\/li>\n<\/ul>\n<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">sudo -u postgres psql -d pagila -c &quot;select concat('\\&quot;', schemaname, '.', tablename, '\\&quot;,') from pg_catalog.pg_tables where schemaname = 'public' and tableowner = 'pagila' order by tablename asc;&quot; -t<\/pre>\n<li>Mise en place de la r\u00e9plication :\n<ul>\n<li>Initialisation du cluster, sur le n\u0153ud fournisseur<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">slonik_init_cluster --config \/etc\/slony1\/slon_tools.conf | \/usr\/pgsql-9.3\/bin\/slonik<\/pre>\n<li>Cr\u00e9ation du ou des set(s), sur le n\u0153ud fournisseur<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">slonik_create_set set_pagila --config \/etc\/slony1\/slon_tools.conf | \/usr\/pgsql-9.3\/bin\/slonik<\/pre>\n<li>D\u00e9marrage du processus slon, sur les deux n\u0153uds<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">slon_start --config \/etc\/slony1\/slon_tools.conf\r\nslon_status --config \/etc\/slony1\/slon_tools.conf<\/pre>\n<li>Abonnement du noeud souscripteur aux sets concern\u00e9s<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">slonik_subscribe_set --config \/etc\/slony1\/slon_tools.conf set_pagila node_id | slonik<\/pre>\n<li>Le temps de la premi\u00e8re r\u00e9plication d\u00e9pendra de la volum\u00e9trie des bases<\/li>\n<\/ul>\n<\/li>\n<li>Arr\u00eat des applications<\/li>\n<li>Mise \u00e0 jour des s\u00e9quences<\/li>\n<li>Bascules (bascule base par base):<\/li>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">slonik_move_set --config \/etc\/slony1\/slon_tools.conf set_pagila &amp;lt;node_id ancien fournisseur&amp;gt; &amp;lt;node_id ancien souscripteur&amp;gt; | slonik<\/pre>\n<\/ul>\n<ul>\n<li>Red\u00e9marrage des applications<\/li>\n<\/ul>\n<h2>Conclusion :<\/h2>\n<p>Slony-I nous a permis de r\u00e9pliquer les bases d&#8217;une instance en 9.3 vers une instance en 11. Ce qui a fortement r\u00e9duit la dur\u00e9e de coupure de service de cette migration. La r\u00e9plication se g\u00e8re au niveau base, il est totalement possible de basculer le r\u00f4le de povider base par base. Notamment dans le cas o\u00f9 toutes les applications ne peuvent pas \u00eatre coup\u00e9es au m\u00eame moment.<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061&#038;title=Migration%20PostgreSQL%20via%20SLONY-I%20ou%20comment%20r%C3%A9duire%20le%20temps%20de%20coupure\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Migration%20PostgreSQL%20via%20SLONY-I%20ou%20comment%20r%C3%A9duire%20le%20temps%20de%20coupure&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8061\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>R\u00e9cemment j\u2019ai eu \u00e0 faire l\u2019upgrade d\u2019un cluster physique PostgreSQL 9.3 vers 11. Contexte : Pour cette migration, il y avait plusieurs contraintes: Applications critiques, ce qui impose de r\u00e9duire au maximum la coupure de service. Serveurs physiques avec des&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":8273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266],"tags":[337,21,137,31,336,333,334,335,223],"class_list":["post-8061","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-bascule","tag-cluster","tag-migration","tag-replication","tag-replication-logique","tag-slony","tag-slony-1","tag-slony-i","tag-upgrade"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"R\u00e9cemment j\u2019ai eu \u00e0 faire l\u2019upgrade d\u2019un cluster physique PostgreSQL 9.3 vers 11. Contexte : Pour cette migration, il y avait plusieurs contraintes: Applications critiques, ce qui impose de r\u00e9duire au maximum la coupure de service. Serveurs physiques avec des&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-27T09:56:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-01-29T13:33:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2020\/01\/replication.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"519\" \/>\n\t<meta property=\"og:image:height\" content=\"276\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Capdata team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Capdata team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\"},\"author\":{\"name\":\"Capdata team\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\"},\"headline\":\"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure\",\"datePublished\":\"2020-01-27T09:56:07+00:00\",\"dateModified\":\"2020-01-29T13:33:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\"},\"wordCount\":1272,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"bascule\",\"cluster\",\"migration\",\"replication\",\"r\u00e9plication logique\",\"slony\",\"slony-1\",\"slony-I\",\"upgrade\"],\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\",\"name\":\"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2020-01-27T09:56:07+00:00\",\"dateModified\":\"2020-01-29T13:33:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\",\"name\":\"Capdata team\",\"sameAs\":[\"https:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/","og_locale":"fr_FR","og_type":"article","og_title":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG","og_description":"R\u00e9cemment j\u2019ai eu \u00e0 faire l\u2019upgrade d\u2019un cluster physique PostgreSQL 9.3 vers 11. Contexte : Pour cette migration, il y avait plusieurs contraintes: Applications critiques, ce qui impose de r\u00e9duire au maximum la coupure de service. Serveurs physiques avec des&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2020-01-27T09:56:07+00:00","article_modified_time":"2020-01-29T13:33:02+00:00","og_image":[{"width":519,"height":276,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2020\/01\/replication.jpg","type":"image\/jpeg"}],"author":"Capdata team","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Capdata team","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/"},"author":{"name":"Capdata team","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9"},"headline":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure","datePublished":"2020-01-27T09:56:07+00:00","dateModified":"2020-01-29T13:33:02+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/"},"wordCount":1272,"commentCount":2,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["bascule","cluster","migration","replication","r\u00e9plication logique","slony","slony-1","slony-I","upgrade"],"articleSection":["PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/","url":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/","name":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2020-01-27T09:56:07+00:00","dateModified":"2020-01-29T13:33:02+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/migration-postgresql-via-slony-i-ou-comment-reduire-le-temps-de-coupure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Migration PostgreSQL via SLONY-I ou comment r\u00e9duire le temps de coupure"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9","name":"Capdata team","sameAs":["https:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=8061"}],"version-history":[{"count":37,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8061\/revisions"}],"predecessor-version":[{"id":8274,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8061\/revisions\/8274"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/8273"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=8061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=8061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=8061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}