{"id":38146,"date":"2019-10-31T22:21:54","date_gmt":"2019-10-31T19:21:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\/"},"modified":"2019-10-31T22:21:54","modified_gmt":"2019-10-31T19:21:54","slug":"perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"R\u00e9plication crois\u00e9e entre PostgreSQL et MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"R\u00e9plication crois\u00e9e entre PostgreSQL et MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je vais vous parler en g\u00e9n\u00e9ral de la r\u00e9plication crois\u00e9e entre PostgreSQL et MySQL, ainsi que des m\u00e9thodes de configuration de cette r\u00e9plication entre ces deux serveurs de base de donn\u00e9es. Les bases de donn\u00e9es en r\u00e9plication crois\u00e9e sont g\u00e9n\u00e9ralement appel\u00e9es homog\u00e8nes, et c'est une m\u00e9thode pratique pour migrer d'un serveur de SGBDR \u00e0 un autre.<\/p>\n<p><\/p>\n<p>Les bases de donn\u00e9es PostgreSQL et MySQL sont traditionnellement consid\u00e9r\u00e9es comme relationnelles, mais avec des extensions suppl\u00e9mentaires, elles offrent \u00e9galement des possibilit\u00e9s NoSQL. Ici, nous allons discuter de la r\u00e9plication entre PostgreSQL et MySQL, du point de vue des SGBDR.<\/p>\n<p><\/p>\n<p>Nous ne d\u00e9crirons pas l'ensemble de l'architecture interne, juste les principes de base, afin que vous ayez une id\u00e9e de la configuration de la r\u00e9plication entre les serveurs de base de donn\u00e9es, des avantages, des limitations et des sc\u00e9narios d'utilisation.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>En g\u00e9n\u00e9ral, la r\u00e9plication entre deux serveurs de base de donn\u00e9es identiques s'effectue soit en mode binaire, soit par des requ\u00eates entre le n\u0153ud principal (aussi appel\u00e9 \u00e9diteur, ma\u00eetre ou actif) et l'\u00e9gal (abonn\u00e9, en attente ou passif). L'objectif de la r\u00e9plication est de fournir en temps r\u00e9el une copie de la base de donn\u00e9es principale sur le c\u00f4t\u00e9 de l'\u00e9gal. Les donn\u00e9es sont ainsi transf\u00e9r\u00e9es du principal vers l'\u00e9gal, c'est-\u00e0-dire de l'actif vers le passif, car la r\u00e9plication ne se fait que dans un sens. Toutefois, il est possible de configurer une r\u00e9plication entre deux bases de donn\u00e9es dans les deux sens, permettant le transfert de donn\u00e9es de l'\u00e9gal vers le principal dans une configuration \u00ab actif-actif \u00bb. Tout cela, y compris la r\u00e9plication en cascade, est possible entre deux serveurs de base de donn\u00e9es identiques ou plus. La configuration \u00ab actif-actif \u00bb ou \u00ab actif-passif \u00bb d\u00e9pend des besoins, de la disponibilit\u00e9 de ces fonctionnalit\u00e9s dans la configuration d'origine ou de l'utilisation de solutions externes pour la configuration et des compromis existants.<\/p>\n<p><\/p>\n<p>La configuration d\u00e9crite est possible entre diff\u00e9rents serveurs de base de donn\u00e9es. Un serveur peut \u00eatre configur\u00e9 pour recevoir des donn\u00e9es r\u00e9pliqu\u00e9es d'un autre serveur de base de donn\u00e9es tout en sauvegardant des instantan\u00e9s des donn\u00e9es r\u00e9pliqu\u00e9es en temps r\u00e9el. MySQL et PostgreSQL proposent la plupart de ces configurations, soit par leurs propres moyens, soit par le biais d'extensions tierces, y compris des m\u00e9thodes de journal binaire, de verrouillage de disque et des m\u00e9thodes bas\u00e9es sur des op\u00e9rateurs et des lignes.<\/p>\n<p><\/p>\n<p>La r\u00e9plication crois\u00e9e entre MySQL et PostgreSQL est n\u00e9cessaire pour une migration unique d'un serveur de base de donn\u00e9es \u00e0 un autre. Ces bases de donn\u00e9es utilisent diff\u00e9rents protocoles, il n'est donc pas possible de les relier directement. Pour \u00e9tablir un \u00e9change de donn\u00e9es, vous pouvez utiliser un outil open source externe, comme pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Qu'est-ce que pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon est un syst\u00e8me de r\u00e9plication de MySQL vers PostgreSQL en Python 3. Il utilise une biblioth\u00e8que open source mysql-replication, \u00e9galement en Python. Les images de lignes sont extraites des tables MySQL et enregistr\u00e9es en tant qu'objets JSONB dans la base de donn\u00e9es PostgreSQL, puis d\u00e9cod\u00e9es par une fonction pl\/pgsql et reproduites dans la base de donn\u00e9es PostgreSQL.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Fonctionnalit\u00e9s de pg_chameleon<\/h3>\n<p><\/p>\n<p>Plusieurs sch\u00e9mas MySQL d'un m\u00eame cluster peuvent \u00eatre r\u00e9pliqu\u00e9s dans une seule base de donn\u00e9es cible PostgreSQL avec une configuration \u00ab un \u00e0 plusieurs \u00bb<br \/>\nLes noms des sch\u00e9mas source et cible ne peuvent pas co\u00efncider.<br \/>\nLes donn\u00e9es de r\u00e9plication peuvent \u00eatre extraites d'une r\u00e9plique en cascade MySQL.<br \/>\nLes tables qui ne peuvent pas \u00eatre r\u00e9pliqu\u00e9es ou qui g\u00e9n\u00e8rent des erreurs sont exclues.<br \/>\nChaque fonction de r\u00e9plication est g\u00e9r\u00e9e par des d\u00e9mons.<br \/>\nContr\u00f4le via des param\u00e8tres et des fichiers de configuration bas\u00e9s sur YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Exemple<\/h3>\n<p><\/p>\n<p>H\u00f4te<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Version du syst\u00e8me d'exploitation<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Version du serveur de base de donn\u00e9es<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Port de la base de donn\u00e9es<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>Adresse IP<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Pour commencer, pr\u00e9parez tous les composants n\u00e9cessaires \u00e0 l'installation de pg_chameleon. Dans cet exemple, Python 3.6.8 est install\u00e9, cr\u00e9ant un environnement virtuel et l'activant.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; wget https:\/\/www.python.org\/ftp\/python\/3.6.8\/Python-3.6.8.tar.xz\n$&gt; tar -xJf Python-3.6.8.tar.xz\n$&gt; cd Python-3.6.8\n$&gt; .\/configure --enable-optimizations\n$&gt; make altinstall<\/code><\/pre>\n<p><\/p>\n<p>Apr\u00e8s l'installation r\u00e9ussie de Python 3.6, vous devez remplir les autres exigences, comme cr\u00e9er et activer un environnement virtuel. De plus, le module pip est mis \u00e0 jour vers la derni\u00e8re version et utilis\u00e9 pour installer pg_chameleon. Dans les commandes ci-dessous, nous choisissons intentionnellement d'installer pg_chameleon 2.0.9, m\u00eame si la version la plus r\u00e9cente est 2.0.10. Cela est n\u00e9cessaire pour \u00e9viter de nouveaux bugs dans la version mise \u00e0 jour.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; python3.6 -m venv venv\n$&gt; source venv\/bin\/activate\n(venv) $&gt; pip install pip --upgrade\n(venv) $&gt; pip install pg_chameleon==2.0.9<\/code><\/pre>\n<p><\/p>\n<p>Ensuite, nous invoquons pg_chameleon (chameleon est la commande) avec l'argument set_configuration_files pour activer pg_chameleon et cr\u00e9er les r\u00e9pertoires et fichiers de configuration par d\u00e9faut.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\ncreating directory \/root\/.pg_chameleon\ncreating directory \/root\/.pg_chameleon\/configuration\/\ncreating directory \/root\/.pg_chameleon\/logs\/\ncreating directory \/root\/.pg_chameleon\/pid\/\ncoping configuration example in \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Nous cr\u00e9ons maintenant une copie de config-example.yml en tant que default.yml, afin qu'elle devienne le fichier de configuration par d\u00e9faut. Un exemple de fichier de configuration pour cet exemple est donn\u00e9 ci-dessous.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#param\u00e8tres globaux\npid_dir: '~\/.pg_chameleon\/pid\/'\nlog_dir: '~\/.pg_chameleon\/logs\/'\nlog_dest: file\nlog_level: info\nlog_days_keep: 10\nrollbar_key: ''\nrollbar_env: ''\n\n# type_override permet \u00e0 l'utilisateur de remplacer la conversion de type par d\u00e9faut par une autre.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n# connexion de destination postgres\npg_conn:\n  host: \"192.168.56.106\"\n  port: \"5433\"\n  user: \"usr_replica\"\n  password: \"pass123\"\n  database: \"db_replica\"\n  charset: \"utf8\"\n\nsources:\n  mysql:\n    db_conn:\n      host: \"192.168.56.102\"\n      port: \"3306\"\n      user: \"usr_replica\"\n      password: \"pass123\"\n      charset: 'utf8'\n      connect_timeout: 10\n    schema_mappings:\n      world_x: pgworld_x\n    limit_tables:\n#      - delphis_mediterranea.foo\n    skip_tables:\n#      - delphis_mediterranea.bar\n    grant_select_to:\n      - usr_readonly\n    lock_timeout: \"120s\"\n    my_server_id: 100\n    replica_batch_size: 10000\n    replay_max_rows: 10000\n    batch_retention: '1 day'\n    copy_max_memory: \"300M\"\n    copy_mode: 'file'\n    out_dir: \/tmp\n    sleep_loop: 1\n    on_error_replay: continue\n    on_error_read: continue\n    auto_maintenance: \"disabled\"\n    gtid_enable: No\n    type: mysql\n    skip_events:\n      insert:\n        - delphis_mediterranea.foo #ignore les insertions dans la table delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #ignore les suppressions dans le sch\u00e9ma delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Le fichier de configuration dans cet exemple est un mod\u00e8le de fichier pg_chameleon avec des modifications mineures en fonction des environnements source et cible, et ci-dessous se trouve un aper\u00e7u des diff\u00e9rentes sections du fichier de configuration.<\/p>\n<p><\/p>\n<p>Le fichier de configuration default.yml contient une section de param\u00e8tres globaux (global settings), o\u00f9 vous pouvez g\u00e9rer des r\u00e9glages tels que l'emplacement du fichier de verrouillage, l'emplacement des journaux, la p\u00e9riode de conservation des journaux, etc. Ensuite, il y a une section de remplacement de type (type override), o\u00f9 un ensemble de r\u00e8gles pour le remplacement des types pendant la r\u00e9plication est sp\u00e9cifi\u00e9. Dans l'exemple par d\u00e9faut, une r\u00e8gle de remplacement de type est utilis\u00e9e pour convertir tinyint(1) en une valeur bool\u00e9enne. Dans la section suivante, nous sp\u00e9cifions les d\u00e9tails de connexion \u00e0 la base de donn\u00e9es cible. Dans notre cas, il s'agit d'une base de donn\u00e9es PostgreSQL, d\u00e9sign\u00e9e par pg_conn. Dans la derni\u00e8re section, nous indiquons les donn\u00e9es sources, c'est-\u00e0-dire les param\u00e8tres de connexion \u00e0 la base de donn\u00e9es source, le sch\u00e9ma de correspondance entre les bases de donn\u00e9es source et cible, les tables \u00e0 ignorer, le d\u00e9lai d'attente, la m\u00e9moire, la taille des lots. Notez que \u00ab sources \u00bb est pr\u00e9cis\u00e9 au pluriel, indiquant que nous pouvons ajouter plusieurs bases de donn\u00e9es sources pour une seule cible afin de configurer une configuration \u00ab plusieurs \u00e0 un \u00bb.<\/p>\n<p><\/p>\n<p>La base de donn\u00e9es world_x dans l'exemple contient 4 tables avec des lignes que la communaut\u00e9 MySQL propose \u00e0 titre d'exemple. Elle peut \u00eatre t\u00e9l\u00e9charg\u00e9e. <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">ici<\/a><\/noindex>. L'exemple de base de donn\u00e9es est fourni sous forme d'archive tar compress\u00e9e avec des instructions pour cr\u00e9er et importer des lignes.<\/p>\n<p><\/p>\n<p>Dans les bases de donn\u00e9es MySQL et PostgreSQL, un utilisateur sp\u00e9cial est cr\u00e9\u00e9 avec le m\u00eame nom usr_replica. Dans MySQL, il re\u00e7oit des droits suppl\u00e9mentaires pour lire toutes les tables r\u00e9pliqu\u00e9es.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; CREATE USER usr_replica ;\nmysql&gt; SET PASSWORD FOR usr_replica='pass123';\nmysql&gt; GRANT ALL ON world_x.* TO 'usr_replica';\nmysql&gt; GRANT RELOAD ON *.* to 'usr_replica';\nmysql&gt; GRANT REPLICATION CLIENT ON *.* to 'usr_replica';\nmysql&gt; GRANT REPLICATION SLAVE ON *.* to 'usr_replica';\nmysql&gt; FLUSH PRIVILEGES;<\/code><\/pre>\n<p><\/p>\n<p>Du c\u00f4t\u00e9 de PostgreSQL, une base de donn\u00e9es db_replica est cr\u00e9\u00e9e, qui accueillera les modifications de la base de donn\u00e9es MySQL. L'utilisateur usr_replica dans PostgreSQL est automatiquement configur\u00e9 comme propri\u00e9taire de deux sch\u00e9mas pgworld_x et sch_chameleon, qui contiennent respectivement les tables r\u00e9pliqu\u00e9es r\u00e9elles et les tables de catalogues de r\u00e9plication. La configuration automatique est g\u00e9r\u00e9e par l'argument create_replica_schema, comme vous le verrez ci-dessous.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';\nCREATE ROLE\npostgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;\nCREATE DATABASE<\/code><\/pre>\n<p><\/p>\n<p>La base de donn\u00e9es MySQL est configur\u00e9e avec des modifications de certains param\u00e8tres pour la pr\u00e9parer \u00e0 la r\u00e9plication, comme montr\u00e9 ci-dessous. Il sera n\u00e9cessaire de red\u00e9marrer le serveur de base de donn\u00e9es pour que les changements prennent effet.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; vi \/etc\/my.cnf\nbinlog_format= ROW\nbinlog_row_image=FULL\nlog-bin = mysql-bin\nserver-id = 1<\/code><\/pre>\n<p><\/p>\n<p>Il est maintenant important de v\u00e9rifier la connexion aux deux serveurs de base de donn\u00e9es pour \u00e9viter tout probl\u00e8me lors de l'ex\u00e9cution des commandes pg_chameleon.<\/p>\n<p><\/p>\n<p>Sur le n\u0153ud PostgreSQL :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x<\/code><\/pre>\n<p><\/p>\n<p>Sur le n\u0153ud MySQL :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica<\/code><\/pre>\n<p><\/p>\n<p>Les trois commandes suivantes de pg_chameleon (chameleon) pr\u00e9parent l'environnement, ajoutent la source et initialisent la r\u00e9plique. L'argument create_replica_schema dans pg_chameleon cr\u00e9e le sch\u00e9ma par d\u00e9faut (sch_chameleon) et le sch\u00e9ma de r\u00e9plication (pgworld_x) dans la base de donn\u00e9es PostgreSQL, comme nous l'avons d\u00e9j\u00e0 mentionn\u00e9. L'argument add_source ajoute la base de donn\u00e9es source \u00e0 la configuration en lisant le fichier de configuration (default.yml), et dans notre cas, c'est mysql, tandis que init_replica initialise la configuration en fonction des param\u00e8tres du fichier de configuration.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon create_replica_schema --debug\n$&gt; chameleon add_source --config default --source mysql --debug\n$&gt; chameleon init_replica --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<p>Les sorties de ces trois commandes indiquent clairement leur ex\u00e9cution r\u00e9ussie. Tous les dysfonctionnements ou erreurs de syntaxe sont signal\u00e9s par des messages simples et compr\u00e9hensibles, accompagn\u00e9s de conseils pour corriger les probl\u00e8mes.<\/p>\n<p><\/p>\n<p>Enfin, lan\u00e7ons la r\u00e9plication en utilisant start_replica et recevons un message de succ\u00e8s.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: D\u00e9marrage du processus de r\u00e9plication pour la source mysql<\/code><\/pre>\n<p><\/p>\n<p>Le statut de la r\u00e9plication peut \u00eatre interrog\u00e9 \u00e0 l'aide de l'argument show_status, et les erreurs peuvent \u00eatre consult\u00e9es \u00e0 l'aide de l'argument show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">R\u00e9sultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Comme nous l'avons d\u00e9j\u00e0 mentionn\u00e9, chaque fonction de r\u00e9plication est g\u00e9r\u00e9e par des d\u00e9mons. Pour les visualiser, interrogeons la table des processus avec la commande Linux ps, comme indiqu\u00e9 ci-dessous.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">R\u00e9sultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>La r\u00e9plication n'est pas consid\u00e9r\u00e9e comme configur\u00e9e tant que nous ne l'avons pas test\u00e9e en temps r\u00e9el, comme indiqu\u00e9 ci-dessous. Nous cr\u00e9ons une table, ins\u00e9rons quelques enregistrements dans la base de donn\u00e9es MySQL et activons l'argument sync_tables dans pg_chameleon pour mettre \u00e0 jour les d\u00e9mons et r\u00e9pliquer la table avec les enregistrements dans la base de donn\u00e9es PostgreSQL.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nQuery OK, 0 rows affected (0.01 sec)\nmysql&gt; insert into t1 values (1,'one');\nQuery OK, 1 row affected (0.00 sec)\nmysql&gt; insert into t1 values (2,'two');\nQuery OK, 1 row affected (0.00 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon sync_tables --tables world_x.t1 --config default --source mysql\nProcessus de synchronisation des tables pour la source mysql d\u00e9marr\u00e9.<\/code><\/pre>\n<p><\/p>\n<p>Pour confirmer les r\u00e9sultats du test, interrogeons la table de la base de donn\u00e9es PostgreSQL et affichons les lignes.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; psql -p 5433 -U usr_replica -d db_replica -c \"select * from pgworld_x.t1\";\n n1 |  n2\n----+-------\n  1 | one\n  2 | two<\/code><\/pre>\n<p><\/p>\n<p>Si nous effectuons une migration, les commandes pg_chameleon suivantes en seront la conclusion. Les commandes doivent \u00eatre ex\u00e9cut\u00e9es apr\u00e8s que nous nous soyons assur\u00e9s que les lignes de toutes les tables cibles ont \u00e9t\u00e9 r\u00e9pliqu\u00e9es, le r\u00e9sultat \u00e9tant une base de donn\u00e9es PostgreSQL soigneusement transf\u00e9r\u00e9e sans liens vers la base de donn\u00e9es source ou le sch\u00e9ma de r\u00e9plication (sch_chameleon).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon stop_replica --config default --source mysql \n$&gt; chameleon detach_replica --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<p>Facultativement, les commandes suivantes peuvent \u00eatre utilis\u00e9es pour supprimer la configuration source et le sch\u00e9ma de r\u00e9plication.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon drop_source --config default --source mysql --debug\n$&gt; chameleon drop_replica_schema --config default --source mysql --debug<\/code><\/pre>\n<p><\/p>\n<h3 id=\"preimuschestva-pg_chameleon\">Les avantages de pg_chameleon<\/h3>\n<p><\/p>\n<p>Configuration et param\u00e9trage simples.<br \/>\nD\u00e9pannage et identification des anomalies faciles avec des messages d'erreur clairs.<br \/>\nIl est possible d'ajouter des tables sp\u00e9ciales suppl\u00e9mentaires \u00e0 la r\u00e9plication apr\u00e8s l'initialisation, sans modifier le reste de la configuration.<br \/>\nIl est possible de configurer plusieurs bases de donn\u00e9es sources pour une seule cible, ce qui est tr\u00e8s pratique si vous combinez des donn\u00e9es provenant d'une ou plusieurs bases de donn\u00e9es MySQL dans une seule base de donn\u00e9es PostgreSQL.<br \/>\nIl est possible de ne pas r\u00e9pliquer les tables s\u00e9lectionn\u00e9es.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Inconv\u00e9nients de pg_chameleon<\/h3>\n<p><\/p>\n<p>Il est support\u00e9 uniquement avec MySQL 5.5 et sup\u00e9rieur comme source et PostgreSQL 9.5 et sup\u00e9rieur comme base de donn\u00e9es cible.<br \/>\nChaque table doit avoir une cl\u00e9 primaire ou unique, sinon les tables sont initialis\u00e9es lors du processus init_replica, mais ne sont pas r\u00e9pliqu\u00e9es.<br \/>\nLa r\u00e9plication unidirectionnelle \u2014 uniquement de MySQL vers PostgreSQL. Elle convient donc uniquement au sch\u00e9ma \u00ab actif-passif \u00bb.<br \/>\nLa source ne peut \u00eatre qu'une base de donn\u00e9es MySQL, et le support de la base de donn\u00e9es PostgreSQL comme source est seulement exp\u00e9rimental et avec des contraintes (en savoir plus <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">ici<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">R\u00e9sum\u00e9 sur pg_chameleon<\/h3>\n<p><\/p>\n<p>La m\u00e9thode de r\u00e9plication dans pg_chameleon est id\u00e9ale pour migrer une base de donn\u00e9es de MySQL vers PostgreSQL. Le principal inconv\u00e9nient est que la r\u00e9plication est uniquement unidirectionnelle, donc les experts en bases de donn\u00e9es ne voudront probablement l'utiliser que pour des migrations. Mais le probl\u00e8me de la r\u00e9plication unidirectionnelle peut \u00eatre r\u00e9solu par un autre outil open source : SymmetricDS.<\/p>\n<p><\/p>\n<p>Pour plus de d\u00e9tails, consultez la documentation officielle <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">ici<\/a><\/noindex>. L'aide en ligne pour la ligne de commande est disponible <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">ici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Aper\u00e7u de SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS est un outil open source qui r\u00e9plique n'importe quelle base de donn\u00e9es vers une autre base de donn\u00e9es courante : Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird et d'autres instances cloud de bases de donn\u00e9es, comme Redshift et Azure, etc. Les fonctionnalit\u00e9s disponibles : synchronisation de bases de donn\u00e9es et de fichiers, r\u00e9plication de plusieurs bases de donn\u00e9es sources, synchronisation filtr\u00e9e, transformation, et autres. C'est un outil bas\u00e9 sur Java, n\u00e9cessitant une version standard de JRE ou JDK (version 8.0 ou sup\u00e9rieure). Il est possible d'enregistrer les modifications des donn\u00e9es par des d\u00e9clencheurs dans la base de donn\u00e9es source et de les diriger vers la base de donn\u00e9es cible correspondante sous forme de paquets.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Fonctionnalit\u00e9s de SymmetricDS<\/h3>\n<p><\/p>\n<p>L'outil est ind\u00e9pendant de la plateforme, ce qui signifie que deux bases de donn\u00e9es diff\u00e9rentes ou plus peuvent \u00e9changer des donn\u00e9es.<br \/>\nLes bases de donn\u00e9es relationnelles sont synchronis\u00e9es par l'enregistrement des modifications de donn\u00e9es, tandis que les bases de donn\u00e9es bas\u00e9es sur des syst\u00e8mes de fichiers utilisent la synchronisation de fichiers.<br \/>\nR\u00e9plication bidirectionnelle en utilisant des m\u00e9thodes Push et Pull bas\u00e9es sur un ensemble de r\u00e8gles.<br \/>\nLe transfert de donn\u00e9es est possible via des r\u00e9seaux s\u00e9curis\u00e9s et des r\u00e9seaux \u00e0 faible bande passante.<br \/>\nR\u00e9cup\u00e9ration automatique lors de la reprise des n\u0153uds apr\u00e8s une panne et r\u00e9solution automatique des conflits.<br \/>\nCompatibilit\u00e9 avec le cloud et API d'extension efficaces.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Exemple<\/h3>\n<p><\/p>\n<p>SymmetricDS peut \u00eatre configur\u00e9 dans l'un des deux modes :<br \/>\nUn n\u0153ud principal (parent) qui coordonne de mani\u00e8re centralis\u00e9e la r\u00e9plication des donn\u00e9es entre deux n\u0153uds secondaires (enfant), et les \u00e9changes de donn\u00e9es entre les n\u0153uds enfants se font uniquement par l'interm\u00e9diaire du parent.<br \/>\nUn n\u0153ud actif (n\u0153ud 1) peut \u00e9changer des donn\u00e9es pour la r\u00e9plication avec un autre n\u0153ud actif (n\u0153ud 2) sans interm\u00e9diaire.<\/p>\n<p><\/p>\n<p>Dans les deux cas, l'\u00e9change de donn\u00e9es se fait via Push et Pull. Dans cet exemple, nous allons examiner la configuration \u00ab actif-actif \u00bb. D\u00e9crire toute l'architecture prend trop de temps, donc consultez <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">guide<\/a><\/noindex>, pour en savoir plus sur le dispositif SymmetricDS.<\/p>\n<p><\/p>\n<p>Installer SymmetricDS est tr\u00e8s simple : t\u00e9l\u00e9chargez la version open source du fichier zip <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">d'ici<\/a><\/noindex> et d\u00e9compressez-le o\u00f9 vous le souhaitez. Le tableau ci-dessous fournit des informations sur l'emplacement de l'installation et la version de SymmetricDS dans cet exemple, ainsi que les versions des bases de donn\u00e9es, les versions Linux, les adresses IP et les ports pour les deux n\u0153uds.<\/p>\n<p><\/p>\n<p>H\u00f4te<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Version du syst\u00e8me d'exploitation<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Version du serveur de base de donn\u00e9es<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Port de la base de donn\u00e9es<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>Adresse IP<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Version de SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Chemin d'installation de SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Nom du n\u0153ud SymmetricDS<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Ici, nous installons SymmetricDS dans \/usr\/local\/symmetric-server-3.9.20, et diff\u00e9rents sous-r\u00e9pertoires et fichiers seront stock\u00e9s ici. Nous nous int\u00e9ressons aux sous-r\u00e9pertoires samples et engines. Le r\u00e9pertoire samples contient des exemples de fichiers de configuration avec les propri\u00e9t\u00e9s du n\u0153ud, ainsi que des exemples de scripts SQL pour un d\u00e9marrage rapide de la d\u00e9monstration.<\/p>\n<p><\/p>\n<p>Dans le r\u00e9pertoire samples, nous voyons trois fichiers de configuration avec les propri\u00e9t\u00e9s du n\u0153ud \u2014 le nom indique la nature du n\u0153ud dans un sch\u00e9ma donn\u00e9.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">corp-000.properties\nstore-001.properties\nstore-002.properties<\/code><\/pre>\n<p><\/p>\n<p>SymmetricDS contient tous les fichiers de configuration n\u00e9cessaires pour un sch\u00e9ma de base de 3 n\u0153uds (option 1), et ces m\u00eames fichiers peuvent \u00eatre utilis\u00e9s pour un sch\u00e9ma de 2 n\u0153uds (option 2). Nous copions le fichier de configuration n\u00e9cessaire du r\u00e9pertoire samples dans engines sur l'h\u00f4te vm1. Cela donne :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat engines\/corp-000.properties\nengine.name=corp-000\ndb.driver=com.mysql.jdbc.Driver\ndb.url=jdbc:mysql:\/\/192.168.1.107:3306\/replica_db?autoReconnect=true&amp;useSSL=false\ndb.user=root\ndb.password=admin123\nregistration.url=\nsync.url=http:\/\/192.168.1.107:31415\/sync\/corp-000\ngroup.id=corp\nexternal.id=000<\/code><\/pre>\n<p><\/p>\n<p>Ce n\u0153ud dans la configuration de SymmetricDS s'appelle corp-000, et la connexion \u00e0 la base de donn\u00e9es est g\u00e9r\u00e9e par le pilote mysql jdbc, qui utilise la cha\u00eene de connexion indiqu\u00e9e ci-dessus et les identifiants de connexion. Nous nous connectons \u00e0 la base de donn\u00e9es replica_db, et lors de la cr\u00e9ation du sch\u00e9ma, des tables seront cr\u00e9\u00e9es. sync.url indique l'emplacement de liaison avec le n\u0153ud pour la synchronisation.<\/p>\n<p><\/p>\n<p>Le n\u0153ud 2 sur l'h\u00f4te vm2 est configur\u00e9 comme store-001, et le reste est indiqu\u00e9 dans le fichier node.properties ci-dessous. Le n\u0153ud store-001 ex\u00e9cute une base de donn\u00e9es PostgreSQL, et pgdb_replica est la base de donn\u00e9es pour la r\u00e9plication. registration.url permet \u00e0 l'h\u00f4te vm2 de contacter l'h\u00f4te vm1 et d'obtenir les d\u00e9tails de configuration.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat engines\/store-001.properties\nengine.name=store-001\ndb.driver=org.postgresql.Driver\ndb.url=jdbc:postgresql:\/\/192.168.1.112:5832\/pgdb_replica\ndb.user=postgres\ndb.password=admin123\nregistration.url=http:\/\/192.168.1.107:31415\/sync\/corp-000\ngroup.id=store\nexternal.id=001<\/code><\/pre>\n<p><\/p>\n<p>L'exemple de SymmetricDS comprend des param\u00e8tres pour configurer une r\u00e9plication bidirectionnelle entre deux serveurs de base de donn\u00e9es (deux n\u0153uds). Les \u00e9tapes ci-dessous sont ex\u00e9cut\u00e9es sur l'h\u00f4te vm1 (corp-000), qui cr\u00e9era un exemple de sch\u00e9ma avec 4 tables. Ensuite, l'ex\u00e9cution de create-sym-tables avec la commande symadmin cr\u00e9e des tables de catalogues o\u00f9 seront stock\u00e9es les r\u00e8gles et la direction de r\u00e9plication entre les n\u0153uds. Enfin, des donn\u00e9es d'exemple sont charg\u00e9es dans les tables.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm1$&gt; .\/dbimport --engine corp-000 --format XML create_sample.xml\nvm1$&gt; .\/symadmin --engine corp-000 create-sym-tables\nvm1$&gt; .\/dbimport --engine corp-000 insert_sample.sql<\/code><\/pre>\n<p><\/p>\n<p>Dans l'exemple, les tables item et item_selling_price sont configur\u00e9es automatiquement pour la r\u00e9plication de corp-000 vers store-001, tandis que les tables sale (sale_transaction et sale_return_line_item) sont automatiquement configur\u00e9es pour la r\u00e9plication de store-001 vers corp-000. Nous cr\u00e9ons maintenant le sch\u00e9ma dans la base de donn\u00e9es PostgreSQL sur l'h\u00f4te vm2 (store-001) pour le pr\u00e9parer \u00e0 recevoir des donn\u00e9es de corp-000.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm2$&gt; .\/dbimport --engine store-001 --format XML create_sample.xml<\/code><\/pre>\n<p><\/p>\n<p>Assurez-vous qu'il y a des exemples de tables et des tables de catalogues SymmetricDS dans la base de donn\u00e9es MySQL sur vm1. Notez que les tables syst\u00e8me de SymmetricDS (avec le pr\u00e9fixe sym_) sont actuellement disponibles uniquement sur le n\u0153ud corp-000, car c'est l\u00e0 que nous avons ex\u00e9cut\u00e9 la commande create-sym-tables et que nous allons g\u00e9rer la r\u00e9plication. En outre, la base de donn\u00e9es sur le n\u0153ud store-001 n'aura que 4 tables d'exemple sans donn\u00e9es.<\/p>\n<p><\/p>\n<p>C'est tout. L'environnement est pr\u00eat pour le lancement des processus serveur sym sur les deux n\u0153uds, comme indiqu\u00e9 ci-dessous.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm1$&gt; sym 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p><\/p>\n<p>Les enregistrements des journaux sont envoy\u00e9s dans le fichier de journal en arri\u00e8re-plan (symmetric.log) dans le dossier des journaux du r\u00e9pertoire o\u00f9 SymmetricDS est install\u00e9, ainsi que dans la sortie standard. Le serveur sym peut maintenant \u00eatre initi\u00e9 sur le n\u0153ud store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; cd \/usr\/local\/symmetric-server-3.9.20\/bin\nvm2$&gt; sym 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p><\/p>\n<p>Si vous lancez le processus serveur sym sur l'h\u00f4te vm2, il cr\u00e9era \u00e9galement des tables de r\u00e9pertoire SymmetricDS dans la base de donn\u00e9es PostgreSQL. Si vous lancez le processus serveur sym sur les deux n\u0153uds, ils se coordonneront pour r\u00e9pliquer les donn\u00e9es de corp-000 vers store-001. Si, apr\u00e8s quelques secondes, nous demandons les 4 tables de chaque c\u00f4t\u00e9, nous verrons que la r\u00e9plication a \u00e9t\u00e9 effectu\u00e9e avec succ\u00e8s. Ou vous pouvez envoyer un chargement initial vers le n\u0153ud store-001 depuis corp-000 avec la commande suivante.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; .\/symadmin --engine corp-000 reload-node 001<\/code><\/pre>\n<p><\/p>\n<p>\u00c0 ce stade, un nouvel enregistrement est ins\u00e9r\u00e9 dans la table item de la base de donn\u00e9es MySQL sur le n\u0153ud corp-000 (h\u00f4te : vm1), et nous pouvons v\u00e9rifier sa r\u00e9plication dans la base de donn\u00e9es PostgreSQL sur le n\u0153ud store-001. Nous voyons une op\u00e9ration Pull pour d\u00e9placer les donn\u00e9es de corp-000 vers store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into item values ('22000002','Jelly Bean');\nQuery OK, 1 row affected (0.00 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">vm2$&gt; psql -p 5832 -U postgres pgdb_replica -c \"select * from item\"\n item_id  |   name\n----------+-----------\n 11000001 | Yummy Gum\n 22000002 | Jelly Bean\n(2 rows)<\/code><\/pre>\n<p><\/p>\n<p>Pour effectuer une op\u00e9ration Push pour d\u00e9placer des donn\u00e9es de store-001 vers corp-000, nous ins\u00e9rons un enregistrement dans la table sale_transaction et v\u00e9rifions que la r\u00e9plication a \u00e9t\u00e9 effectu\u00e9e.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">R\u00e9sultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Nous voyons la configuration r\u00e9ussie de la r\u00e9plication bidirectionnelle des tables d'exemple entre les bases de donn\u00e9es MySQL et PostgreSQL. Pour configurer la r\u00e9plication pour de nouvelles tables utilisateur, nous effectuons les \u00e9tapes suivantes. Nous cr\u00e9ons la table t1 \u00e0 titre d'exemple et configurons les r\u00e8gles de sa r\u00e9plication comme suit. Ainsi, nous configurons uniquement la r\u00e9plication de corp-000 vers store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table  t1 (no integer);\nQuery OK, 0 rows affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_channel (channel_id,create_time,last_update_time) \nvalues ('t1',current_timestamp,current_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_trigger (trigger_id, source_table_name,channel_id,\nlast_update_time, create_time) values ('t1', 't1', 't1', current_timestamp,\ncurrent_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into sym_trigger_router (trigger_id, router_id,\nInitial_load_order, create_time,last_update_time) values ('t1',\n'corp-2-store-1', 1, current_timestamp,current_timestamp);\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<p>La configuration re\u00e7oit une notification de modification du sch\u00e9ma, c'est-\u00e0-dire l'ajout d'une nouvelle table, \u00e0 l'aide de la commande symadmin avec l'argument sync-triggers, qui recr\u00e9e les d\u00e9clencheurs pour faire correspondre les d\u00e9finitions des tables. L'envoi du sch\u00e9ma est ex\u00e9cut\u00e9 pour transmettre les modifications du sch\u00e9ma au n\u0153ud store-001, et la r\u00e9plication de la table t1 est configur\u00e9e.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">vm1$&gt; .\\\/symadmin -e corp-000 --node=001 sync-triggers    \nvm1$&gt; .\\\/symadmin send-schema -e corp-000 --node=001 t1<\/code><\/pre>\n<p><\/p>\n<h3 id=\"preimuschestva-symmetricds\">Avantages de SymmetricDS<\/h3>\n<p><\/p>\n<p>Installation et configuration simples, y compris un ensemble de fichiers pr\u00eats \u00e0 l'emploi avec des param\u00e8tres pour cr\u00e9er un sch\u00e9ma avec trois ou deux n\u0153uds.<br \/>\nCross-plateforme des bases de donn\u00e9es et ind\u00e9pendance par rapport \u00e0 la plateforme, y compris serveurs, ordinateurs portables et appareils mobiles.<br \/>\nR\u00e9plication de n'importe quelle base de donn\u00e9es dans n'importe quelle autre base de donn\u00e9es localement, dans un WAN ou dans le cloud.<br \/>\nPossibilit\u00e9 de fonctionnement optimal avec une paire de bases de donn\u00e9es ou plusieurs milliers pour une r\u00e9plication facile.<br \/>\nVersion payante avec interface graphique et excellent support.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Inconv\u00e9nients de SymmetricDS<\/h3>\n<p><\/p>\n<p>Il est n\u00e9cessaire de d\u00e9finir manuellement dans la ligne de commande les r\u00e8gles et la direction de la r\u00e9plication \u00e0 travers des op\u00e9rateurs SQL pour charger les tables de catalogue, ce qui peut \u00eatre peu pratique.<br \/>\nConfigurer de nombreuses tables pour la r\u00e9plication peut \u00eatre fastidieux si on n'utilise pas de scripts pour cr\u00e9er des op\u00e9rateurs SQL d\u00e9finissant les r\u00e8gles et la direction de la r\u00e9plication.<br \/>\nTrop d'informations sont enregistr\u00e9es dans les logs, et parfois il faut faire le tri dans le fichier log pour qu'il ne prenne pas trop de place.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">R\u00e9sum\u00e9 sur SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS permet de configurer une r\u00e9plication bidirectionnelle entre deux, trois et m\u00eame plusieurs milliers de n\u0153uds pour effectuer la r\u00e9plication et synchroniser des fichiers. C'est un outil unique qui ex\u00e9cute de nombreuses t\u00e2ches de mani\u00e8re autonome, telles que la r\u00e9cup\u00e9ration automatique des donn\u00e9es apr\u00e8s une longue p\u00e9riode d'inactivit\u00e9 sur un n\u0153ud, un \u00e9change de donn\u00e9es s\u00e9curis\u00e9 et efficace entre les n\u0153uds via HTTPS, une gestion automatique des conflits bas\u00e9e sur un ensemble de r\u00e8gles, etc. SymmetricDS r\u00e9alise la r\u00e9plication entre toutes les bases de donn\u00e9es, ce qui permet de l'utiliser pour divers sc\u00e9narios, y compris la migration, la mise \u00e0 niveau, la distribution, le filtrage et la transformation des donn\u00e9es sur diff\u00e9rentes plateformes.<\/p>\n<p><\/p>\n<p>L'exemple est bas\u00e9 sur le <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">guide rapide officiel<\/a><\/noindex> de SymmetricDS. Dans <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">manuel de l'utilisateur<\/a><\/noindex> Les diff\u00e9rents concepts li\u00e9s \u00e0 la configuration de la r\u00e9plication \u00e0 l'aide de SymmetricDS sont d\u00e9crits en d\u00e9tail.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/467313\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL, \u0430 \u0435\u0449\u0435 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438, \u0438 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0438 MySQL \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438, \u043d\u043e \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38146","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:21:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:21:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47R\u00e9plication crois\u00e9e entre PostgreSQL et MySQL | ProHoster","description":"Je vais donner un aper\u00e7u g\u00e9n\u00e9ral.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 PostgreSQL \u0438 MySQL | ProHoster","og:description":"\u042f \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:21:54+00:00","article:modified_time":"2019-10-31T19:21:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38146","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 20:38:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:59:41","updated":"2026-01-23 20:38:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}