{"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\/sv\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Korsreplikation mellan PostgreSQL och MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Korsreplikation mellan PostgreSQL och MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag kommer att ge en \u00f6versikt \u00f6ver korsreplication mellan PostgreSQL och MySQL, samt metoder f\u00f6r att konfigurera korsreplication mellan dessa tv\u00e5 databasservrar. Vanligtvis kallas databaser i korsreplication homogena, och det \u00e4r en praktisk metod f\u00f6r att \u00f6verf\u00f6ra data fr\u00e5n en relationsdatabasserver till en annan.<\/p>\n<p><\/p>\n<p>PostgreSQL och MySQL betraktas vanligtvis som relationsdatabaser, men med ytterligare till\u00e4gg erbjuder de NoSQL-funktioner. H\u00e4r kommer vi att diskutera replication mellan PostgreSQL och MySQL utifr\u00e5n ett relationsdatabassyn.<\/p>\n<p><\/p>\n<p>Vi kommer inte att beskriva hela den interna strukturen, bara de grundl\u00e4ggande principerna, s\u00e5 att du f\u00e5r en uppfattning om hur man konfigurerar replication mellan databasservrar, deras f\u00f6rdelar, begr\u00e4nsningar och anv\u00e4ndningsscenarier.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Normalt utf\u00f6rs replication mellan tv\u00e5 identiska databasservrar antingen i bin\u00e4rt l\u00e4ge eller genom att skicka f\u00f6rfr\u00e5gningar mellan en prim\u00e4r nod (\u00e4ven kallad utgivare, huvud- eller aktiv nod) och en sekund\u00e4r nod (abonnent, passiv eller v\u00e4ntande). Syftet med replication \u00e4r att tillhandah\u00e5lla en realtidskopi av den prim\u00e4ra databasen p\u00e5 den sekund\u00e4ra sidan. Data \u00f6verf\u00f6rs fr\u00e5n den prim\u00e4ra till den sekund\u00e4ra, det vill s\u00e4ga fr\u00e5n aktiv till passiv, eftersom replication endast utf\u00f6rs i en riktning. Men det \u00e4r m\u00f6jligt att konfigurera replication mellan tv\u00e5 databaser i b\u00e5da riktningarna s\u00e5 att data \u00f6verf\u00f6rs fr\u00e5n den sekund\u00e4ra till den prim\u00e4ra i en \"aktiv-aktiv\" konfiguration. Allt detta, inklusive kaskadreplication, \u00e4r m\u00f6jligt mellan tv\u00e5 eller flera identiska databasservrar. Konfigurationen \"aktiv-aktiv\" eller \"aktiv-passiv\" beror p\u00e5 behovet, tillg\u00e4ngligheten av s\u00e5dana m\u00f6jligheter i den ursprungliga konfigurationen eller anv\u00e4ndning av externa l\u00f6sningar f\u00f6r inst\u00e4llning och befintliga kompromisser.<\/p>\n<p><\/p>\n<p>Den beskrivna konfigurationen \u00e4r m\u00f6jlig mellan olika databasservrar. En server kan konfigureras f\u00f6r att ta emot replikerade data fr\u00e5n en annan databasserver och samtidigt spara avbilder av de replikerade data i realtid. MySQL och PostgreSQL erbjuder de flesta av dessa konfigurationer antingen sj\u00e4lva eller genom tredjepartsers\u00e4ttning, inklusive metoder f\u00f6r bin\u00e4r loggning, diskblockering och metoder som baseras p\u00e5 operat\u00f6rer och rader.<\/p>\n<p><\/p>\n<p>Korsreplikering mellan MySQL och PostgreSQL beh\u00f6vs f\u00f6r en eng\u00e5ngsmigrering fr\u00e5n en databasserver till en annan. Dessa databaser anv\u00e4nder olika protokoll, s\u00e5 de kan inte kopplas direkt samman. F\u00f6r att m\u00f6jligg\u00f6ra datadelning kan man anv\u00e4nda ett externt open source-verktyg, som pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Vad \u00e4r pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon \u00e4r ett replikationssystem fr\u00e5n MySQL till PostgreSQL byggt p\u00e5 Python 3. Det anv\u00e4nder det open source-biblioteket mysql-replication, ocks\u00e5 skrivet i Python. Rader extraheras fr\u00e5n MySQL-tabeller och lagras som JSONB-objekt i PostgreSQL-databasen, och avkodas sedan med funktionen pl\/pgsql och \u00e5terges i PostgreSQL-databasen.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">M\u00f6jligheter med pg_chameleon<\/h3>\n<p><\/p>\n<p>Flera MySQL-scheman fr\u00e5n en kluster kan replikeras till en enda m\u00e5ldatabas i PostgreSQL med konfigurationen \"ett till m\u00e5nga\".<br \/>\nNamn p\u00e5 k\u00e4ll- och m\u00e5lscheman f\u00e5r inte vara desamma.<br \/>\nReplikationsdata kan extraheras fr\u00e5n en kaskadreplika av MySQL.<br \/>\nTabeller som inte kan replikeras eller som orsakar fel exkluderas.<br \/>\nVarje replikationsfunktion hanteras av demoner.<br \/>\n\u00d6vervakning med hj\u00e4lp av parametrar och konfigurationsfiler baserade p\u00e5 YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Exempel<\/h3>\n<p><\/p>\n<p>V\u00e4rd<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS-version<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>DB-serverversion<\/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-adress<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>B\u00f6rja med att f\u00f6rbereda alla n\u00f6dv\u00e4ndiga komponenter f\u00f6r att installera pg_chameleon. I detta exempel \u00e4r Python 3.6.8 installerat, vilket skapar en virtuell milj\u00f6 och aktiverar den.<\/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>Efter en framg\u00e5ngsrik installation av Python3.6 beh\u00f6ver man uppfylla \u00f6vriga krav, som att skapa och aktivera den virtuella milj\u00f6n. Dessutom uppdateras pip-modulen till den senaste versionen och anv\u00e4nds f\u00f6r att installera pg_chameleon. I kommandona nedan installerar vi avsiktligt pg_chameleon 2.0.9, \u00e4ven om den senaste versionen \u00e4r 2.0.10. Detta g\u00f6rs f\u00f6r att undvika nya buggar i den uppdaterade versionen.<\/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>Sedan anropar vi pg_chameleon (chameleon \u00e4r kommandot) med argumentet set_configuration_files f\u00f6r att aktivera pg_chameleon och skapa kataloger och konfigurationsfiler enligt standard.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\nskapar katalog \/root\/.pg_chameleon\nskapar katalog \/root\/.pg_chameleon\/configuration\/\nskapar katalog \/root\/.pg_chameleon\/logs\/\nskapar katalog \/root\/.pg_chameleon\/pid\/\nkopierar konfigurationsexempel till \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Nu skapar vi en kopia av config-example.yml som default.yml, s\u00e5 att den blir standardkonfigurationsfilen. Ett exempel p\u00e5 konfigurationsfil f\u00f6r detta exempel ges nedan.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#globala inst\u00e4llningar\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 till\u00e5ter anv\u00e4ndaren att \u00f6verskrida den standard typkonverteringen till en annan.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#postgres m\u00e5lanslutning\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 #skippa ins\u00e4ttningar p\u00e5 tabellen delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #skippa borttagningar i schemat delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Konfigurationsfilen i detta exempel \u00e4r ett exempel p\u00e5 en fil med pg_chameleon med sm\u00e5 \u00e4ndringar i enlighet med de ursprungliga och m\u00e5lmilj\u00f6erna, och nedan ges en \u00f6versikt \u00f6ver de olika avsnitten i konfigurationsfilen.<\/p>\n<p><\/p>\n<p>I konfigurationsfilen default.yml finns ett avsnitt f\u00f6r globala parametrar (global settings), d\u00e4r du kan hantera inst\u00e4llningar som l\u00e5sfilsplacering, loggar, loggf\u00f6rvaringsperiod och s\u00e5 vidare. Sedan f\u00f6ljer avsnittet f\u00f6r typ\u00f6verskrivning (type override), d\u00e4r ett antal regler f\u00f6r typ\u00f6verskrivning under replikering anges. I standardexemplet anv\u00e4nds en typ\u00f6verskrivningsregel som konverterar tinyint(1) till ett boolean-v\u00e4rde. I n\u00e4sta avsnitt anger vi uppgifterna f\u00f6r anslutning till m\u00e5ldatabasen. I v\u00e5rt fall handlar det om en PostgreSQL-databas som kallas pg_conn. I det sista avsnittet anger vi datak\u00e4llor, det vill s\u00e4ga parametrar f\u00f6r anslutning till ursprungsdatabasen, schema\u00f6vers\u00e4ttning mellan ursprungs- och m\u00e5ldatabas, tabeller som ska hoppas \u00f6ver, tidsgr\u00e4nser, minne, batchstorlek. Observera att \"sources\" anges i plural, vilket inneb\u00e4r att vi kan l\u00e4gga till flera k\u00e4lldatabaser f\u00f6r en m\u00e5l f\u00f6r att konfigurera en \"m\u00e5nga till en\"-inst\u00e4llning.<\/p>\n<p><\/p>\n<p>Databasen world_x i exemplet inneh\u00e5ller 4 tabeller med rader som MySQL-communityn erbjuder som exempel. Den kan laddas ner <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">h\u00e4r<\/a><\/noindex>. Exemplet p\u00e5 databasen levereras som en tar-fil och i en komprimerad arkiv med instruktioner f\u00f6r hur man skapar och importerar rader.<\/p>\n<p><\/p>\n<p>I MySQL- och PostgreSQL-databaser skapas en speciell anv\u00e4ndare med samma namn usr_replica. I MySQL tilldelas den ytterligare r\u00e4ttigheter att l\u00e4sa alla replikerade 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-sidan skapas en databas db_replica, som kommer att ta emot \u00e4ndringar fr\u00e5n MySQL-databasen. Anv\u00e4ndaren usr_replica i PostgreSQL konfigureras automatiskt som \u00e4gare till de tv\u00e5 scheman pgworld_x och sch_chameleon, som inneh\u00e5ller de faktiska replikerade tabellerna och tabellerna med replikeringskataloger respektive. Den automatiska konfigurationen styrs av argumentet create_replica_schema, som du kommer att se nedan.<\/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 konfigureras med \u00e4ndringar av vissa parametrar f\u00f6r att f\u00f6rbereda den f\u00f6r replikering, som visas nedan. Databasservern m\u00e5ste startas om f\u00f6r att \u00e4ndringarna ska tr\u00e4da 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 \u00e4r nu viktigt att kontrollera anslutningen till b\u00e5da databasserverna s\u00e5 att det inte uppst\u00e5r problem n\u00e4r kommandon k\u00f6rs med pg_chameleon.<\/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\u00f6ljande tre kommandona i pg_chameleon (chameleon) f\u00f6rbereder milj\u00f6n, l\u00e4gger till k\u00e4llan och initierar repliken. Argumentet create_replica_schema i pg_chameleon skapar standardenschema (sch_chameleon) och replikeringsschemat (pgworld_x) i PostgreSQL-databasen, som vi tidigare n\u00e4mnt. Argumentet add_source l\u00e4gger till den ursprungliga databasen i konfigurationen genom att l\u00e4sa konfigurationsfilen (default.yml), och i v\u00e5rt fall \u00e4r det mysql, och init_replica initierar konfigurationen baserat p\u00e5 parametrarna i konfigurationsfilen.<\/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>Resultaten fr\u00e5n de tre kommandona indikerar tydligt att de har genomf\u00f6rts framg\u00e5ngsrikt. Alla fel eller syntaxproblem rapporteras i enkla och f\u00f6rst\u00e5eliga meddelanden med f\u00f6rslag p\u00e5 hur man \u00e5tg\u00e4rdar problemen.<\/p>\n<p><\/p>\n<p>Slutligen ska vi starta replikeringen med hj\u00e4lp av start_replica och f\u00e5 ett meddelande om att den har genomf\u00f6rts framg\u00e5ngsrikt.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: Startar replikationsprocessen f\u00f6r k\u00e4llan mysql<\/code><\/pre>\n<p><\/p>\n<p>Replikationsstatus kan beg\u00e4ras med argumentet show_status, medan fel kan granskas med argumentet show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Result.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Som vi redan n\u00e4mnt styrs varje replikationsfunktion av demoner. F\u00f6r att visa dem kan vi beg\u00e4ra processens tabell med kommandot Linux ps, som visas nedan.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Result.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replikeringen anses inte vara konfigurerad f\u00f6rr\u00e4n vi testar den i realtid, som visas nedan. Vi skapar en tabell, infogar ett par poster i databasen MySQL och anropar argumentet sync_tables i pg_chameleon f\u00f6r att uppdatera demonerna och replikera tabellen med posterna till databasen PostgreSQL.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nFr\u00e5ga OK, 0 rader p\u00e5verkade (0.01 sek)\nmysql&gt; insert into t1 values (1,'one');\nFr\u00e5ga OK, 1 rad p\u00e5verkad (0.00 sek)\nmysql&gt; insert into t1 values (2,'two');\nFr\u00e5ga OK, 1 rad p\u00e5verkad (0.00 sek)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon sync_tables --tables world_x.t1 --config default --source mysql\nSynkronisering av tabeller process f\u00f6r k\u00e4llan mysql startad.<\/code><\/pre>\n<p><\/p>\n<p>F\u00f6r att bekr\u00e4fta testresultaten, beg\u00e4r vi tabellen fr\u00e5n PostgreSQL-databasen och skriver ut raderna.<\/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>Om vi utf\u00f6r migrering, kommer f\u00f6ljande kommandon pg_chameleon att avsluta den. Kommandona ska utf\u00f6ras efter att vi har verifierat att raderna i alla m\u00e5ltabeller har replikeras, och resultatet kommer att bli en noggrant \u00f6verf\u00f6rd PostgreSQL-databas utan h\u00e4nvisningar till den ursprungliga databasen eller replikeringens schema (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>Vid behov kan du med f\u00f6ljande kommandon ta bort den ursprungliga konfigurationen och replikationsschemat.<\/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\">F\u00f6rdelar med pg_chameleon<\/h3>\n<p><\/p>\n<p>Enkel installation och konfiguration.<br \/>\nL\u00e4tt att fels\u00f6ka och uppt\u00e4cka avvikelser med tydliga felmeddelanden.<br \/>\nDet g\u00e5r att l\u00e4gga till ytterligare specialtabeller till replikationen efter initiering, utan att \u00e4ndra den \u00f6vriga konfigurationen.<br \/>\nDu kan konfigurera flera k\u00e4lldatabaser f\u00f6r en m\u00e5l databas, vilket \u00e4r mycket bekv\u00e4mt om du samlar data fr\u00e5n en eller flera MySQL-databaser till en PostgreSQL-databas.<br \/>\nDet g\u00e5r att utesluta valda tabeller fr\u00e5n replikeringen.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Nackdelar med pg_chameleon<\/h3>\n<p><\/p>\n<p>St\u00f6der endast MySQL 5.5 och senare som k\u00e4lla och PostgreSQL 9.5 och senare som m\u00e5ldatabas.<br \/>\nVarje tabell m\u00e5ste ha en prim\u00e4r eller unik nyckel, annars initieras tabellerna under init_replica-processen men replikeras inte.<br \/>\nEnkelriktad replikering \u2014 endast fr\u00e5n MySQL till PostgreSQL. D\u00e4rf\u00f6r passar den endast f\u00f6r en \"aktiv-passiv\"-modell.<br \/>\nK\u00e4llan kan endast vara en MySQL-databas, och st\u00f6d f\u00f6r PostgreSQL som k\u00e4lla \u00e4r endast experimentellt och med begr\u00e4nsningar (l\u00e4s mer) <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">h\u00e4r<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Sammanfattning av pg_chameleon<\/h3>\n<p><\/p>\n<p>Replikationsmetoden i pg_chameleon \u00e4r utm\u00e4rkt f\u00f6r migrering av databasen fr\u00e5n MySQL till PostgreSQL. En betydande nackdel \u00e4r att replikeringen \u00e4r enkelriktad, vilket g\u00f6r att databasspecialister s\u00e4llan kommer att vilja anv\u00e4nda den f\u00f6r n\u00e5got annat \u00e4n migrering. Men problemet med enkelriktad replikering kan l\u00f6sas med ett annat open source-verktyg \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>L\u00e4s mer i den officiella dokumentationen <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">h\u00e4r<\/a><\/noindex>. Hj\u00e4lpen f\u00f6r kommandoraden finns tillg\u00e4nglig <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">h\u00e4r<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">\u00d6versikt av SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS \u00e4r ett open source-verktyg som replikera vilken databas som helst till vilken annan popul\u00e4r databas som helst: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird och andra molnbaserade databasinstanser, s\u00e5som Redshift, Azure etc. Tillg\u00e4ngliga funktioner: databas- och filsynkronisering, replikering av flera ledande databaser, filtrerad synkronisering, transformering och mer. Det \u00e4r ett verktyg i Java, och standardutg\u00e5van av JRE eller JDK (version 8.0 eller senare) kr\u00e4vs. H\u00e4r kan du registrera databas\u00e4ndringar via triggers i k\u00e4lldatabasen och skicka dem till motsvarande m\u00e5ldatabas i form av paket.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Funktioner i SymmetricDS<\/h3>\n<p><\/p>\n<p>Verktyget \u00e4r plattformsoberoende, vilket inneb\u00e4r att tv\u00e5 eller flera olika databaser kan utbyta data.<br \/>\nRelationsdatabaser synkroniseras genom databas\u00e4ndringsregistrering, medan filsystembaserade databaser anv\u00e4nder filsynkronisering.<br \/>\nDubbelriktad replikering med anv\u00e4ndning av Push- och Pull-metoder baserat p\u00e5 regler.<br \/>\nData\u00f6verf\u00f6ring \u00e4r m\u00f6jlig \u00f6ver skyddade n\u00e4tverk och n\u00e4tverk med l\u00e5g bandbredd.<br \/>\nAutomatisk \u00e5terst\u00e4llning vid \u00e5terstart av noder efter ett fel och automatisk konfliktl\u00f6sning.<br \/>\nKompatibilitet med molnet och effektiva API:er f\u00f6r till\u00e4gg.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Exempel<\/h3>\n<p><\/p>\n<p>SymmetricDS kan konfigureras p\u00e5 ett av tv\u00e5 s\u00e4tt:<br \/>\nEn ledande (parent) nod som centralt koordinerar datareplication mellan tv\u00e5 f\u00f6ljande (child) noder, och datautbyte mellan de f\u00f6ljande noderna sker endast genom den ledande noden.<br \/>\nDen aktiva noden (nod 1) kan utbyta data f\u00f6r replikering med en annan aktiv nod (nod 2) utan mellanhand.<\/p>\n<p><\/p>\n<p>I b\u00e5da konfigurationerna sker datautbyte med hj\u00e4lp av Push och Pull. I detta exempel kommer vi att titta p\u00e5 konfigurationen \"aktiv-aktiv\". Att beskriva hela arkitekturen tar f\u00f6r l\u00e5ng tid, s\u00e5 titta p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">en guide<\/a><\/noindex>, f\u00f6r att l\u00e4ra dig mer om SymmetricDS.<\/p>\n<p><\/p>\n<p>Att installera SymmetricDS \u00e4r mycket enkelt: ladda ner den \u00f6ppen k\u00e4llkodsversionen av zip-filen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">h\u00e4rifr\u00e5n<\/a><\/noindex> och extrahera den vart du vill. I tabellen nedan ger vi information om installationsst\u00e4lle och version av SymmetricDS i detta exempel, liksom databasversioner, Linux-versioner, IP-adresser och portar f\u00f6r b\u00e5da noder.<\/p>\n<p><\/p>\n<p>V\u00e4rd<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS-version<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>DB-serverversion<\/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-adress<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Version av SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Installationsv\u00e4g f\u00f6r SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Namn p\u00e5 SymmetricDS-nod<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>H\u00e4r installerar vi SymmetricDS i \/usr\/local\/symmetric-server-3.9.20, och olika underkataloger och filer kommer att lagras h\u00e4r. Vi \u00e4r intresserade av underkatalogerna samples och engines. I katalogen samples lagras exempelkonfigurationsfiler med nodens egenskaper samt exempel p\u00e5 SQL-skript f\u00f6r en snabb start av demonstrationer.<\/p>\n<p><\/p>\n<p>I katalogen samples ser vi tre konfigurationsfiler med nodens egenskaper \u2014 namnen visar nodens karakt\u00e4r i en viss schem.<\/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 levererar alla n\u00f6dv\u00e4ndiga konfigurationsfiler f\u00f6r ett grundschema med 3 noder (alternativ 1), och samma filer kan anv\u00e4ndas f\u00f6r ett schema med 2 noder (alternativ 2). Kopiera den n\u00f6dv\u00e4ndiga konfigurationsfilen fr\u00e5n katalogen samples till engines p\u00e5 v\u00e4rden vm1. Det blir s\u00e5 h\u00e4r:<\/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>Denna nod i SymmetricDS-konfigurationen kallas corp-000, och anslutningen till databasen hanteras av mysql jdbc-drivrutinen, som anv\u00e4nder den ovan angivna anslutningsstr\u00e4ngen och inloggningsuppgifterna. Vi ansluter till databasen replica_db, och under skapandet av schemat kommer tabeller att skapas. sync.url visar platsen f\u00f6r att koppla samman med noden f\u00f6r synkronisering.<\/p>\n<p><\/p>\n<p>Nod 2 p\u00e5 v\u00e4rden vm2 \u00e4r konfigurerad som store-001, och resten anges i filen node.properties, som \u00e5terges nedan. Nod store-001 anv\u00e4nder PostgreSQL-databasen, och pgdb_replica \u00e4r databasen f\u00f6r replikering. registration.url till\u00e5ter v\u00e4rden vm2 att koppla upp sig mot v\u00e4rden vm1 och h\u00e4mta konfigurationsdetaljer.<\/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>Ett f\u00e4rdigt exempel p\u00e5 SymmetricDS inneh\u00e5ller parametrar f\u00f6r att konfigurera tv\u00e5v\u00e4gs replikering mellan tv\u00e5 databasserverar (tv\u00e5 noder). Stegen nedan utf\u00f6rs p\u00e5 v\u00e4rden vm1 (corp-000), som kommer att skapa ett exempel p\u00e5 schema med 4 tabeller. D\u00e4refter kommer kommandot create-sym-tables i symadmin att skapa katalogtabeller d\u00e4r regler och riktning f\u00f6r replikering mellan noder kommer att lagras. Slutligen laddas exempeldata upp i tabellerna.<\/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 exemplet \u00e4r tabellerna item och item_selling_price automatiskt konfigurerade f\u00f6r replikering fr\u00e5n corp-000 till store-001, och tabellerna sale (sale_transaction och sale_return_line_item) \u00e4r automatiskt konfigurerade f\u00f6r replikering fr\u00e5n store-001 till corp-000. Nu skapar vi ett schema i PostgreSQL-databasen p\u00e5 v\u00e4rden vm2 (store-001) f\u00f6r att f\u00f6rbereda den f\u00f6r att ta emot data fr\u00e5n 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 \u00e4r viktigt att kontrollera att det finns exempeldata i MySQL-databasen p\u00e5 vm1, liksom katalogtabellerna f\u00f6r SymmetricDS. Observera att systemtabellerna f\u00f6r SymmetricDS (med prefikset sym_) f\u00f6r n\u00e4rvarande endast \u00e4r tillg\u00e4ngliga p\u00e5 noden corp-000, eftersom vi d\u00e4r har utf\u00f6rt kommandot create-sym-tables och kommer att hantera replikeringen. Dessutom kommer databasen p\u00e5 noden store-001 att ha totalt 4 exempel tabeller utan data.<\/p>\n<p><\/p>\n<p>Klart. Milj\u00f6n \u00e4r redo f\u00f6r att k\u00f6ra serverprocesserna sym p\u00e5 b\u00e5da noderna, som visas nedan.<\/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>Loggning av registreringar skickas till filen f\u00f6r bakgrundsloggen (symmetric.log) i loggmappen i katalogen d\u00e4r SymmetricDS \u00e4r installerat, samt till standardutdata. Sym-servern kan nu initieras 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>Om man startar serverprocessen sym p\u00e5 v\u00e4rden vm2 kommer det att skapa SymmetricDS-katalogtabeller \u00e4ven i PostgreSQL-databasen. Om serverprocessen sym k\u00f6rs p\u00e5 b\u00e5da noderna kommer de att samordna sig med varandra f\u00f6r att replikera data fr\u00e5n corp-000 till store-001. Om vi efter n\u00e5gra sekunder beg\u00e4r alla 4 tabeller p\u00e5 b\u00e5da sidor kommer vi att se att replikeringen har genomf\u00f6rts framg\u00e5ngsrikt. Alternativt kan vi skicka en initial laddning till noden store-001 fr\u00e5n corp-000 med f\u00f6ljande 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>Vid det h\u00e4r laget s\u00e4tts en ny post in i item-tabellen i MySQL-databasen p\u00e5 noden corp-000 (v\u00e4rd: vm1), och vi kan kontrollera dess replikering till PostgreSQL-databasen p\u00e5 noden store-001. Vi ser en Pull-operation f\u00f6r att flytta data fr\u00e5n corp-000 till 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>F\u00f6r att utf\u00f6ra Push-operationen f\u00f6r att flytta data fr\u00e5n store-001 till corp-000, s\u00e4tter vi in en post i sale_transaction-tabellen och kontrollerar att replikeringen har genomf\u00f6rts.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Result.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vi ser en framg\u00e5ngsrik inst\u00e4llning av tv\u00e5v\u00e4gsreplikering av exempeltabellerna mellan MySQL- och PostgreSQL-databaserna. F\u00f6r att st\u00e4lla in replikering f\u00f6r nya anv\u00e4ndartabeller f\u00f6ljer vi dessa steg. Vi skapar tabellen t1 som ett exempel och st\u00e4ller in reglerna f\u00f6r dess replikering p\u00e5 f\u00f6ljande s\u00e4tt. S\u00e5 st\u00e4ller vi endast in replikering fr\u00e5n corp-000 till 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>Konfigurationen f\u00e5r sedan ett meddelande om \u00e4ndring av schemat, det vill s\u00e4ga till\u00e4gg av en ny tabell, via kommandot symadmin med argumentet sync-triggers, som \u00e5terskapar triggers f\u00f6r att matcha tabelldefinitionerna. send-schema k\u00f6rs f\u00f6r att skicka schema\u00e4ndringarna till noden store-001, och replikeringen av tabellen t1 konfigureras.<\/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\">F\u00f6rdelar med SymmetricDS<\/h3>\n<p><\/p>\n<p>Enkel installation och konfiguration, inklusive en f\u00e4rdig upps\u00e4ttning filer med parametrar f\u00f6r att skapa scheman med tre eller tv\u00e5 noder.<br \/>\nPlattformsoberoende databas och oberoende av plattform, inklusive servrar, b\u00e4rbara datorer och mobila enheter.<br \/>\nReplikering av vilken databas som helst till vilken annan databas som helst lokalt, i WAN eller i molnet.<br \/>\nM\u00f6jligheten till optimal drift med ett par databaser eller flera tusen f\u00f6r bekv\u00e4m replikering.<br \/>\nBetald version med grafiskt gr\u00e4nssnitt och utm\u00e4rkt support.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Nackdelar med SymmetricDS<\/h3>\n<p><\/p>\n<p>Man beh\u00f6ver manuellt ange regler och riktning f\u00f6r replikering via SQL-operat\u00f6rer f\u00f6r att ladda katalogtabeller, vilket kan vara besv\u00e4rligt.<br \/>\nAtt konfigurera m\u00e5nga tabeller f\u00f6r replikering kan vara tr\u00f6ttsamt om man inte anv\u00e4nder skript f\u00f6r att skapa SQL-operat\u00f6rer som definierar regler och riktning f\u00f6r replikeringen.<br \/>\nDet skrivs f\u00f6r mycket information i loggarna, och ibland m\u00e5ste man st\u00e4da upp loggfilen s\u00e5 att den inte tar f\u00f6r mycket plats.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Sammanfattning av SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS m\u00f6jligg\u00f6r konfiguration av tv\u00e5v\u00e4gsreplikering mellan tv\u00e5, tre och till och med flera tusen noder f\u00f6r att utf\u00f6ra replikering och synkronisera filer. Detta \u00e4r ett unikt verktyg som sj\u00e4lv utf\u00f6r m\u00e5nga uppgifter, s\u00e5som automatisk \u00e5terst\u00e4llning av data efter l\u00e5ngvarigt driftstopp p\u00e5 en nod, s\u00e4ker och effektiv data\u00f6verf\u00f6ring mellan noder \u00f6ver HTTPS, automatisk hantering av konflikter baserat p\u00e5 ett regelsystem etc. SymmetricDS utf\u00f6r replikering mellan valfria databaser, vilket g\u00f6r att den kan anv\u00e4ndas f\u00f6r en m\u00e4ngd olika scenarier, inklusive migrering, uppgradering, distribution, filtrering och omvandling av data p\u00e5 olika plattformar.<\/p>\n<p><\/p>\n<p>Exemplet \u00e4r skapat baserat p\u00e5 den officiella <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">kortguiden<\/a><\/noindex> till SymmetricDS. I <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">anv\u00e4ndarhandboken<\/a><\/noindex> detaljerat beskrivs olika begrepp relaterade till att konfigurera replikering med SymmetricDS.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Korsreplikering mellan PostgreSQL och MySQL | ProHoster","description":"Jag kommer att ge en \u00f6versikt.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}