{"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\/no\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Kryssreplikering mellom PostgreSQL og MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kryssreplikering mellom PostgreSQL og MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eg vil kort forklara kryssreplikasjon mellom PostgreSQL og MySQL, samt metodar for \u00e5 setja opp kryssreplikasjon mellom desse to databassservene. Vanlegvis vert databasar i kryssreplikasjon kalla homogene, og dette er ein praktisk metode for \u00e5 flytta fr\u00e5 ein relasjonsdb-server til ein annan.<\/p>\n<p><\/p>\n<p>Databasane PostgreSQL og MySQL vert ofte rekna som relasjonsdatabasar, men med tilleggselement kan dei tilby moglegheiter for NoSQL. Her vil vi diskutera replikasjon mellom PostgreSQL og MySQL fr\u00e5 perspektivet til relasjonsdatabasar.<\/p>\n<p><\/p>\n<p>Vi vil ikkje beskriva heile den indre funksjonen, berre dei grunnleggjande prinsippa slik at du f\u00e5r eit innblikk i oppsetjing av replikasjon mellom databasserver, fordelar, begrensningar og bruksfelt.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Vanlegvis vert replikasjonen mellom to identiske databasservarar utf\u00f8rt anten i bin\u00e6rmodus eller gjennom sp\u00f8rringar mellom det ledande noden (som ogs\u00e5 er utgjevar, hovud- eller aktiv) og det f\u00f8lgande (abonnent, ventande eller passiv). M\u00e5let med replikasjon er \u00e5 gi ein sanntidskopi av hovuddataserverdien p\u00e5 den f\u00f8lgjande sidan. Her vert data sendt fr\u00e5 det leie til det f\u00f8lgjande, det vil seie fr\u00e5 aktiv til passiv, fordi replikasjonen vert utf\u00f8rt berre i \u00e9in retning. Men det er mogleg \u00e5 setja opp replikasjon mellom to databasar i begge retningar, slik at data vert sendt fr\u00e5 det f\u00f8lgjande til det leie i ein \u00abaktiv-aktiv\u00bb konfigurasjon. Alt dette, inkludert kaskadereplikasjon, er mogleg mellom to eller fleire identiske databasservarar. Konfigurasjonen \u00abaktiv-aktiv\u00bb eller \u00abaktiv-passiv\u00bb avhenger av behov, tilgjengelegheit av slike moglegheiter i den opprinnelege konfigurasjonen, eller bruken av eksterne l\u00f8ysingar for oppsetjing og eksisterande kompromiss.<\/p>\n<p><\/p>\n<p>Den beskrevne konfigurasjonen er mogleg mellom forskjellige databasservarar. Ein server kan setjast opp for \u00e5 motta replikerte data fr\u00e5 ein annan databasserver og samtidig oppbevara bilete av replikerte data i sanntid. MySQL og PostgreSQL tilbyr dei fleste av desse konfigurasjonane sj\u00f8lv eller med hjelp av tredjepartsutvidingar, inkludert metodar for bin\u00e6rlogg, diskblokkeringsmetodar og metodar basert p\u00e5 operat\u00f8rar og strenger.<\/p>\n<p><\/p>\n<p>Kryssreplika er n\u00f8dvendig mellom MySQL og PostgreSQL for en engangs migrering fra en database-server til en annen. Disse databasene bruker forskjellige protokoller, s\u00e5 de kan ikke kobles direkte. For \u00e5 etablere datadeling kan man bruke et eksternt open source-verkt\u00f8y, som pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Hva er pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon er et replikeringssystem fra MySQL til PostgreSQL basert p\u00e5 Python 3. Det benytter et open source-bibliotek, mysql-replication, ogs\u00e5 skrevet i Python. Rader ekstraheres fra MySQL-tabeller og lagres som JSONB-objekter i PostgreSQL-databasen, f\u00f8r de dekodes med pl\/pgsql-funksjoner og gjengis i PostgreSQL-databasen.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Muligheter med pg_chameleon<\/h3>\n<p><\/p>\n<p>Flere MySQL-skjemaer fra \u00e9n klynge kan replikeres til \u00e9n m\u00e5l-PostgreSQL-database med en \u00ab\u00e9n-til-mange\u00bb konfigurasjon.<br \/>\nNavnene p\u00e5 kilde- og m\u00e5lskjema kan ikke v\u00e6re identiske.<br \/>\nReplikasjonsdata kan hentes fra en kaskadereplika av MySQL.<br \/>\nTabeller som ikke kan replikeres eller gir feil, ekskluderes.<br \/>\nHver replikasjonsfunksjon styres av demoner.<br \/>\nKontroll via parametere og konfigurasjonsfiler i YAML-format.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Eksempel<\/h3>\n<p><\/p>\n<p>V\u00e6rt<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS-versjon<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>DB-serverversjon<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>DB-port<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>IP-adresse<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>For \u00e5 komme i gang, forbered alle n\u00f8dvendige komponenter for \u00e5 installere pg_chameleon. I dette eksemplet er Python 3.6.8 installert, som oppretter et virtuelt milj\u00f8 og aktiverer det.<\/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>Etter vellykket installasjon av Python 3.6, m\u00e5 man oppfylle de \u00f8vrige kravene, som \u00e5 opprette og aktivere et virtuelt milj\u00f8. I tillegg oppdateres pip-modulen til den nyeste versjonen og brukes til \u00e5 installere pg_chameleon. I kommandoene nedenfor installeres bevisst pg_chameleon versjon 2.0.9, selv om den siste versjonen er 2.0.10. Dette gj\u00f8res for \u00e5 unng\u00e5 nye feil i den oppdaterte versjonen.<\/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>Deretter kaller vi pg_chameleon (chameleon er kommandoen) med argumentet set_configuration_files for \u00e5 aktivere pg_chameleon og opprette kataloger og standard konfigurasjonsfiler.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\noppretter katalog \/root\/.pg_chameleon\noppretter katalog \/root\/.pg_chameleon\/configuration\/\noppretter katalog \/root\/.pg_chameleon\/logs\/\noppretter katalog \/root\/.pg_chameleon\/pid\/\nkopierer konfigurasjonseksempelet til \/root\/.pg_chameleon\/configuration\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Vi oppretter n\u00e5 en kopi av config-example.yml som default.yml, slik at det blir konfigurasjonsfilen som brukes som standard. Et eksempel p\u00e5 konfigurasjonsfil for dette eksemplet er vist nedenfor.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n# globale innstillinger\npid_dir: '~\/.pg_chameleon\/pid\/'\nlog_dir: '~\/.pg_chameleon\/logs\/'\nlog_dest: fil\nlog_level: info\nlog_days_keep: 10\nrollbar_key: ''\nrollbar_env: ''\n\n# type_override lar brukeren overstyre standard typekonvertering til en annen.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n# postgres m\u00e5ltilkobling\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 #hopper innsetting p\u00e5 tabellen delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #hopper sletting p\u00e5 skjemaet delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Konfigurasjonsfilen i dette eksemplet er en mal for pg_chameleon med sm\u00e5 endringer i henhold til kilde- og m\u00e5lmilj\u00f8ene, og en oversikt over de ulike seksjonene i konfigurasjonsfilen er vist nedenfor.<\/p>\n<p><\/p>\n<p>I konfigurasjonsfilen default.yml er det en seksjon for globale innstillinger (global settings), hvor du kan administrere innstillinger som plasseringen av l\u00e5sefilen, loggplasseringen, loggoppbevaringsperioden osv. Deretter f\u00f8lger seksjonen for typeoverstyring (type override), hvor det angis et sett med regler for \u00e5 overstyre typer under replikering. I standardeksempelet brukes en typeoverstyringsregel som konverterer tinyint(1) til boolsk verdi. I neste seksjon angir vi tilkoblingsdetaljene for m\u00e5l-databasen. I v\u00e5rt tilfelle er dette PostgreSQL-databasen, betegnet som pg_conn. I den siste seksjonen gir vi innstillingsdataene for kildene, dvs. tilkoblingsparametrene for kilde-databasen, skjemaoppsett for kilde- og m\u00e5l-databasene, tabeller som skal hoppes over, ventetid, minne, og pakkest\u00f8rrelse. Merk at \"sources\" er angitt i flertall, noe som betyr at vi kan legge til flere kilde-databaser for en enkelt m\u00e5l-database for \u00e5 konfigurere et \"mange-til-en\" oppsett.<\/p>\n<p><\/p>\n<p>Verdatabase world_x i eksempelet inneheld 4 tabeller med rader som MySQL-samfunnet tilbyr som eksempel. Den kan lastes ned. <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">her<\/a><\/noindex>. Eksempelverdadata kommer som en tar og komprimert arkiv med instruksjoner for \u00e5 opprette og importere rader.<\/p>\n<p><\/p>\n<p>I MySQL- og PostgreSQL-databaser opprettes en spesialbruker med samme navn usr_replica. I MySQL f\u00e5r denne brukeren ekstra rettigheter til \u00e5 lese alle replikerte tabeller.<\/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>P\u00e5 PostgreSQL-siden opprettes en database db_replica, som skal motta endringer fra MySQL-databasen. Brukeren usr_replica i PostgreSQL konfigureres automatisk som eier av de to skjemaene pgworld_x og sch_chameleon, som inneholder henholdsvis de faktiske replikerte tabellene og tabellene med replikeringskataloger. Den automatiske konfigurasjonen styres av argumentet create_replica_schema, som du vil se nedenfor.<\/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>MySQL-databasen konfigureres med endringer av noen parametere for \u00e5 forberede den for replikering, som vist nedenfor. Du m\u00e5 starte databaseserveren p\u00e5 nytt for at endringene skal tre i kraft.<\/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>Det er n\u00e5 viktig \u00e5 sjekke tilkoblingen til begge databaser, slik at det ikke oppst\u00e5r problemer n\u00e5r pg_chameleon-kommandoene kj\u00f8res.<\/p>\n<p><\/p>\n<p>P\u00e5 PostgreSQL-noden:<\/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>P\u00e5 MySQL-noden:<\/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 f\u00f8lgende tre pg_chameleon (chameleon) kommandoene forbereder milj\u00f8et, legger til kilden og initierer replikasjonen. Argumentet create_replica_schema i pg_chameleon lager standard skjema (sch_chameleon) og replikaschema (pgworld_x) i PostgreSQL-databasen, som vi allerede har nevnt. Argumentet add_source legger til kilde-databasen i konfigurasjonen, leser konfigurasjonsfilen (default.yml), og i v\u00e5rt tilfelle er dette mysql, mens init_replica initialiserer konfigurasjonen basert p\u00e5 parametrene i konfigurasjonsfilen.<\/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>Utslippingene fra disse tre kommandoene indikerer tydelig deres vellykkede gjennomf\u00f8ring. Eventuelle feil eller syntaksfeil vises med klare og forst\u00e5elige meldinger som gir tips til hvordan man kan l\u00f8se problemene.<\/p>\n<p><\/p>\n<p>Til slutt, la oss starte replikeringen med start_replica og motta en melding om vellykket gjennomf\u00f8ring.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: Starter replikasjonsprosessen for kilde mysql<\/code><\/pre>\n<p><\/p>\n<p>Status p\u00e5 replikasjonen kan foresp\u00f8rres med argumentet show_status, mens feil kan vises ved hjelp av argumentet show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Resultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Som nevnt tidligere, administreres hver replikasjonsfunksjon av demoner. For \u00e5 se dem, kan vi foresp\u00f8rre prosesslisten med kommandoen Linux ps, som vist nedenfor.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Resultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replikasjon anses ikke som konfigurert f\u00f8r vi tester den i sanntid, som vist nedenfor. Vi oppretter en tabell, setter inn et par poster i MySQL-databasen og kaller argumentet sync_tables i pg_chameleon for \u00e5 oppdatere demonene og replikere tabellen med postene til PostgreSQL-databasen.<\/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\nSynkroniserer tabeller prosess for kilde mysql startet.<\/code><\/pre>\n<p><\/p>\n<p>For \u00e5 bekrefte testresultatene, foresp\u00f8r vi tabellen fra PostgreSQL-databasen og viser radene.<\/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>Hvis vi utf\u00f8rer migrasjon, vil de f\u00f8lgende kommandoene fra pg_chameleon avslutte den. Kommandoene m\u00e5 utf\u00f8res etter at vi har bekreftet at radene fra alle m\u00e5ltabeller er blitt replikert, og resultatet vil v\u00e6re en pent overf\u00f8rt PostgreSQL-database uten referanser til den opprinnelige databasen eller replikasjonsoppsettet (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>Ved \u00f8nske kan de f\u00f8lgende kommandoene brukes til \u00e5 slette den opprinnelige konfigurasjonen og replikasjonsoppsettet.<\/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\">Fordeler med pg_chameleon<\/h3>\n<p><\/p>\n<p>Enkel innstilling og konfigurasjon.<br \/>\nBrukervennlig feils\u00f8king og identifisering av anomalier med forst\u00e5elige feilmeldinger.<br \/>\nDet er mulig \u00e5 legge til flere spesielle tabeller til replikasjonen etter initiering, uten \u00e5 endre den \u00f8vrige konfigurasjonen.<br \/>\nDu kan konfigurere flere kilder for \u00e9n m\u00e5lbase, noe som er veldig praktisk n\u00e5r du samler data fra \u00e9n eller flere MySQL-databaser i \u00e9n PostgreSQL-database.<br \/>\nValgte tabeller trenger ikke \u00e5 replikeres.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Ulemper med pg_chameleon<\/h3>\n<p><\/p>\n<p>St\u00f8ttes kun med MySQL 5.5 og h\u00f8yere som kilde og PostgreSQL 9.5 og h\u00f8yere som m\u00e5l database.<br \/>\nHver tabell m\u00e5 ha en prim\u00e6rn\u00f8kkel eller unik n\u00f8kkel, ellers initialiseres tabellene i init_replica-prosessen, men replikeres ikke.<br \/>\nEnveisreplikering \u2014 bare fra MySQL til PostgreSQL. Derfor passer det bare for en \u00abaktiv-passiv\u00bb-ordning.<br \/>\nKilden kan bare v\u00e6re en MySQL-database, og st\u00f8tte for PostgreSQL som kilde er bare eksperimentell og med begrensninger (finn ut mer <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">her<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Sammendrag av pg_chameleon<\/h3>\n<p><\/p>\n<p>Replikasjonsmetoden i pg_chameleon passer utmerket for migrering av databaser fra MySQL til PostgreSQL. En betydelig ulempe er at replikeringen er ensrettet, s\u00e5 databasespesialister vil trolig ikke \u00f8nske \u00e5 bruke den til noe annet enn migrering. Men problemet med enveisreplikering kan l\u00f8ses med et annet \u00e5pen kildekode-verkt\u00f8y \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>Les mer i den offisielle dokumentasjonen <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">her<\/a><\/noindex>. Kommandolinjehjelp kan finnes <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">her<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Oversikt over SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS er et \u00e5pen kildekode-verkt\u00f8y som replikerer enhver database til enhver annen vanlig database: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird og andre skybaserte DB-forekomster, som Redshift og Azure, osv. Tilgjengelige funksjoner: synkronisering av databaser og filer, replikering av flere ledende databaser, filtrert synkronisering, transformasjon og mer. Det er et Java-verkt\u00f8y, og det kreves en standardversjon av JRE eller JDK (versjon 8.0 eller h\u00f8yere). Her kan du registrere datamodifikasjoner ved hjelp av triggere i kildedatabasen og sende dem til den tilsvarende m\u00e5ldatabasen i form av pakker.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Funksjoner i SymmetricDS<\/h3>\n<p><\/p>\n<p>Verkt\u00f8yet er plattformuavhengig, noe som betyr at to eller flere forskjellige databaser kan utveksle data.<br \/>\nRelasjonsdatabaser synkroniseres ved \u00e5 registrere datamodifikasjoner, mens filbaserte databaser bruker filsynkronisering.<br \/>\nToveisreplikering ved bruk av Push- og Pull-metoder basert p\u00e5 et regelsett.<br \/>\nData transmission is possible over secure networks and networks with low bandwidth.<br \/>\nAutomatic recovery upon the resumption of node operations after a failure and automatic conflict resolution.<br \/>\nCompatibility with the cloud and efficient API extensions.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Eksempel<\/h3>\n<p><\/p>\n<p>SymmetricDS can be configured in one of two ways:<br \/>\nA primary node that centrally coordinates data replication between two secondary nodes, and data exchange between secondary nodes occurs only through the primary.<br \/>\nAn active node (node 1) can exchange data for replication with another active node (node 2) without a mediator.<\/p>\n<p><\/p>\n<p>In both configurations, data exchange occurs via Push and Pull. In this example, we will consider the 'active-active' configuration. Describing the entire architecture takes too long, so please review <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">veiledningen<\/a><\/noindex>, to learn more about the SymmetricDS device.<\/p>\n<p><\/p>\n<p>Installing SymmetricDS is very simple: download the open-source version zip file <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">herfr\u00e5<\/a><\/noindex> and extract it wherever you like. The table below provides information on the installation location and version of SymmetricDS in this example, as well as database versions, Linux versions, IP addresses, and ports for both nodes.<\/p>\n<p><\/p>\n<p>V\u00e6rt<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS-versjon<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>DB-serverversjon<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>DB-port<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>IP-adresse<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>SymmetricDS Version<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>SymmetricDS Installation Path<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>SymmetricDS Node Name<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Here we install SymmetricDS in \/usr\/local\/symmetric-server-3.9.20, and various nested directories and files will be stored here. We are interested in the nested directories samples and engines. The samples directory contains example configuration files with node properties as well as example SQL scripts for quickly starting the demonstration.<\/p>\n<p><\/p>\n<p>In the samples directory, we see three configuration files with node properties\u2014the name indicates the nature of the node in a specific schema.<\/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 has all the necessary configuration files for a basic 3-node schema (option 1), and the same files can be used for a 2-node schema (option 2). We copy the required configuration file from the samples directory to the engines on host vm1. It looks like this:<\/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>Denne noden i SymmetricDS-konfigurasjonen kalles corp-000, og tilkoblingen til databasen h\u00e5ndteres av mysql jdbc-driveren, som bruker tilkoblingsstrengen nevnt ovenfor og p\u00e5loggingslegitimasjonen. Vi kobler til databasen replica_db, og under opprettelsen av skjemaet vil tabeller bli opprettet. sync.url viser tilkoblingspunktet til noden for synkronisering.<\/p>\n<p><\/p>\n<p>Nod 2 p\u00e5 verten vm2 er konfigurert som store-001, og det resterende er angitt i node.properties-filen, som er inkludert nedenfor. Nod store-001 kj\u00f8rer PostgreSQL-databasen, og pgdb_replica er databasen for replikasjon. registration.url lar verten vm2 kontakte verten vm1 og f\u00e5 konfigurasjonsdetaljene derfra.<\/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>Et ferdig eksempel p\u00e5 SymmetricDS inneholder parametere for \u00e5 konfigurere toveiskommunikasjon mellom to databaseservere (to noder). Stegene nedenfor utf\u00f8res p\u00e5 verten vm1 (corp-000), som vil opprette et eksempel skjema med 4 tabeller. Deretter vil kj\u00f8ringen av create-sym-tables-kommandoen symadmin opprette katalogtabeller der regler og retningslinjer for replikasjon mellom nodene vil bli lagret. Til slutt lastes eksempeldata inn i tabellene.<\/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>I eksemplet er tabellene item og item_selling_price automatisk konfigurert for replikasjon fra corp-000 til store-001, mens tabellene sale (sale_transaction og sale_return_line_item) automatisk er konfigurert for replikasjon fra store-001 til corp-000. N\u00e5 oppretter vi skjemaet i PostgreSQL-databasen p\u00e5 verten vm2 (store-001) for \u00e5 forberede det p\u00e5 \u00e5 motta data fra 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>Det er avgj\u00f8rende \u00e5 sjekke at det finnes eksempler p\u00e5 tabeller og katalogtabeller for SymmetricDS i MySQL-databasen p\u00e5 vm1. Legg merke til at de systematiske tabellene for SymmetricDS (med prefikset sym_) n\u00e5 er tilgjengelige bare p\u00e5 noden corp-000, fordi vi der utf\u00f8rte kommandoen create-sym-tables og vil administrere replikasjonen. I databasen p\u00e5 noden store-001 vil det bare v\u00e6re 4 eksemplartabeller uten data.<\/p>\n<p><\/p>\n<p>Alt er klart. Milj\u00f8et er klart til \u00e5 kj\u00f8re sym serverprosesser p\u00e5 begge nodene, som vist nedenfor.<\/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>Loggfilene sendes til filen for bakgrunnslogger (symmetric.log) i logg-mappen i katalogen der SymmetricDS er installert, samt til standard utdata. Serveren sym kan n\u00e5 initieres p\u00e5 noden 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>Hvis serverprosessen sym kj\u00f8res p\u00e5 vertsdatamaskinen vm2, vil den ogs\u00e5 opprette SymmetricDS katalogtabeller i PostgreSQL-databasen. Hvis serverprosessen sym kj\u00f8res p\u00e5 begge nodene, vil de koordinere seg med hverandre for \u00e5 replikere data fra corp-000 til store-001. Hvis vi etter noen sekunder sp\u00f8r etter alle 4 tabeller p\u00e5 begge sider, vil vi se at replikasjonen er gjennomf\u00f8rt vellykket. Alternativt kan vi sende en initial opplasting til noden store-001 fra corp-000 med f\u00f8lgende kommando.<\/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>I dette trinnet settes en ny oppf\u00f8ring inn i item-tabellen i MySQL-databasen p\u00e5 noden corp-000 (vert: vm1), og vi kan sjekke replikasjonen til PostgreSQL-databasen p\u00e5 noden store-001 (vert: vm2). Vi ser en Pull-operasjon for \u00e5 flytte data fra corp-000 til 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>For \u00e5 utf\u00f8re Push-operasjonen for \u00e5 flytte data fra store-001 til corp-000 setter vi inn en oppf\u00f8ring i sale_transaction-tabellen og sjekker at replikasjonen er utf\u00f8rt.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Resultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vi ser en vellykket oppsett av toveis replikasjon av eksempel-tabeller mellom MySQL- og PostgreSQL-databaser. For \u00e5 sette opp replikasjon for nye brukertabeller, utf\u00f8rer vi f\u00f8lgende trinn. Vi oppretter tabellen t1 som eksempel og setter opp replikasjonsreglene p\u00e5 f\u00f8lgende m\u00e5te. Slik setter vi opp replikasjonen kun fra corp-000 til 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>Deretter f\u00e5r konfigurasjonen et varsel om endring av skjemaet, som er \u00e5 legge til en ny tabell, ved hjelp av kommandoen symadmin med argumentet sync-triggers, som gjenoppretter triggere for \u00e5 matche definisjonene av tabeller. send-schema kj\u00f8res for \u00e5 sende skjemaendringene til noden store-001, og replikeringen av tabellen t1 er konfigurert.<\/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\">Fordeler med SymmetricDS<\/h3>\n<p><\/p>\n<p>Enkel installasjon og konfigurasjon, inkludert et ferdig sett med filer med parametere for \u00e5 opprette skjema med tre eller to noder.<br \/>\nKryssplattformdatabaser og plattformuavhengighet, inkludert servere, b\u00e6rbare datamaskiner og mobile enheter.<br \/>\nReplikering av enhver database til enhver annen database lokalt, i WAN eller i skyen.<br \/>\nMulighet for optimal drift med et par databaser eller flere tusen for enkel replikering.<br \/>\nBetalingsversjon med grafisk grensesnitt og utmerket st\u00f8tte.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Ulemper med SymmetricDS<\/h3>\n<p><\/p>\n<p>Manuelt m\u00e5 man definere replikasjonsregler og retning gjennom SQL-operat\u00f8rer for \u00e5 laste katalogtabeller, noe som kan v\u00e6re upraktisk.<br \/>\n\u00c5 sette opp mange tabeller for replikering kan v\u00e6re slitsomt hvis man ikke bruker skript for \u00e5 opprette SQL-operat\u00f8rer som definerer replikasjonsreglene og retning.<br \/>\nLoggene inneholder for mye informasjon, og noen ganger m\u00e5 man rydde opp i loggfilen for \u00e5 unng\u00e5 at den tar for mye plass.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Oppsummering av SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS lar deg konfigurere toveisreplikering mellom to, tre og til og med flere tusen noder for \u00e5 utf\u00f8re replikering og synkronisere filer. Dette er et unikt verkt\u00f8y som selvstendig utf\u00f8rer mange oppgaver, for eksempel automatisk gjenoppretting av data etter lang tid med nedetid p\u00e5 en node, sikker og effektiv datautveksling mellom noder via HTTPS, automatisk konfliktstyring basert p\u00e5 et sett med regler, osv. SymmetricDS utf\u00f8rer replikering mellom hvilke som helst databaser, s\u00e5 det kan brukes til ulike scenarier, inkludert migrering, oppgradering til en ny versjon, distribusjon, filtrering og konvertering av data p\u00e5 forskjellige plattformer.<\/p>\n<p><\/p>\n<p>Eksempelet er basert p\u00e5 den offisielle <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">korte veiledningen<\/a><\/noindex> til SymmetricDS. I <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">brukermanualen<\/a><\/noindex> detaljert beskrivelse av forskjellige begreper knyttet til konfigurasjon av replikering med SymmetricDS.<\/p>\n<p>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Kryssreplikering mellom PostgreSQL og MySQL | ProHoster","description":"Jeg vil generelt fortelle om.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}