{"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\/hr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Me\u0111usobna replikacija izme\u0111u PostgreSQL i MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Me\u0111usobna replikacija izme\u0111u PostgreSQL i MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ukratko \u0107u govoriti o kru\u017enoj replikaciji izme\u0111u PostgreSQL-a i MySQL-a, kao i o metodama postavljanja ove vrste replikacije izme\u0111u ovih dvaju servera baza podataka. Obi\u010dno se baze podataka u kru\u017enoj replikaciji nazivaju homogennim, a ovo je prakti\u010dna metoda prelaska s jednog servera relacijske DBMS na drugi.<\/p>\n<p><\/p>\n<p>Baze podataka PostgreSQL i MySQL smatraju se relacijskim, ali uz dodatna pro\u0161irenja nude mogu\u0107nosti NoSQL. Ovdje \u0107emo raspraviti o replikaciji izme\u0111u PostgreSQL-a i MySQL-a s gledi\u0161ta relacijskih DBMS-a.<\/p>\n<p><\/p>\n<p>Ne\u0107emo opisivati svu unutarnju mehaniku, samo osnovne principe kako biste stekli dojam o postavljanju replikacije izme\u0111u servera baza podataka, prednostima, ograni\u010denjima i scenarijima kori\u0161tenja.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Obi\u010dno se replikacija izme\u0111u dva identi\u010dna servera baza podataka vr\u0161i ili u binarnom re\u017eimu, ili putem upita izme\u0111u glavnog \u010dvora (izdava\u010da, glavnog ili aktivnog) i podre\u0111enog (pretplatnika, \u010dekaju\u0107eg ili pasivnog). Cilj replikacije je pru\u017eiti u stvarnom vremenu kopiju glavne baze podataka na strani podre\u0111enog. Pri tome se podaci \u0161alju od glavnog do podre\u0111enog, \u0161to zna\u010di od aktivnog do pasivnog, jer se replikacija odvija samo u jednom smjeru. Me\u0111utim, mogu\u0107e je postaviti replikaciju izme\u0111u dviju baza podataka u oba smjera, tako da se podaci prenose od podre\u0111enog do glavnog u konfiguraciji 'aktivni-aktivni'. Sve ovo, uklju\u010duju\u0107i kaskadnu replikaciju, mogu\u0107e je izme\u0111u dva ili vi\u0161e identi\u010dnih servera baza podataka. Konfiguracija 'aktivni-aktivni' ili 'aktivni-pasivni' ovisi o potrebama, dostupnosti takvih mogu\u0107nosti u izvornoj konfiguraciji ili o upotrebi vanjskih rje\u0161enja za postavljanje i postoje\u0107im kompromisima.<\/p>\n<p><\/p>\n<p>Opisana konfiguracija mogu\u0107a je izme\u0111u razli\u010ditih servera baza podataka. Server se mo\u017ee postaviti za primanje replikovanih podataka s drugog servera baza podataka, dok istovremeno \u010duva snimke replikovanih podataka u stvarnom vremenu. MySQL i PostgreSQL nude ve\u0107inu ovih konfiguracija sami ili uz pomo\u0107 vanjskih pro\u0161irenja, uklju\u010duju\u0107i metode binarnog dnevnika, zaklju\u010denja diska i metode temeljene na operatorima i redovima.<\/p>\n<p><\/p>\n<p>Kri\u017ena replikacija izme\u0111u MySQL-a i PostgreSQL-a potrebna je za jednokratnu migraciju s jednog servera baze podataka na drugi. Ove baze podataka koriste razli\u010dite protokole, stoga ih nije mogu\u0107e izravno povezati. Da bi se uspostavila razmjena podataka, mo\u017ee se koristiti vanjski open-source alat, poput pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">\u0160to je pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon je sustav replikacije iz MySQL-a u PostgreSQL na Pythonu 3. U njemu se koristi open-source biblioteka mysql-replication, tako\u0111er na Pythonu. Redovi se izvode iz MySQL tablica i spremaju kao JSONB objekti u PostgreSQL bazu podataka, a potom se de\u0161ifriraju funkcijom pl\/pgsql i reproduciraju u PostgreSQL bazi podataka.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Mogu\u0107nosti pg_chameleon<\/h3>\n<p><\/p>\n<p>Vi\u0161e MySQL shema iz jednog klastera mo\u017ee se replicirati u jednu ciljnu PostgreSQL bazu podataka s konfiguracijom \"jedan prema mnogo\".<br \/>\nImena izvorne i ciljne sheme ne mogu se poklapati.<br \/>\nPodaci replikacije mogu se izvu\u0107i iz kaskadne replikacije MySQL-a.<br \/>\nTablice koje se ne mogu replicirati ili uzrokuju gre\u0161ke isklju\u010duju se.<br \/>\nSvaku funkciju replikacije upravljaju demoni.<br \/>\nKontrola putem parametara i konfiguracijskih datoteka temeljenih na YAML-u.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Primjer<\/h3>\n<p><\/p>\n<p>Poslu\u017eitelj<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Verzija OS-a<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Verzija servera Baze Podataka<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Port Baze Podataka<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>IP adresa<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Za po\u010detak pripremite sve potrebne komponente za instalaciju pg_chameleon. U ovom primjeru je instaliran Python 3.6.8, koji stvara virtualno okru\u017eenje i aktivira ga.<\/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>Nakon uspje\u0161ne instalacije Python 3.6, potrebno je izvr\u0161iti ostale zahtjeve, na primjer, stvoriti i aktivirati virtualno okru\u017eenje. Tako\u0111er, pip modul se a\u017eurira na najnoviju verziju i koristi za instalaciju pg_chameleon. U naredbama u nastavku namjerno se instalira pg_chameleon 2.0.9, iako je zadnja verzija 2.0.10. To je potrebno kako bi se izbjegli novi bugovi u a\u017euriranoj verziji.<\/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>Zatim pozivamo pg_chameleon (chameleon je komanda) s argumentom set_configuration_files, kako bismo uklju\u010dili pg_chameleon i stvorili mape i konfiguracijske datoteke prema zadanim postavkama.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\nstvaranje direktorija \/root\/.pg_chameleon\nstvaranje direktorija \/root\/.pg_chameleon\/configuration\/\nstvaranje direktorija \/root\/.pg_chameleon\/logs\/\nstvaranje direktorija \/root\/.pg_chameleon\/pid\/\nkopiranje konfiguracije primjera u \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Sada kreiramo kopiju config-example.yml kao default.yml, kako bi postao podrazumijevani konfiguracijski datotek. Primjer konfiguracijske datoteke za ovaj primjer navedeno je u nastavku.<\/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 omogu\u0107uje korisniku da prevari zadanu konverziju tipa u drugu.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#postgres destinacijska konekcija\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 #propu\u0161ta umetanja u tablicu delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #propu\u0161ta brisanja u shemi delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Konfiguracijska datoteka u ovom primjeru je uzorak datoteke s pg_chameleon s manjim izmjenama u skladu s izvorom i odredi\u0161tem, a u nastavku je pregled razli\u010ditih odjeljaka konfiguracijske datoteke.<\/p>\n<p><\/p>\n<p>U konfiguracijskoj datoteci default.yml postoji odjeljak globalnih postavki (global settings), gdje mo\u017eete upravljati postavkama kao \u0161to su lokacija datoteke za zaklju\u010davanje, lokacija logova, razdoblje \u010duvanja logova i sli\u010dno. Zatim slijedi odjeljak za nadja\u010davanje tipova (type override), gdje je naveden set pravila za nadja\u010davanje tipova tijekom replikacije. U zadanom primjeru koristi se pravilo nadja\u010davanja tipa koje pretvara tinyint(1) u logi\u010dku vrijednost. U sljede\u0107em odjeljku navodimo pojedinosti o vezi s odredi\u0161nom bazom podataka. U ovom slu\u010daju to je PostgreSQL baza podataka, ozna\u010dena kao pg_conn. U posljednjem odjeljku navodimo podatke o izvoru, tj. parametre veze izvorne baze podataka, shemu mapiranja izvorne i odredi\u0161ne baze podataka, tablice koje treba presko\u010diti, vrijeme \u010dekanja, memoriju, veli\u010dinu paketa. Primijetite da je \"sources\" navedeno u mno\u017eini, \u0161to zna\u010di da mo\u017eemo dodati vi\u0161e izvornih baza podataka za jednu odredi\u0161nu, kako bismo konfigurirali postavku \"vi\u0161e prema jednoj\".<\/p>\n<p><\/p>\n<p>Baza podataka world_x u primjeru sadr\u017ei 4 tablice s redovima koje zajednica MySQL nudi kao primjer. Mo\u017ee se preuzeti <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">ovdje<\/a><\/noindex>. Primjer baze podataka dolazi u obliku tar i komprimiranog arhiva s uputama za kreiranje i uvoz redova.<\/p>\n<p><\/p>\n<p>U bazama podataka MySQL i PostgreSQL stvara se poseban korisnik istog imena usr_replica. U MySQL-u mu se dodjeljuju dodatna prava za \u010ditanje svih replikiranih tablica.<\/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 stvara se baza podataka db_replica koja \u0107e primati promjene iz baze podataka MySQL. Korisnik usr_replica u PostgreSQL-u automatski se postavlja kao vlasnik dviju shema pgworld_x i sch_chameleon, koje sadr\u017ee replikirane tablice i tablice s katalogom replikacije. Automatska konfiguracija provodi se putem argumenta create_replica_schema, kako \u0107ete vidjeti u nastavku.<\/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 podataka MySQL postavlja se s promjenama nekih parametara kako bi se pripremila za replikaciju, kao \u0161to je prikazano u nastavku. Bit \u0107e potrebno ponovno pokrenuti poslu\u017eitelj baza podataka kako bi promjene stupile na snagu.<\/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>Sada je va\u017eno provjeriti vezu s oba poslu\u017eitelja baza podataka kako bi se izbjegli problemi prilikom izvr\u0161avanja naredbi pg_chameleon.<\/p>\n<p><\/p>\n<p>Na \u010dvori\u0161tu 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 \u010dvori\u0161tu 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>Sljede\u0107e tri naredbe pg_chameleon (chameleon) pripremaju okru\u017eenje, dodaju izvor i inicijaliziraju replikaciju. Argument create_replica_schema u pg_chameleon stvara zadanu shemu (sch_chameleon) i shemu replikacije (pgworld_x) u bazi podataka PostgreSQL, kao \u0161to smo spomenuli. Argument add_source dodaje izvornu bazu podataka u konfiguraciju, \u010ditaju\u0107i konfiguracijski datoteku (default.yml), a u na\u0161em slu\u010daju to je mysql, dok init_replica inicijalizira konfiguraciju na temelju parametara u konfiguracijskoj datoteci.<\/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>Izlaz ovih triju komandi o\u010dito ukazuje na njihovo uspje\u0161no izvr\u0161avanje. Svi nedostaci ili sintakti\u010dke gre\u0161ke su navedeni u jasnim i razumljivim porukama sa savjetima za rje\u0161avanje problema.<\/p>\n<p><\/p>\n<p>Na kraju, pokrenimo replikaciju s pomo\u0107u start_replica i dobit \u0107emo poruku o uspje\u0161nom izvr\u0161avanju.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \nizlaz: Pokretanje procesa replikacije za izvor mysql<\/code><\/pre>\n<p><\/p>\n<p>Status replikacije mo\u017ee se zatra\u017eiti pomo\u0107u argumenta show_status, a gre\u0161ke se mogu pregledati pomo\u0107u argumenta 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>Kao \u0161to smo ve\u0107 rekli, svaku funkciju replikacije upravljaju demoni. Da bismo ih prikazali, zatra\u017eimo tabelu procesa komandom Linux ps, kao \u0161to je prikazano ispod.<\/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 smatra postavljenom dok je ne testiramo u stvarnom vremenu, kao \u0161to je prikazano ispod. Kreiramo tabelu, umetnemo nekoliko zapisa u MySQL bazu podataka i pozivamo argument sync_tables u pg_chameleon, kako bismo a\u017eurirali demone i replikovali tabelu s zapisima u PostgreSQL bazu podataka.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nUpit OK, 0 redova pogo\u0111eno (0.01 sec)\nmysql&gt; insert into t1 values (1,'one');\nUpit OK, 1 red pogo\u0111en (0.00 sec)\nmysql&gt; insert into t1 values (2,'two');\nUpit OK, 1 red pogo\u0111en (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\nProces sinhronizacije tabela za izvor mysql zapo\u010det.<\/code><\/pre>\n<p><\/p>\n<p>Da bismo potvrdili rezultate testa, zatra\u017eimo tabelu iz PostgreSQL baze podataka i ispi\u0161emo redove.<\/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>Ako vr\u0161imo migraciju, sljede\u0107e komande pg_chameleon \u0107e je zavr\u0161iti. Komande treba izvesti nakon \u0161to se uvjerimo da su svi redovi ciljnih tabela replikovani, a rezultat \u0107e biti uredno prenesena PostgreSQL baza podataka bez referenci na izvoru baze podataka ili shemu 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>Ako \u017eelite, sljede\u0107im komandama mo\u017eete izbrisati izvorne konfiguracije i shemu 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>Jednostavna postavka i konfiguracija.<br \/>\nJednostavno otklanjanje gre\u0161aka i otkrivanje anomalija s jasnim porukama o gre\u0161kama.<br \/>\nU replikaciju se mogu dodati dodatne posebne tabele nakon inicijalizacije, bez promjene ostale konfiguracije.<br \/>\nMo\u017eete postaviti nekoliko izvori\u0161nih baza podataka za jednu ciljnu, \u0161to je vrlo korisno ako kombinirate podatke iz jedne ili vi\u0161e MySQL baza podataka u jednoj PostgreSQL bazi podataka.<br \/>\nOdabrane tablice se mogu izostaviti iz replikacije.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Mane pg_chameleon<\/h3>\n<p><\/p>\n<p>Podr\u017eava se samo s MySQL 5.5 i novijim kao izvorom i PostgreSQL 9.5 i novijim kao ciljanom bazom podataka.<br \/>\nSvaka tablica mora imati primarni ili jedinstveni klju\u010d, ina\u010de se tablice inicijaliziraju tijekom procesa init_replica, ali se ne replikiraju.<br \/>\nJednosmjerna replikacija \u2014 samo iz MySQL u PostgreSQL. Stoga je pogodna samo za shemu 'aktivni-pasivni'.<br \/>\nIzvorna mo\u017ee biti samo MySQL baza podataka, a podr\u0161ka PostgreSQL baze podataka kao izvora je samo eksperimentalna i s ograni\u010denjima (saznajte vi\u0161e <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">ovdje<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Zaklju\u010dci o pg_chameleon<\/h3>\n<p><\/p>\n<p>Metoda replikacije u pg_chameleon je odli\u010dna za migraciju baze podataka iz MySQL u PostgreSQL. Zna\u010dajan nedostatak je to \u0161to je replikacija samo jednosmjerna, stoga stru\u010dnjaci za baze podataka vjerojatno ne\u0107e htjeti koristiti to za ne\u0161to osim migracije. Me\u0111utim, problem jednosmjerne replikacije mo\u017ee se rije\u0161iti jo\u0161 jednim open-source alatom \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>Vi\u0161e informacija pro\u010ditajte u slu\u017ebenoj dokumentaciji <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">ovdje<\/a><\/noindex>. Uputstvo za komandnu liniju mo\u017eete prona\u0107i <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">ovdje<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Pregled SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS je open-source alat koji replicira bilo koju bazu podataka u bilo koju drugu uobi\u010dajenu bazu podataka: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird i druge cloud instance baza podataka, kao \u0161to su Redshift i Azure itd. Dostupne funkcije: sinhronizacija baza podataka i datoteka, replikacija vi\u0161e vode\u0107ih baza podataka, filtrirana sinhronizacija, transformacija i druge. To je alat na Javi i potrebna je standardna verzija JRE ili JDK (verzije 8.0 ili novije). Ovdje je mogu\u0107e zabilje\u017eiti promjene podataka putem okida\u010da u izvornoj bazi podataka i usmjeriti ih u odgovaraju\u0107u ciljnu bazu podataka u obliku paketa.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Mogu\u0107nosti SymmetricDS<\/h3>\n<p><\/p>\n<p>Alat je neovisan o platformi, \u0161to zna\u010di da dvije ili vi\u0161e razli\u010ditih baza podataka mogu razmjenjivati podatke.<br \/>\nRelacijske baze podataka se sinhroniziraju putem zabilje\u017eavanja promjena podataka, dok se datote\u010dne baze sinhroniziraju putem sinhronizacije datoteka.<br \/>\nDvostruka replikacija koriste\u0107i Push i Pull metode na temelju skupa pravila.<br \/>\nPrijenos podataka mogu\u0107 je putem za\u0161ti\u0107enih mre\u017ea i mre\u017ea s niskom propusno\u0161\u0107u.<br \/>\nAutomatsko obnavljanje pri ponovnom pokretanju \u010dvorova nakon kvara i automatsko rje\u0161avanje sukoba.<br \/>\nKompatibilnost s oblakom i u\u010dinkoviti API pro\u0161irenja.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Primjer<\/h3>\n<p><\/p>\n<p>SymmetricDS se mo\u017ee konfigurirati na jedan od dva na\u010dina:<br \/>\nVode\u0107i (nadre\u0111eni) \u010dvor, koji centralno koordinira replikaciju podataka izme\u0111u dva podre\u0111ena \u010dvora, dok se razmjena podataka izme\u0111u podre\u0111enih \u010dvorova odvija samo kroz nadre\u0111eni.<br \/>\nAktivni \u010dvor (\u010dvor 1) mo\u017ee razmjenjivati podatke za replikaciju s drugim aktivnim \u010dvorom (\u010dvor 2) bez posrednika.<\/p>\n<p><\/p>\n<p>U oba slu\u010daja razmjena podataka odvija se putem Push i Pull. U ovom primjeru razmotrit \u0107emo konfiguraciju \u201eaktivni-aktivni\u201c. Opisivanje cijele arhitekture dovoljno je dugo, pa istra\u017eite <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">priru\u010dnik<\/a><\/noindex>, kako biste saznali vi\u0161e o radu SymmetricDS.<\/p>\n<p><\/p>\n<p>Instalacija SymmetricDS vrlo je jednostavna: preuzmite open-source verziju zip datoteke <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">odavde<\/a><\/noindex> i raspakirajte je gdje god \u017eelite. U donjoj tablici nalaze se informacije o mjestu instalacije i verziji SymmetricDS u ovom primjeru, kao i verzije baza podataka, verzije Linuxa, IP adrese i portovi za oba \u010dvora.<\/p>\n<p><\/p>\n<p>Poslu\u017eitelj<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Verzija OS-a<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Verzija servera Baze Podataka<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Port Baze Podataka<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>IP adresa<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Verzija SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Put instalacije 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 \u010dvora SymmetricDS<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Ovdje instaliramo SymmetricDS u \/usr\/local\/symmetric-server-3.9.20, a tu \u0107e biti pohranjeni razli\u010diti ugnije\u017edeni direktoriji i datoteke. Zanimaju nas ugnije\u017edeni direktoriji samples i engines. U direktoriju samples nalaze se primjeri konfiguracijskih datoteka s svojstvima \u010dvora, kao i primjeri SQL skripti za brzi po\u010detak prikazivanja.<\/p>\n<p><\/p>\n<p>U direktoriju samples vidimo tri konfiguracijske datoteke s svojstvima \u010dvora \u2014 ime pokazuje karakter \u010dvora u odre\u0111enoj 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>U SymmetricDS postoje sve potrebne konfiguracijske datoteke za osnovnu shemu od 3 \u010dvora (varijanta 1), a iste datoteke mogu se koristiti za shemu od 2 \u010dvora (varijanta 2). Kopiramo potrebnu konfiguracijsku datoteku iz direktorija samples u engines na hostu vm1. Izgleda ovako:<\/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>Ovaj \u010dvor u konfiguraciji SymmetricDS naziva se corp-000, a povezivanje s bazom podataka obra\u0111uje se putem MySQL JDBC drajvera, koji koristi prethodno navedenu konekcijsku stranicu i podatke za prijavu. Povezujemo se s bazom podataka replica_db, a tokom kreiranja \u0161eme bi\u0107e kreirane tabele. sync.url pokazuje mesto veze s \u010dvorom za sinhronizaciju.<\/p>\n<p><\/p>\n<p>\u010cvor 2 na hostu vm2 postavlja se kao store-001, dok je ostalo navedeno u datoteci node.properties, koja je navedena u nastavku. \u010cvor store-001 koristi PostgreSQL bazu podataka, a pgdb_replica je baza podataka za replikaciju. registration.url omogu\u0107ava hostu vm2 da se pove\u017ee s hostom vm1 i dobije detalje konfiguracije.<\/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>Zavr\u0161ni primer SymmetricDS sadr\u017ei parametre za postavljanje dvosmerne replikacije izme\u0111u dva servera baze podataka (dva \u010dvora). Navedeni koraci izvr\u0161avaju se na hostu vm1 (corp-000), koji \u0107e stvoriti primer \u0161eme sa 4 tabele. Zatim, izvr\u0161avanje create-sym-tables komandom symadmin kreira tabele kataloga, gde \u0107e se skladi\u0161titi pravila i pravac replikacije izme\u0111u \u010dvorova. Na kraju, u tabele se u\u010ditavaju primer podaci.<\/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>U primeru, tabele item i item_selling_price automatski su postavljene za replikaciju iz corp-000 u store-001, dok su tabele sale (sale_transaction i sale_return_line_item) automatski postavljene za replikaciju iz store-001 u corp-000. Sada kreiramo \u0161emu u PostgreSQL bazi podataka na hostu vm2 (store-001) kako bismo je pripremili za prijem podataka 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>Obavezno proveravamo da li na MySQL bazi podataka na vm1 postoje primeri tabela i tabele kataloga SymmetricDS. Napomena: sistemske tabele SymmetricDS (s prefiksom sym_) trenutno su dostupne samo na \u010dvoru corp-000, jer smo tamo izvr\u0161ili komandu create-sym-tables i upravljamo replikacijom. A jo\u0161, na bazi podataka na \u010dvoru store-001 bi\u0107e samo 4 tabele primera bez podataka.<\/p>\n<p><\/p>\n<p>Sve. Okru\u017eenje je spremno za pokretanje serverskih procesa sym na oba \u010dvora, kao \u0161to je prikazano u nastavku.<\/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 logova se \u0161alju u datoteku pozadinskog loga (symmetric.log) u mapi logova unutar direktorija u kojem je instaliran SymmetricDS, kao i u standardni izlaz. Server sym se sada mo\u017ee pokrenuti na \u010dvoru 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>Ako pokrenete serverski proces sym na hostu vm2, on \u0107e stvoriti tablice direktorija SymmetricDS i u bazi podataka PostgreSQL. Ako se serverski proces sym pokrene na oba \u010dvora, ona \u0107e se uskla\u0111ivati izme\u0111u sebe kako bi replikacije podataka s corp-000 na store-001. Ako nakon nekoliko sekundi zatra\u017eimo sve 4 tablice s obje strane, vidjet \u0107emo da je replikacija uspje\u0161no izvr\u0161ena. Tako\u0111er mo\u017eemo poslati po\u010detno u\u010ditavanje na \u010dvor store-001 iz corp-000 sljede\u0107om naredbom.<\/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>U ovoj fazi u tablicu item u bazi podataka MySQL na \u010dvoru corp-000 (host: vm1) unosi se nova stavka, a mo\u017eemo provjeriti njezinu replikaciju u bazi podataka PostgreSQL na \u010dvoru store-001 (host: vm2). Vidimo operaciju Pull za prijenos podataka iz corp-000 u 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 bismo izvr\u0161ili operaciju Push za premje\u0161tanje podataka iz store-001 u corp-000, umetnemo stavku u tablicu sale_transaction i provjerimo je li replikacija uspje\u0161no izvr\u0161ena.<\/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 uspje\u0161nu postavku dvosmjerne replikacije tablica izme\u0111u baza podataka MySQL i PostgreSQL. Da bismo postavili replikaciju za nove korisni\u010dke tablice, izvodimo sljede\u0107e korake. Stvaramo tablicu t1 kao primjer i postavljamo pravila njene replikacije na sljede\u0107i na\u010din. Tako postavljamo samo replikaciju iz corp-000 u 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>Zatim konfiguracija dobiva obavijest o promjeni sheme, tj. dodavanju nove tablice, putem veze symadmin s argumentom sync-triggers, koja ponovno stvara okida\u010de za uskla\u0111ivanje definicija tablica. Izvodi 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 spreman paket datoteka s postavkama za stvaranje sheme s tri ili dva \u010dvora.<br \/>\nKros-platforme baze podataka i neovisnost o platformi, uklju\u010duju\u0107i poslu\u017eitelje, prijenosna ra\u010dunala 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 nekoliko tisu\u0107a za jednostavnu replikaciju.<br \/>\nPla\u0107ena verzija s grafi\u010dkim su\u010deljem i odli\u010dnom podr\u0161kom.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Nedostaci SymmetricDS<\/h3>\n<p><\/p>\n<p>Ru\u010dno utvr\u0111ivanje u naredbenom retku pravila i smjera replikacije kroz SQL operatore za u\u010ditavanje tablica kataloga mo\u017ee biti nezgodno.<br \/>\nPostavljanje mnogih tablica za replikaciju mo\u017ee biti zamorno, ako ne koristite skripte za kreiranje SQL operatora koji definiraju pravila i smjer replikacije.<br \/>\nU logove se upisuje previ\u0161e informacija, a ponekad je potrebno sre\u0111ivati datoteku s logom 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 dvostranu replikaciju izme\u0111u dva, tri pa \u010dak i nekoliko tisu\u0107a \u010dvorova kako bi izvodio replikaciju i sinkronizirao datoteke. To je jedinstveni alat koji automatski obavlja mnoge zadatke, poput automatske obnove podataka nakon dugog zastoja na \u010dvoru, sigurnu i u\u010dinkovitu razmjenu podataka izme\u0111u \u010dvorova putem HTTPS-a, automatsko upravljanje konfliktima temeljenim na skupu pravila itd. SymmetricDS izvodi replikaciju izme\u0111u svih baza podataka, pa se mo\u017ee koristiti za najrazli\u010ditije scenarije, uklju\u010duju\u0107i migraciju, prijelaz na novu verziju, distribuciju, filtriranje i transformaciju podataka na razli\u010ditim platformama.<\/p>\n<p><\/p>\n<p>Primjer je izra\u0111en na osnovu slu\u017ebenog <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">kratkog vodi\u010da<\/a><\/noindex> za SymmetricDS. U <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">korisni\u010dkom uputstvu<\/a><\/noindex> detaljno su opisani razli\u010diti pojmovi vezani uz postavljanje replikacije putem SymmetricDS-a.<\/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.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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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 izme\u0111u PostgreSQL-a i MySQL-a | ProHoster","description":"Ukratko \u0107u govoriti o.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}