{"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\/sl\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Kri\u017ena replikacija med PostgreSQL in MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kri\u017ena replikacija med PostgreSQL in MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na splo\u0161no bom predstavil kri\u017eno replikacijo med PostgreSQL in MySQL ter metode za nastavitev kri\u017ene replikacije med tema dvema stre\u017enikoma baz podatkov. Obi\u010dajno se baze podatkov v kri\u017eni replikaciji imenujejo homogene, kar je priro\u010den na\u010din prehoda s enega stre\u017enika relacijske DBMS na drugega.<\/p>\n<p><\/p>\n<p>Baze podatkov PostgreSQL in MySQL veljajo za relacijske, vendar z dodatnimi raz\u0161iritvami ponujajo mo\u017enosti NoSQL. Tukaj bomo razpravljali o replikaciji med PostgreSQL in MySQL z vidika relacijskih DBMS.<\/p>\n<p><\/p>\n<p>Ne bomo opisovali celotne notranje mehanike, temve\u010d le osnovna na\u010dela, da boste dobili predstavo o nastavitvi replikacije med stre\u017eniki baz podatkov, prednostih, omejitvah in scenarijih uporabe.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Obi\u010dajno se replikacija med dvema identi\u010dnima stre\u017enikoma baz podatkov izvaja bodisi v binarnem na\u010dinu bodisi s poizvedbami med vodilnim vozli\u0161\u010dem (to je zalo\u017enik, glavni ali aktivni) in sledilnim (prejemnik, \u010dakajo\u010di ali pasivni). Namen replikacije je v realnem \u010dasu zagotoviti kopijo glavne baze podatkov na strani sledilca. Pri tem se podatki prena\u0161ajo od vodilnega do sledilca, torej od aktivnega do pasivnega, saj se replikacija izvaja le v eno smer. Vendar pa je mogo\u010de nastaviti replikacijo med dvema bazama podatkov v obe smeri, da se podatki prena\u0161ajo od sledilca do vodilnega v konfiguraciji 'aktivni-aktivni'. Vse to, vklju\u010dno s kaskadno replikacijo, je mogo\u010de med dvema ali ve\u010d identi\u010dnima stre\u017enikoma baz podatkov. Konfiguracija 'aktivni-aktivni' ali 'aktivni-pasivni' je odvisna od potreb, dostopnosti takih mo\u017enosti v izvorni konfiguraciji ali uporabe zunanjih re\u0161itev za nastavitev in obstoje\u010dih kompromisov.<\/p>\n<p><\/p>\n<p>Opisano konfiguracijo je mogo\u010de izvesti med razli\u010dnimi stre\u017eniki baz podatkov. Stre\u017enik je mogo\u010de nastaviti za sprejem replikiranih podatkov z drugega stre\u017enika baz podatkov in pri tem ohraniti posnetke replikiranih podatkov v realnem \u010dasu. MySQL in PostgreSQL ponujata ve\u010dino teh konfiguracij z lastno podporo ali s pomo\u010djo zunanjih raz\u0161iritev, vklju\u010dno z metodami binarnega dnevnika, zaklepanjem diska ter metodami, ki temeljijo na operaterjih in vrsticah.<\/p>\n<p><\/p>\n<p>Kri\u017ena replikacija med MySQL in PostgreSQL je potrebna za enkratno migracijo z enega stre\u017enika baz podatkov na drugega. Ti podatki uporabljajo razli\u010dne protokole, zato jih ni mogo\u010de neposredno povezati. Za vzpostavitev izmenjave podatkov lahko uporabite zunanji odprtokodni pripomo\u010dek, na primer pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Kaj je pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon je sistem replikacije iz MySQL v PostgreSQL, napisan v Python 3. Uporablja odprtokodno knji\u017enico mysql-replication, prav tako v Pythonu. Nizi podatkov se izvle\u010dejo iz tabel MySQL in shranijo kot objekti JSONB v bazi podatkov PostgreSQL, nato pa se dekodirajo s funkcijo pl\/pgsql in se reproducirajo v bazi podatkov PostgreSQL.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Mo\u017enosti pg_chameleon<\/h3>\n<p><\/p>\n<p>Ve\u010d shem MySQL iz enega klasterja je mogo\u010de replikovati v eno ciljno bazo podatkov PostgreSQL z konfiguracijo \"ena proti mnogim\".<br \/>\nImena izvorne in ciljne sheme se ne smejo ujemati.<br \/>\nPodatke replikacije je mogo\u010de izvle\u010di iz kaskadne replikacije MySQL.<br \/>\nTabele, ki se ne morejo replikovati ali povzro\u010dajo napake, se izklju\u010dijo.<br \/>\nVsako funkcijo replikacije upravljajo procesi.<br \/>\nNadzor z uporabo parametrov in konfiguracijskih datotek v formatu YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Primer<\/h3>\n<p><\/p>\n<p>Stre\u017enik<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Razli\u010dica operacijskega sistema<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Razli\u010dica stre\u017enika Baze podatkov<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Pristani\u0161\u010de Baze podatkov<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>IP naslov<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Najprej pripravite vse potrebne sestavne dele za namestitev pg_chameleon. V tem primeru je name\u0161\u010den Python 3.6.8, ki ustvari in aktivira virtualno okolje.<\/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>Po uspe\u0161ni namestitvi Python 3.6 morate izpolniti \u0161e druge zahteve, na primer ustvariti in aktivirati virtualno okolje. Poleg tega se modul pip posodobi na najnovej\u0161o razli\u010dico in se uporablja za namestitev pg_chameleon. V spodnjih ukazih namerno namestimo pg_chameleon 2.0.9, \u010deprav je najnovej\u0161a razli\u010dica 2.0.10. To je potrebno, da se izognemo novim napakam v posodobljeni razli\u010dici.<\/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>Nato pokli\u010demo pg_chameleon (chameleon je ukaz) z argumentom set_configuration_files, da omogo\u010dimo pg_chameleon in ustvarimo privzete mape in konfiguracijske datoteke.<\/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\/\ncopiyng configuration example in \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Zdaj ustvarjamo kopijo config-example.yml kot default.yml, da postane datoteka s privzetimi konfiguracijami. Vzor\u010dna datoteka s konfiguracijo za ta primer je navedena spodaj.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#global settings\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 omogo\u010da uporabniku, da nadomesti privzeto pretvorbo tipov z drugo.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#postgres destination connection\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 #skips inserts on the table delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #skips deletes on schema delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Datoteka s konfiguracijo v tem primeru je primer datoteke pg_chameleon s manj\u0161imi spremembami v skladu z izvorno in ciljno okolico, spodaj pa je pregled razli\u010dnih razdelkov datoteke s konfiguracijo.<\/p>\n<p><\/p>\n<p>V datoteki s konfiguracijo default.yml je oddelek globalnih nastavitev (global settings), kjer lahko upravljate s tak\u0161nimi nastavitvami, kot so lokacija datoteke za zaklepanje, lokacija logov, obdobje shranjevanja logov itd. Naslednji oddelek je oddelek za nadzor tipov (type override), kjer je navedena vrsta pravil za nadzor tipov med replikacijo. V privzetem primeru se uporablja pravilo za nadzor tipov, ki pretvarja tinyint(1) v logi\u010dno vrednost. V naslednjem razdelku navedemo podrobnosti o povezavi do ciljne podatkovne baze. V na\u0161em primeru je to podatkovna baza PostgreSQL, ozna\u010dena kot pg_conn. V zadnjem razdelku navedemo podatke o viru, torej parametre povezave do izvorne podatkovne baze, shemo usklajevanja med izvorno in ciljno podatkovno bazo, tabele, ki jih je treba presko\u010diti, \u010das \u010dakanja, pomnilnik, velikost paketa. Opazite, da je \"sources\" navedeno v mno\u017eini, kar pomeni, da lahko dodamo ve\u010d izvornih podatkovnih baz za eno ciljno, da prilagodimo konfiguracijo \"ve\u010d proti enemu\".<\/p>\n<p><\/p>\n<p>Baza podatkov world_x v primeru vsebuje 4 tabele s podatki, ki jih skupnost MySQL ponuja kot primer. Lahko jo nalo\u017eite. <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">ovde<\/a><\/noindex>. Primer baze podatkov je na voljo v obliki tar in stisnjenega arhiva z navodili za ustvarjanje in uvoz vrstic.<\/p>\n<p><\/p>\n<p>V bazah podatkov MySQL in PostgreSQL se ustvari poseben uporabnik z enakim imenom usr_replica. V MySQL mu dodelijo dodatna pravica za branje vseh repliciranih tabel.<\/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>Na strani PostgreSQL se ustvari baza podatkov db_replica, ki bo sprejemala spremembe iz baze podatkov MySQL. Uporabnik usr_replica v PostgreSQL se samodejno konfigurira kot lastnik dveh shem pgworld_x in sch_chameleon, ki vsebujeta dejanske replicirane tabele in tabele z registri replikacije. Za samodejno konfiguracijo skrbi argument create_replica_schema, kot boste videli spodaj.<\/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>Baza podatkov MySQL se konfigurira s spremembami nekaterih parametrov, da jo pripravimo na replikacijo, kot je prikazano spodaj. Potrebno bo znova zagnati stre\u017enik baz podatkov, da spremembe za\u010dnejo veljati.<\/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>Sedaj je pomembno preveriti povezavo z obema stre\u017enikoma baz podatkov, da pri izvedbi ukazov pg_chameleon ne pride do te\u017eav.<\/p>\n<p><\/p>\n<p>Na vozli\u0161\u010du PostgreSQL:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x<\/code><\/pre>\n<p><\/p>\n<p>Na vozli\u0161\u010du MySQL:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica<\/code><\/pre>\n<p><\/p>\n<p>Naslednje tri ukaze pg_chameleon (chameleon) pripravljajo okolje, dodajo vir in inicializirajo replikacijo. Argument create_replica_schema v pg_chameleon ustvari privzeto shemo (sch_chameleon) in shemo replikacije (pgworld_x) v bazi podatkov PostgreSQL, kot smo \u017ee omenili. Argument add_source doda izvorno bazo podatkov v konfiguracijo, bere datoteko konfiguracije (default.yml), v na\u0161em primeru to mysql, in init_replica inicializira konfiguracijo na podlagi parametrov v datoteki konfiguracije.<\/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>Izhodi podatkov teh treh ukazov o\u010ditno ka\u017eejo na njihovo uspe\u0161no izvedbo. Vse napake ali sintakti\u010dne napake so prikazane v preprostih in razumljivih sporo\u010dilih z nasveti za odpravo te\u017eav.<\/p>\n<p><\/p>\n<p>Na koncu bomo zagnali replikacijo z ukazom start_replica in prejeli sporo\u010dilo o uspe\u0161ni izvedbi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \nizhod: Zagon proces replikacije za vir mysql<\/code><\/pre>\n<p><\/p>\n<p>Status replikacije lahko preverimo z argumentom show_status, napake pa si lahko ogledamo z argumentom show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Rezultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Kot smo \u017ee omenili, vsako funkcijo replikacije upravljajo demoni. Da jih vidimo, lahko poizvedimo procesno tabelo z ukazom Linux ps, kot je prikazano spodaj.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Rezultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replikacija se ne \u0161teje za nastavljeno, dokler je ne preverimo v realnem \u010dasu, kot je prikazano spodaj. Ustvarili bomo tabelo, vstavili nekaj vnosov v bazo podatkov MySQL in poklicali argument sync_tables v pg_chameleon, da osve\u017eimo demone in replikiramo tabelo z vnosom v bazo podatkov PostgreSQL.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nPoizvedba OK, 0 vrstic prizadeto (0.01 sec)\nmysql&gt; insert into t1 values (1,'one');\nPoizvedba OK, 1 vrstica prizadeta (0.00 sec)\nmysql&gt; insert into t1 values (2,'two');\nPoizvedba OK, 1 vrstica prizadeta (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\nPostopek sinhronizacije tabel za vir mysql je za\u010del.<\/code><\/pre>\n<p><\/p>\n<p>Da potrdimo rezultate testa, poizvedujemo tabelo iz baze podatkov PostgreSQL in prika\u017eemo vrstice.<\/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>\u010ce izvajamo migracijo, bodo naslednji ukazi pg_chameleon njeno zaklju\u010dek. Ukaze je treba izvesti po tem, ko se prepri\u010damo, da so bile vse vrstice vseh ciljnih tabel replikirane, rezultat pa bo skrbno prenesena baza podatkov PostgreSQL brez sklicevanj na izvorno bazo podatkov ali shemo replikacije (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>Po \u017eelji lahko z naslednjimi ukazi odstranimo izvorno konfiguracijo in shemo replikacije.<\/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\">Prednosti pg_chameleon<\/h3>\n<p><\/p>\n<p>Enostavna nastavitev in konfiguracija.<br \/>\nEnostavno odpravljanje napak in prepoznavanje anomali z jasnimi sporo\u010dili o napakah.<br \/>\nDodatne posebne tabele je mogo\u010de dodati k replikaciji po za\u010detni nastavitvi, ne da bi spreminjali preostalo konfiguracijo.<br \/>\nMo\u017eno nastavi\u0165 viacero zdrojov\u00fdch datab\u00e1z pre jednu cie\u013eov\u00fa, \u010do je ve\u013emi praktick\u00e9, ak kombinujete \u00fadaje z jednej alebo viacer\u00fdch datab\u00e1z MySQL do jednej datab\u00e1zy PostgreSQL.<br \/>\nNie je potrebn\u00e9 replikova\u0165 vybran\u00e9 tabu\u013eky.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Nev\u00fdhody pg_chameleon<\/h3>\n<p><\/p>\n<p>Podporuje sa len s MySQL 5.5 a vy\u0161\u0161ou ako zdrojom a PostgreSQL 9.5 a vy\u0161\u0161ou ako cie\u013eovou datab\u00e1zou.<br \/>\nKa\u017ed\u00e1 tabu\u013eka mus\u00ed ma\u0165 prim\u00e1rny alebo jedine\u010dn\u00fd k\u013e\u00fa\u010d, inak sa tabu\u013eky inicializuj\u00fa v priebehu init_replica, ale nereplikuj\u00fa sa.<br \/>\nJednosmern\u00e1 replik\u00e1cia \u2014 len z MySQL do PostgreSQL. Preto sa hod\u00ed len pre sch\u00e9mu 'akt\u00edvny-pas\u00edvny'.<br \/>\nZdrojem m\u00f4\u017ee by\u0165 len datab\u00e1za MySQL, a podpora datab\u00e1zy PostgreSQL ako zdroja je len experiment\u00e1lna a s obmedzeniami (dozviete sa viac <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">ovde<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Zhrnutie pg_chameleon<\/h3>\n<p><\/p>\n<p>Met\u00f3da replik\u00e1cie v pg_chameleon je skvel\u00e1 pre migr\u00e1ciu datab\u00e1z z MySQL do PostgreSQL. Z\u00e1sadnou nev\u00fdhodou je, \u017ee replik\u00e1cia je len jednosmern\u00e1, tak\u017ee odborn\u00edci na datab\u00e1zy ju pravdepodobne nebud\u00fa chcie\u0165 pou\u017e\u00edva\u0165 na ni\u010d in\u00e9, ne\u017e na migr\u00e1ciu. Ale probl\u00e9m jednosmernej replik\u00e1cie mo\u017eno rie\u0161i\u0165 \u010fal\u0161\u00edm open-source n\u00e1strojom \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>Viac inform\u00e1ci\u00ed n\u00e1jdete v ofici\u00e1lnej dokument\u00e1cii <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">ovde<\/a><\/noindex>. N\u00e1povedu k pr\u00edkazov\u00e9mu riadku n\u00e1jdete <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">ovde<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Preh\u013ead SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS je open-source n\u00e1stroj, ktor\u00fd replikuje ak\u00fako\u013evek datab\u00e1zu do akejko\u013evek inej be\u017enej datab\u00e1zy: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird a \u010fal\u0161\u00edch cloudov\u00fdch in\u0161tanci\u00ed DB, ako napr\u00edklad Redshift a Azure at\u010f. Dostupn\u00e9 funkcie: synchroniz\u00e1cia datab\u00e1z a s\u00faborov, replik\u00e1cia viacer\u00fdch hlavn\u00fdch datab\u00e1z, filtrovan\u00e1 synchroniz\u00e1cia, transform\u00e1cia a \u010fal\u0161ie. Je to n\u00e1stroj nap\u00edsan\u00fd v Jave a vy\u017eaduje \u0161tandardn\u00e9 vydanie JRE alebo JDK (verzie 8.0 a vy\u0161\u0161ie). Tu je mo\u017en\u00e9 zapisova\u0165 zmeny \u00fadajov pomocou sp\u00fa\u0161\u0165a\u010dov v zdrojovej datab\u00e1ze a smerova\u0165 ich do pr\u00edslu\u0161nej cie\u013eovej datab\u00e1zy vo forme bal\u00ed\u010dkov.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Mo\u017enosti SymmetricDS<\/h3>\n<p><\/p>\n<p>N\u00e1stroj nie je z\u00e1visl\u00fd od platformy, to znamen\u00e1, \u017ee dve alebo viac r\u00f4znych DB m\u00f4\u017eu vymie\u0148a\u0165 \u00fadaje.<br \/>\nRela\u010dn\u00e9 DB sa synchronizuj\u00fa pomocou z\u00e1pisu zmeny \u00fadajov, zatia\u013e \u010do DB na b\u00e1ze s\u00faborov\u00fdch syst\u00e9mov vyu\u017e\u00edvaj\u00fa synchroniz\u00e1ciu s\u00faborov.<br \/>\nDvojstrann\u00e1 replik\u00e1cia s pou\u017eit\u00edm met\u00f3d Push a Pull na z\u00e1klade s\u00faboru pravidiel.<br \/>\nPodatki se lahko prena\u0161ajo preko varnih omre\u017eij in omre\u017eij z nizko prepustnostjo.<br \/>\nSamodejna obnova ob ponovnem zagonu vozli\u0161\u010d po napaki in samodejno re\u0161evanje konfliktov.<br \/>\nZdru\u017eljivost z oblakom in u\u010dinkoviti API-ji raz\u0161iritev.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Primer<\/h3>\n<p><\/p>\n<p>SymmetricDS je mogo\u010de nastaviti na enega od dveh na\u010dinov:<br \/>\nVodilo (star\u0161evsko) vozli\u0161\u010de, ki centralno usklajuje replikacijo podatkov med dvema podrejenima (otro\u0161kima) vozli\u0161\u010dema, in izmenjava podatkov med otro\u0161kima vozli\u0161\u010dema poteka le preko star\u0161evskega.<br \/>\nAktivno vozli\u0161\u010de (vozhli\u0161\u010de 1) lahko izmenjuje podatke za replikacijo z drugim aktivnim vozli\u0161\u010dem (vozhli\u0161\u010de 2) brez posrednika.<\/p>\n<p><\/p>\n<p>V obeh razli\u010dicah pride do izmenjave podatkov s Push in Pull. V tem primeru bomo obravnavali konfiguracijo 'aktivno-aktivno'. Celotne arhitekture ne moremo obravnavati, zato raziskujte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">vodnik<\/a><\/noindex>, da bi izvedeli ve\u010d o napravi SymmetricDS.<\/p>\n<p><\/p>\n<p>Namestitev SymmetricDS je zelo enostavna: prenesite odprtokodno razli\u010dico zip datoteke <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">od tod<\/a><\/noindex> in jo razpakirajte, kamor \u017eelite. V spodnji tabeli so navedeni podatki o lokaciji namestitve in razli\u010dici SymmetricDS v tem primeru ter razli\u010dice baz podatkov, razli\u010dice Linuxa, IP naslovi in vrata za oba vozli\u0161\u010da.<\/p>\n<p><\/p>\n<p>Stre\u017enik<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Razli\u010dica operacijskega sistema<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Razli\u010dica stre\u017enika Baze podatkov<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Pristani\u0161\u010de Baze podatkov<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>IP naslov<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Razli\u010dica SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Pot namestitve SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Ime vozli\u0161\u010da SymmetricDS<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Tukaj namestimo SymmetricDS v \/usr\/local\/symmetric-server-3.9.20, kjer bodo shranjeni razli\u010dni poddirektoriji in datoteke. Zanimajo nas poddirektoriji samples in engines. V direktoriju samples so shranjeni primeri konfiguracijskih datotek z lastnostmi vozli\u0161\u010da in primeri SQL skriptov za hiter za\u010detek demonstracije.<\/p>\n<p><\/p>\n<p>V direktoriju samples vidimo tri konfiguracijske datoteke z lastnostmi vozli\u0161\u010da \u2014 ime nakazuje zna\u010daj vozli\u0161\u010da v dolo\u010deni shemi.<\/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>V SymmetricDS so vsi potrebni konfiguracijski dokumenti za osnovno shemo s 3 vozli\u0161\u010di (mo\u017enost 1), in iste dokumente je mogo\u010de uporabiti za shemo z 2 vozli\u0161\u010di (mo\u017enost 2). Potrebno konfiguracijsko datoteko kopiramo iz direktorija samples v engines na gostitelju vm1. Izgleda tako:<\/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>Ta vozli\u0161\u010de v konfiguraciji SymmetricDS je imenovano corp-000, povezava do baze podatkov pa se obravnava z mysql jdbc gonilnikom, ki uporablja zgoraj navedeno povezovalno vrstico in prijavne podatke. Povezujemo se z bazo podatkov replica_db, medtem ko bodo tabele ustvarjene med ustvarjanjem sheme. sync.url prikazuje povezavo do vozli\u0161\u010da za sinhronizacijo.<\/p>\n<p><\/p>\n<p>Vozli\u0161\u010de 2 na gostitelju vm2 je nastavljeno kot store-001, preostalo pa je navedeno v datoteki node.properties, ki je navedena spodaj. Vozli\u0161\u010de store-001 izvaja bazo podatkov PostgreSQL, medtem ko je pgdb_replica baza podatkov za replikacijo. registration.url omogo\u010da gostitelju vm2, da stopi v stik z gostiteljem vm1 in pridobi podrobnosti o konfiguraciji.<\/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>Kon\u010dni primer SymmetricDS vsebuje parametre za nastavitev dvosmerne replikacije med dvema stre\u017enikoma podatkov (dvema vozli\u0161\u010dema). Spodnji koraki se izvedejo na gostitelju vm1 (corp-000), ki bo ustvaril primer sheme s 4 tabelami. Nato ukaz create-sym-tables preko symadmin ustvari tabele katalogov, kjer bodo shranjena pravila in smer replikacije med vozli\u0161\u010di. Na koncu se nalo\u017eijo podatki za primer.<\/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>V primeru tabele item in item_selling_price sta samodejno nastavljeni za replikacijo iz corp-000 v store-001, medtem ko sta tabeli sale (sale_transaction in sale_return_line_item) samodejno nastavljeni za replikacijo iz store-001 v corp-000. Zdaj ustvarjamo shemo v bazi podatkov PostgreSQL na gostitelju vm2 (store-001), da jo pripravimo za sprejem podatkov iz 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>Obvezno preverimo, da v bazi podatkov MySQL na vm1 obstajajo primeri tabel in tabele katalogov SymmetricDS. Opazite, da so sistemske tabele SymmetricDS (s predpono sym_) trenutno na voljo samo na vozli\u0161\u010du corp-000, saj smo tam izvedli ukaz create-sym-tables in bomo upravljali replikacijo. Poleg tega bo v bazi podatkov na vozli\u0161\u010du store-001 le 4 tabele primera brez podatkov.<\/p>\n<p><\/p>\n<p>Vse. Okolje je pripravljeno za zagon stre\u017eni\u0161kih procesov sym na obeh vozli\u0161\u010dih, kot je prikazano spodaj.<\/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>Zapisi logov se po\u0161iljajo v datoteko ozadja (symmetric.log) v mapi logov v direktoriju, kjer je name\u0161\u010den SymmetricDS, prav tako pa tudi v standardni izhod. Stre\u017enik sym je zdaj mogo\u010de zagnati na vozli\u0161\u010du 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>\u010ce na gostitelju vm2 za\u017eenete stre\u017eni\u0161ki proces sym, bo ustvaril tabele imenika SymmetricDS tudi v podatkovni bazi PostgreSQL. \u010ce na obeh vozli\u0161\u010dih za\u017eenete stre\u017eni\u0161ki proces sym, se bosta usklajevala, da replicirata podatke z corp-000 na store-001. \u010ce po nekoliko sekundah zahtevamo vseh 4 tabel na obeh straneh, bomo videli, da je replikacija uspe\u0161no izvedena. Ali pa lahko po\u0161ljemo za\u010detno nalaganje na vozli\u0161\u010de store-001 iz corp-000 z naslednjim ukazom.<\/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>V tej fazi je v tabelo item v podatkovni bazi MySQL na vozli\u0161\u010du corp-000 (gostitelj: vm1) vstavljena nova dolo\u010dba in lahko preverimo njeno replikacijo v podatkovni bazi PostgreSQL na vozli\u0161\u010du store-001. Vidimo operacijo Pull za prenos podatkov iz corp-000 v 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>Da izvedemo operacijo Push za prenos podatkov iz store-001 v corp-000, vstavimo zapis v tabelo sale_transaction in preverimo, da je replikacija uspe\u0161no izvedena.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Rezultat.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vidimo uspe\u0161no nastavitev dvostranske replikacije tabel primera med podatkovnimi bazami MySQL in PostgreSQL. Da nastavite replikacijo za nove uporabni\u0161ke tabele, izvedite naslednje korake. Ustvarimo tabelo t1 za primer in nastavimo pravila njene replikacije na naslednji na\u010din. Tako nastavljamo le replikacijo iz corp-000 v 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>Nato konfiguracija obavje\u0161tava o promjeni sheme, odnosno dodavanju nove tablice, pomo\u0107u naredbe symadmin s argumentom sync-triggers, koja ponovno stvara okida\u010de za uskla\u0111ivanje definicija tablica. Izvr\u0161ava se send-schema za slanje promjena sheme na \u010dvor store-001, a replikacija tablice t1 je postavljena.<\/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\">Prednosti SymmetricDS<\/h3>\n<p><\/p>\n<p>Jednostavna instalacija i konfiguracija, uklju\u010duju\u0107i gotov set datoteka s parametrima za izradu sheme s tri ili dva \u010dvora.<br \/>\nKrosplatformnost baza podataka i neovisnost o platformi, uklju\u010duju\u0107i poslu\u017eitelje, prijenosnike i mobilne ure\u0111aje.<br \/>\nReplikacija bilo koje baze podataka u bilo koju drugu bazu podataka lokalno, u WAN-u ili u oblaku.<br \/>\nMogu\u0107nost optimalnog rada s parom baza podataka ili s nekoliko tisu\u0107a za jednostavnu replikaciju.<br \/>\nPla\u0107ena verzija s grafi\u010dkim su\u010deljem i izvrsnom podr\u0161kom.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Nedostaci SymmetricDS<\/h3>\n<p><\/p>\n<p>Potrebno je ru\u010dno odrediti u komandnoj liniji pravila i smjer replikacije putem SQL operatora za u\u010ditavanje tablica kataloga, \u0161to mo\u017ee biti nezgodno.<br \/>\nPodesiti mnogo tablica za replikaciju mo\u017ee biti zamorno, ako se ne koriste skripte za izradu SQL operatora koji definiraju pravila i smjer replikacije.<br \/>\nU log se unosi previ\u0161e informacija, a ponekad je potrebno sre\u0111ivanje log datoteke kako ne bi zauzimala previ\u0161e prostora.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Zaklju\u010dci o SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS omogu\u0107uje pode\u0161avanje dvostruke replikacije izme\u0111u dva, tri i \u010dak nekoliko tisu\u0107a \u010dvorova, kako bi izvr\u0161avali replikaciju i sinkronizirali datoteke. To je jedinstveni alat koji samostalno izvr\u0161ava mnoge zadatke, poput automatskog oporavka podataka nakon dugotrajne nedostupnosti na \u010dvoru, za\u0161ti\u0107ene i efikasne razmjene podataka izme\u0111u \u010dvorova putem HTTPS-a, automatskog upravljanja sukobima na temelju skupa pravila itd. SymmetricDS vr\u0161i replikaciju izme\u0111u bilo kojih baza podataka, pa se mo\u017ee koristiti za najrazli\u010ditije scenarije, uklju\u010duju\u0107i migraciju, prelazak na novu verziju, distribuciju, filtriranje i preoblikovanje podataka na razli\u010ditim platformama.<\/p>\n<p><\/p>\n<p>Primjer je napravljen na temelju slu\u017ebenog <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">kratkog vodi\u010da<\/a><\/noindex> o SymmetricDS. U <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">korisni\u010dkom priru\u010dniku<\/a><\/noindex> podrobno opisujutsja razli\u010dni pojmovi, povezani s postavitvijo replikacije s pomo\u010djo SymmetricDS.<\/p>\n<p>Izvor: <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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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\udd47Kri\u017ena replikacija med PostgreSQL in MySQL | ProHoster","description":"Na splo\u0161no bom govoril o.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}