{"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\/nl\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Kruisreplicatie tussen PostgreSQL en MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kruisreplicatie tussen PostgreSQL en MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ik zal in grote lijnen vertellen over kruisreplicatie tussen PostgreSQL en MySQL, en ook over de methoden om kruisreplicatie tussen deze twee databaseservers in te stellen. Gewoonlijk worden databases in kruisreplicatie homogeen genoemd, hetgeen een handige methode is om van de ene relationele DBMS-server naar de andere over te stappen.<\/p>\n<p><\/p>\n<p>PostgreSQL en MySQL worden beschouwd als relationele databases, maar met extra extensies bieden ze NoSQL-mogelijkheden. Hier zullen we de replicatie tussen PostgreSQL en MySQL bespreken vanuit het perspectief van relationele DBMS.<\/p>\n<p><\/p>\n<p>We zullen niet de volledige interne werking beschrijven, alleen de basisprincipes, zodat u een idee krijgt van het instellen van replicatie tussen databaseservers, de voordelen, beperkingen en gebruiksscenario's.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Gewoonlijk wordt replicatie tussen twee identieke databaseservers uitgevoerd in binair modus of via aanvragen tussen de actieve node (deze fungeert als uitgever) en de passieve node (deze fungert als abonnee). Het doel van replicatie is om in realtime een kopie van de hoofd database beschikbaar te stellen op de passieve zijde. In dit geval worden gegevens van de actieve naar de passieve node verzonden, omdat replicatie slechts in \u00e9\u00e9n richting plaatsvindt. Het is echter mogelijk om replicatie tussen twee databases in beide richtingen in te stellen, zodat gegevens van de passieve naar de actieve node worden verzonden in een \u201cactief-actief\u201d configuratie. Dit alles, inclusief cascade-replicatie, is mogelijk tussen twee of meer identieke databaseservers. De configuratie \u201cactief-actief\u201d of \u201cactief-passief\u201d hangt af van de behoeften, de beschikbaarheid van dergelijke mogelijkheden in de oorspronkelijke configuratie of het gebruik van externe oplossingen voor de instelling en de bestaande compromissen.<\/p>\n<p><\/p>\n<p>De beschreven configuratie is mogelijk tussen verschillende databaseservers. Een server kan worden ingesteld om gerepliceerde gegevens van een andere databaseserver te ontvangen en tegelijkertijd snapshots van de gerepliceerde gegevens in realtime te behouden. MySQL en PostgreSQL bieden de meeste van deze configuraties zelf of met behulp van externe extensies, inclusief methoden zoals binaire logbestanden, schijfvergrendeling en operator- en rijgebaseerde methoden.<\/p>\n<p><\/p>\n<p>Cross-replicatie tussen MySQL en PostgreSQL is nodig voor een eenmalige migratie van de ene database server naar de andere. Deze databases gebruiken verschillende protocollen, dus je kunt ze niet rechtstreeks aan elkaar koppelen. Om data-uitwisseling mogelijk te maken, kan een externe open-source tool worden gebruikt, zoals pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Wat is pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon is een replicatiesysteem van MySQL naar PostgreSQL geschreven in Python 3. Het maakt gebruik van de open-source bibliotheek mysql-replication, ook in Python. Rij-afbeeldingen worden ge\u00ebxtraheerd uit MySQL-tabellen en opgeslagen als JSONB-objecten in de PostgreSQL-database, en worden vervolgens gedecodeerd met de pl\/pgsql-functie en weergeven in de PostgreSQL-database.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Capaciteiten van pg_chameleon<\/h3>\n<p><\/p>\n<p>Meerdere MySQL-schema's uit \u00e9\u00e9n cluster kunnen worden gerepliceerd naar \u00e9\u00e9n doel PostgreSQL-database met een 'een naar veel'-configuratie.<br \/>\nDe namen van de bron- en doelschema's mogen niet gelijk zijn.<br \/>\nReplicatiegegevens kunnen worden ge\u00ebxtraheerd uit een cascade-replicatie van MySQL.<br \/>\nTabellen die niet gerepliceerd kunnen worden of fouten veroorzaken, worden uitgesloten.<br \/>\nElke replicatiefunctie wordt beheerd door demons.<br \/>\nControle via parameters en configuratiebestanden op basis van YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Voorbeeld<\/h3>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versie van het besturingssysteem<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Versie van de database server<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Databasepoort<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>IP-adres<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Bereid eerst alle benodigde componenten voor om pg_chameleon te installeren. In dit voorbeeld is Python 3.6.8 ge\u00efnstalleerd, dat een virtuele omgeving cre\u00ebert en activeert.<\/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>Na een succesvolle installatie van Python 3.6 moeten de overige vereisten worden uitgevoerd, zoals het cre\u00ebren en activeren van een virtuele omgeving. Daarnaast wordt de pip-module bijgewerkt naar de laatste versie en gebruikt voor de installatie van pg_chameleon. In de onderstaande opdrachten wordt opzettelijk pg_chameleon 2.0.9 ge\u00efnstalleerd, hoewel de laatste versie 2.0.10 is. Dit is nodig om nieuwe bugs in de bijgewerkte versie te vermijden.<\/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>Vervolgens roepen we pg_chameleon aan (chameleon is de opdracht) met het argument set_configuration_files om pg_chameleon in te schakelen en de standaardconfiguratiebestanden en -mappen te cre\u00ebren.<\/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\/\ncopi\u00ebn van de configuratievoorbeeld in \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Nu maken we een kopie van config-example.yml als default.yml, zodat het het standaard configuratiebestand wordt. Een voorbeeld van dit configuratiebestand wordt hieronder gegeven.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n# globale instellingen\npid_dir: '~\/.pg_chameleon\/pid\/'\nlog_dir: '~\/.pg_chameleon\/logs\/'\nlog_dest: bestand\nlog_level: info\nlog_days_keep: 10\nrollbar_key: ''\nrollbar_env: ''\n\n# type_override stelt de gebruiker in staat om de standaard typeconversie naar een ander type te overschrijven.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n# postgres bestemmingsverbinding\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 dag'\n    copy_max_memory: \"300M\"\n    copy_mode: 'bestand'\n    out_dir: \/tmp\n    sleep_loop: 1\n    on_error_replay: doorgaan\n    on_error_read: doorgaan\n    auto_maintenance: \"uit\"\n    gtid_enable: Nee\n    type: mysql\n    skip_events:\n      invoegen:\n        - delphis_mediterranea.foo # slaat invoegen over op de tabel delphis_mediterranea.foo\n      verwijderen:\n        - delphis_mediterranea # slaat verwijderen over op schema delphis_mediterranea\n      bijwerken:<\/code><\/pre>\n<p><\/p>\n<p>Het configuratiebestand in dit voorbeeld is een voorbeeldbestand van pg_chameleon met enkele kleine wijzigingen volgens de oorspronkelijke en doelomgevingen. Hieronder wordt een overzicht gegeven van de verschillende secties van het configuratiebestand.<\/p>\n<p><\/p>\n<p>In het configuratiebestand default.yml is er een sectie voor globale parameters (global settings), waar u instellingen zoals de locatie van het lock-bestand, de locatie van logs, de logbewaarperiode enzovoort kunt beheren. Vervolgens is er een sectie voor type-overrides (type override), waar een set regels is voor het overschrijven van types tijdens replicatie. In het standaardvoorbeeld wordt de type-overrule gebruikt die tinyint(1) omzet in een booleanwaarde. In de volgende sectie geven we de verbindingsdetails op voor de doeldatabase. In ons geval is dit een PostgreSQL-database, aangeduid als pg_conn. In de laatste sectie geven we de gegevens van de bron op, dat wil zeggen de verbindingsparameters voor de brondatabase, de schema-mapping van de brondatabase naar de doeldatabase, de tabellen die overgeslagen moeten worden, timeouts, geheugen, en de batchgrootte. Merk op dat \"sources\" in het meervoud is, wat betekent dat we meerdere brondatabases voor \u00e9\u00e9n doel kunnen toevoegen om de configuratie \"veel-tot-een\" in te stellen.<\/p>\n<p><\/p>\n<p>De world_x-database in het voorbeeld bevat 4 tabellen met rijen die de MySQL-gemeenschap ter illustratie aanbiedt. Deze kan worden gedownload <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">hier<\/a><\/noindex>. De voorbeelddatabase wordt geleverd in de vorm van een tar- en gecomprimeerd archief met instructies voor het aanmaken en importeren van de rijen.<\/p>\n<p><\/p>\n<p>In MySQL- en PostgreSQL-databases wordt een speciale gebruiker met de naam usr_replica aangemaakt. In MySQL krijgt deze extra rechten om alle gerepliceerde tabellen te lezen.<\/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>Aan de PostgreSQL-zijde wordt er een database db_replica aangemaakt, die wijzigingen uit de MySQL-database zal ontvangen. De gebruiker usr_replica in PostgreSQL wordt automatisch ingesteld als eigenaar van de twee schema's pgworld_x en sch_chameleon, die respectievelijk de werkelijke gerepliceerde tabellen en de replicatiecatalogustabellen bevatten. De automatische configuratie wordt geregeld door het argument create_replica_schema, zoals je hieronder zult zien.<\/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>De MySQL-database wordt ingesteld met wijzigingen aan enkele parameters om deze voor replicatie voor te bereiden, zoals hieronder weergegeven. Het zal nodig zijn om de databaseserver opnieuw op te starten om de wijzigingen door te voeren.<\/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>Het is nu belangrijk om de verbinding met beide databaseservers te controleren, zodat er geen problemen optreden bij het uitvoeren van pg_chameleon-commando's.<\/p>\n<p><\/p>\n<p>Op de PostgreSQL-node:<\/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>Op de MySQL-node:<\/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>De volgende drie pg_chameleon (chameleon) commando's bereiden de omgeving voor, voegen de bron toe en initialiseren de replicatie. Het argument create_replica_schema in pg_chameleon cre\u00ebert het standaardschema (sch_chameleon) en het replicatieschema (pgworld_x) in de PostgreSQL-database, zoals we al zeiden. Het argument add_source voegt de oorspronkelijke database toe aan de configuratie door het configuratiebestand (default.yml) te lezen, in ons geval is dat mysql, en init_replica initialiseert de configuratie op basis van de parameters in het configuratiebestand.<\/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>De uitvoer van deze drie commando's geeft duidelijk aan dat ze succesvol zijn uitgevoerd. Alle fouten of syntactische problemen worden aangegeven in eenvoudige en begrijpelijke berichten met suggesties voor het oplossen van problemen.<\/p>\n<p><\/p>\n<p>Laten we eindelijk de replicatie starten met behulp van start_replica en een bericht over een succesvolle uitvoering ontvangen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: De replica-proces voor de source mysql wordt gestart.<\/code><\/pre>\n<p><\/p>\n<p>De status van de replicatie kan worden opgevraagd met het argument show_status, terwijl fouten kunnen worden bekeken met het argument show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Resultaat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Zoals we al zeiden, worden elke replicatiefunctie beheerd door demonprocessen. Om ze te bekijken, vragen we de proceslijst op met het Linux-commando ps, zoals hieronder weergegeven.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Resultaat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replicatie wordt niet als ingesteld beschouwd totdat we deze in realtime testen, zoals hieronder weergegeven. We maken een tabel, voegen een paar records toe aan de MySQL-database en roepen het argument sync_tables in pg_chameleon aan om de demonen bij te werken en de tabel met records in de PostgreSQL-database te repliceren.<\/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\nSync tables proces voor de source mysql gestart.<\/code><\/pre>\n<p><\/p>\n<p>Om de testresultaten te bevestigen, vragen we de tabel op uit de PostgreSQL-database en geven we de rijen weer.<\/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>Als we migreren, vormen de volgende pg_chameleon commando's de afronding. De commando's moeten worden uitgevoerd nadat we hebben bevestigd dat de rijen van alle doel-tabellen zijn gerepliceerd, met als resultaat een netjes overgedragen PostgreSQL-database zonder verwijzingen naar de oorspronkelijke database of replicatieschema (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>Optioneel kunnen de volgende commando's de oorspronkelijke configuratie en het replicatieschema verwijderen.<\/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\">Voordelen van pg_chameleon<\/h3>\n<p><\/p>\n<p>Eenvoudige installatie en configuratie.<br \/>\nGebruiksvriendelijke foutopsporing en anomaliedetectie met begrijpelijke foutmeldingen.<br \/>\nEr kunnen extra speciale tabellen aan de replicatie worden toegevoegd na de initiatie, zonder de rest van de configuratie te veranderen.<br \/>\nU kunt meerdere brondatabases voor \u00e9\u00e9n doeldatabase instellen, wat zeer handig is wanneer u gegevens uit een of meerdere MySQL-databases naar \u00e9\u00e9n PostgreSQL-database samenvoegt.<br \/>\nGeselecteerde tabellen hoeven niet te worden gerepliceerd.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Nadelen van pg_chameleon<\/h3>\n<p><\/p>\n<p>Wordt alleen ondersteund met MySQL 5.5 en hoger als bron en PostgreSQL 9.5 en hoger als doel database.<br \/>\nElke tabel moet een primaire of unieke sleutel hebben, anders worden de tabellen ge\u00efnitialiseerd tijdens het init_replica-proces, maar worden ze niet gerepliceerd.<br \/>\nEensluidende replicatie \u2014 alleen van MySQL naar PostgreSQL. Het is dus alleen geschikt voor een \u2018actief-passief\u2019 schema.<br \/>\nHet kan alleen een MySQL-database als bron zijn, en de ondersteuning voor PostgreSQL als bron is alleen experimenteel en met beperkingen (lees meer <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">hier<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Samenvattingen van pg_chameleon<\/h3>\n<p><\/p>\n<p>De replicatiemethode in pg_chameleon is uitstekend voor de migratie van een database van MySQL naar PostgreSQL. Een belangrijke nadeel is dat de replicatie alleen eenzijdig is, waardoor database-experts het waarschijnlijk niet willen gebruiken voor iets anders dan migratie. Maar het probleem van eenzijdige replicatie kan worden opgelost met een ander open-source hulpmiddel \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>Lees meer in de offici\u00eble documentatie <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">hier<\/a><\/noindex>. De hulpprogramma's voor de opdrachtregel zijn te vinden <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">hier<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Overzicht van SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS is een open-source tool die elke database naar elke andere gangbare database repliceert: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird en andere cloud database-instanties, zoals Redshift, Azure, enz. Beschikbare functies: database- en bestandssynchronisatie, replicatie van meerdere leidende databases, gefilterde synchronisatie, transformatie en meer. Het is een Java-tool en vereist een standaardversie van JRE of JDK (versie 8.0 of hoger). Hier kunnen gegevenswijzigingen via triggers in de brondatabase worden vastgelegd en naar de overeenkomstige doeldatabase in de vorm van batches worden gestuurd.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Functionaliteiten van SymmetricDS<\/h3>\n<p><\/p>\n<p>De tool is platformonafhankelijk, wat betekent dat twee of meer verschillende databases gegevens kunnen uitwisselen.<br \/>\nRelationele databases worden gesynchroniseerd door middel van het vastleggen van gegevenswijzigingen, terwijl bestandsgebaseerde databases gebruikmaken van bestandsynchronisatie.<br \/>\nTweedirectionele replicatie met behulp van Push- en Pull-methoden op basis van een set regels.<br \/>\nGegevensoverdracht is mogelijk via beveiligde netwerken en netwerken met een lage bandbreedte.<br \/>\nAutomatisch herstel bij het hervatten van de werking van nodes na een storing en automatische conflictresolutie.<br \/>\nCompatibiliteit met de cloud en effici\u00ebnte API-extensies.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Voorbeeld<\/h3>\n<p><\/p>\n<p>SymmetricDS kan worden geconfigureerd in een van de twee opties:<br \/>\nEen hoofd (ouder) node die centraal de gegevensreplicatie co\u00f6rdineert tussen twee ondergeschikte (kind) nodes, en de gegevensuitwisseling tussen de kind nodes vindt uitsluitend plaats via de ouder.<br \/>\nEen actieve node (node 1) kan gegevens voor replicatie uitwisselen met een andere actieve node (node 2) zonder tussenpersoon.<\/p>\n<p><\/p>\n<p>In beide opties vindt de gegevensuitwisseling plaats via Push en Pull. In dit voorbeeld bekijken we de 'actieve-actieve' configuratie. Het is te lang om de gehele architectuur te beschrijven, dus bestudeer <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">handboek<\/a><\/noindex>, om meer te leren over de werking van SymmetricDS.<\/p>\n<p><\/p>\n<p>Het installeren van SymmetricDS is heel eenvoudig: download de open-source versie van het zip-bestand <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">hier<\/a><\/noindex> en pak deze uit waar je maar wilt. In de onderstaande tabel vind je informatie over de installatieplaats en versie van SymmetricDS in dit voorbeeld, evenals versies van databases, versies van Linux, IP-adressen en poorten voor beide nodes.<\/p>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versie van het besturingssysteem<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Versie van de database server<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Databasepoort<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>IP-adres<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Versie van SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Installatiepad van SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Naam van de SymmetricDS node<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Hier installeren we SymmetricDS in \/usr\/local\/symmetric-server-3.9.20, en hier zullen verschillende geneste mappen en bestanden worden opgeslagen. We zijn ge\u00efnteresseerd in de geneste mappen samples en engines. In de map samples bevinden zich voorbeeldconfiguratiebestanden met node-eigenschappen, evenals voorbeeld SQL-scripts voor een snelle start bij de demonstratie.<\/p>\n<p><\/p>\n<p>In de map samples zien we drie configuratiebestanden met node-eigenschappen - de naam geeft het karakter van de node in een bepaalde schema aan.<\/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 heeft alle benodigde configuratiebestanden voor een basis schema van 3 nodes (optie 1), en dezelfde bestanden kunnen worden gebruikt voor een schema van 2 nodes (optie 2). We kopi\u00ebren het benodigde configuratiebestand van de map samples naar engines op host vm1. Dit wordt als volgt:<\/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>Deze node in de SymmetricDS-configuratie wordt corp-000 genoemd, en de verbinding met de database wordt beheerd door de mysql jdbc-driver, die de hierboven genoemde verbindingsstring en inloggegevens gebruikt. We verbinden met de database replica_db, en tijdens het aanmaken van het schema worden de tabellen aangemaakt. sync.url toont de verbinding met de node voor synchronisatie.<\/p>\n<p><\/p>\n<p>Node 2 op host vm2 wordt ingesteld als store-001, en de rest is gespecificeerd in het node.properties-bestand, dat hieronder wordt weergegeven. Node store-001 draait op een PostgreSQL-database, en pgdb_replica is de database voor replicatie. registration.url stelt host vm2 in staat om verbinding te maken met host vm1 en de configuratiedetails te ontvangen.<\/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>Het voorbeeld van SymmetricDS bevat parameters voor het instellen van bidirectionele replicatie tussen twee databaseservers (twee nodes). De onderstaande stappen worden uitgevoerd op host vm1 (corp-000), die een voorbeeldschema met 4 tabellen aanmaakt. Vervolgens cre\u00ebert het uitvoeren van create-sym-tables met het commando symadmin de catalogustabellen, waar de regels en richting van replicatie tussen nodes worden opgeslagen. Ten slotte worden voorbeeldgegevens in de tabellen geladen.<\/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>In het voorbeeld zijn de tabellen item en item_selling_price automatisch ingesteld voor replicatie van corp-000 naar store-001, terwijl de tabellen sale (sale_transaction en sale_return_line_item) automatisch zijn ingesteld voor replicatie van store-001 naar corp-000. Laten we nu een schema aanmaken in de PostgreSQL-database op host vm2 (store-001) om deze voor te bereiden op de ontvangst van gegevens van 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>Zorg ervoor dat er in de MySQL-database op vm1 voorbeeldtabellen en de catalogustabellen van SymmetricDS aanwezig zijn. Merk op dat de systeemtabel van SymmetricDS (met het prefix sym_) momenteel alleen beschikbaar is op node corp-000, omdat daar het commando create-sym-tables is uitgevoerd en wij de replicatie zullen beheren. Bovendien zullen er in de database op node store-001 slechts 4 voorbeeldtabellen zonder gegevens zijn.<\/p>\n<p><\/p>\n<p>Klaar. De omgeving is klaar om de serverprocessen van sym op beide nodes uit te voeren, zoals hieronder weergegeven.<\/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>Logboeken worden verzonden naar het achtergrondlogbestand (symmetric.log) in de logmap in de directory waar SymmetricDS is ge\u00efnstalleerd, en ook naar de standaard uitvoer. De sym-server kan nu worden gestart op de node 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>Wanneer het serverproces sym wordt uitgevoerd op de host vm2, worden de SymmetricDS-directorytabellen ook in de PostgreSQL-database aangemaakt. Als het serverproces sym op beide nodes wordt uitgevoerd, co\u00f6rdineren ze met elkaar om gegevens van corp-000 naar store-001 te repliceren. Na enkele seconden, als we alle 4 tabellen aan beide zijden opvragen, zien we dat de replicatie succesvol is uitgevoerd. Of we kunnen een initi\u00eble gegevenslading naar node store-001 vanaf corp-000 verzenden met het volgende commando.<\/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>Op dit punt wordt er een nieuwe record in de tabel item van de MySQL-database op node corp-000 (host: vm1) ingevoegd, en we kunnen de replicatie ervan in de PostgreSQL-database op node store-001 (host: vm2) controleren. We zien een Pull-operatie om gegevens van corp-000 naar store-001 te verplaatsen.<\/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>Om de Push-operatie uit te voeren voor het verplaatsen van gegevens van store-001 naar corp-000, voegen we een record toe aan de tabel sale_transaction en controleren we of de replicatie is uitgevoerd.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Resultaat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>We zien een succesvolle configuratie van tweezijdige replicatie van de voorbeeldtabellen tussen de MySQL- en PostgreSQL-databases. Om replicatie voor nieuwe klanttabellen in te stellen, voeren we de volgende stappen uit. We cre\u00ebren tabel t1 voor het voorbeeld en stellen de replicatieregels als volgt in. Zo stellen we alleen de replicatie van corp-000 naar store-001 in.<\/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>Vervolgens ontvangt de configuratie een melding van de wijziging in het schema, dat wil zeggen de toevoeging van een nieuwe tabel, via het commando symadmin met het argument sync-triggers, dat de triggers opnieuw aanmaakt om de tabeldefinities te matchen. send-schema wordt uitgevoerd om de schemawijzigingen naar de node store-001 te verzenden, en de replicatie van tabel t1 is ingesteld.<\/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\">Voordelen van SymmetricDS<\/h3>\n<p><\/p>\n<p>Eenvoudige installatie en configuratie, inclusief een kant-en-klaar pakket met bestanden met parameters voor het cre\u00ebren van een schema met drie of twee nodes.<br \/>\nPlatformonafhankelijkheid van databases en onafhankelijkheid van platformen, inclusief servers, laptops en mobiele apparaten.<br \/>\nReplicatie van elke database naar een andere database, lokaal, in WAN of in de cloud.<br \/>\nMogelijkheid voor optimale werking met een paar databases of duizenden voor gebruiksvriendelijke replicatie.<br \/>\nBetaalde versie met grafische interface en uitstekende ondersteuning.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Nadelen van SymmetricDS<\/h3>\n<p><\/p>\n<p>Regels en richting van replicatie moeten handmatig in de opdrachtregel worden gedefinieerd via SQL-operators voor het laden van catalogustabellen, wat soms ongemakkelijk is.<br \/>\nHet kan vermoeiend zijn om veel tabellen voor replicatie in te stellen, tenzij er scripts worden gebruikt om SQL-operators te cre\u00ebren die de regels en richting van replicatie defini\u00ebren.<br \/>\nEr wordt te veel informatie in de logs geregistreerd, en soms moet je de logbestanden opruimen zodat ze niet te veel ruimte innemen.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Conclusies over SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS maakt het mogelijk om bidirectionele replicatie in te stellen tussen twee, drie en zelfs meerdere duizenden nodes om replicatie en bestandssynchronisatie uit te voeren. Het is een uniek instrument dat veel taken zelfstandig uitvoert, zoals het automatisch herstellen van gegevens na een lange periode van inactiviteit op een node, veilige en effici\u00ebnte gegevensuitwisseling tussen nodes via HTTPS, automatisch beheer van conflicten op basis van een set regels, enzovoort. SymmetricDS voert replicatie uit tussen elke databases, waardoor het voor verschillende scenario's kan worden gebruikt, inclusief migratie, upgrade, distributie, filtering en gegevensconversie op verschillende platforms.<\/p>\n<p><\/p>\n<p>Het voorbeeld is gemaakt op basis van de offici\u00eble <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">korte handleiding<\/a><\/noindex> voor SymmetricDS. In de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">gebruikershandleiding<\/a><\/noindex> verschillende concepten die verband houden met het configureren van replicatie met behulp van SymmetricDS, worden in detail beschreven.<\/p>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Kruisreplicatie tussen PostgreSQL en MySQL | ProHoster","description":"Ik zal in grote lijnen vertellen over.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}