{"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\/ro\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Replicarea \u00eencruci\u0219at\u0103 \u00eentre PostgreSQL \u0219i MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Replicarea \u00eencruci\u0219at\u0103 \u00eentre PostgreSQL \u0219i MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voi vorbi \u00een linii mari despre replica\u021bia \u00eencruci\u0219at\u0103 \u00eentre PostgreSQL \u0219i MySQL, precum \u0219i despre metodele de configurare a replica\u021biei \u00eentre cele dou\u0103 servere de baze de date. De obicei, bazele de date implicate \u00een replica\u021bia \u00eencruci\u0219at\u0103 sunt considerate omogene, iar acesta este un mod convenabil de a trece de pe un server de SGBD rela\u021bional pe altul.<\/p>\n<p><\/p>\n<p>Bazele de date PostgreSQL \u0219i MySQL sunt considerate rela\u021bionale, dar cu extensii suplimentare ofer\u0103 capacit\u0103\u021bi NoSQL. Aici vom discuta despre replica\u021bia \u00eentre PostgreSQL \u0219i MySQL, din perspectiva SGBD-urilor rela\u021bionale.<\/p>\n<p><\/p>\n<p>Nu vom descrie toat\u0103 complexitatea intern\u0103, ci doar principiile de baz\u0103, astfel \u00eenc\u00e2t s\u0103 ave\u021bi o idee despre configurarea replica\u021biei \u00eentre serverele de baze de date, avantajele, limit\u0103rile \u0219i scenariile de utilizare.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>De obicei, replica\u021bia \u00eentre dou\u0103 servere de baze de date identice se realizeaz\u0103 fie \u00een modul binar, fie prin interog\u0103ri \u00eentre nodul principal (cunoscut \u0219i sub numele de publisher, master sau activ) \u0219i nodul secundar (subscriber, stand-by sau pasiv). Scopul replica\u021biei este de a oferi, \u00een timp real, o copie a bazei de date principale pe partea nodului secundar. \u00cen acest sens, datele sunt transmise de la nodul principal la nodul secundar, adic\u0103 de la activ la pasiv, deoarece replica\u021bia se realizeaz\u0103 \u00eentotdeauna \u00eentr-o singur\u0103 direc\u021bie. Totu\u0219i, se poate configura replica\u021bia \u00eentre dou\u0103 baze de date \u00een ambele sensuri, astfel \u00eenc\u00e2t datele s\u0103 fie transmise de la nodul secundar la nodul principal \u00een configura\u021bia \u201eactiv-activ\u201d. Toate acestea, inclusiv replica\u021bia \u00een cascad\u0103, sunt posibile \u00eentre dou\u0103 sau mai multe servere de baze de date identice. Configura\u021bia \u201eactiv-activ\u201d sau \u201eactiv-pasiv\u201d depinde de nevoie, disponibilitatea acestor posibilit\u0103\u021bi \u00een configura\u021bia ini\u021bial\u0103 sau utilizarea solu\u021biilor externe pentru configurare \u0219i compromisiunile existente.<\/p>\n<p><\/p>\n<p>Configura\u021bia descris\u0103 este posibil\u0103 \u00eentre diferite servere de baze de date. Un server poate fi configurat pentru a primi date replicate de la un alt server de baze de date \u0219i, \u00een acela\u0219i timp, pentru a p\u0103stra instantanee ale datelor replicate \u00een timp real. MySQL \u0219i PostgreSQL ofer\u0103 majoritatea acestor configura\u021bii fie pe cont propriu, fie prin extensii externe, incluz\u00e2nd metodele de jurnal binar, blocarea discului \u0219i metodele bazate pe operatori \u0219i \u0219iruri.<\/p>\n<p><\/p>\n<p>Replica\u021bia \u00eencruci\u0219at\u0103 \u00eentre MySQL \u0219i PostgreSQL este necesar\u0103 pentru migrarea unic\u0103 de la un server de baze de date la altul. Aceste baze de date folosesc protocoale diferite, a\u0219a c\u0103 nu pot fi legate direct. Pentru a stabili schimbul de date, se poate folosi un instrument extern open-source, cum ar fi pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Ce este pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon este un sistem de replicare de la MySQL la PostgreSQL scris \u00een Python 3. Acesta utilizeaz\u0103 biblioteca open-source mysql-replication, tot pe Python. Imaginile r\u00e2ndurilor sunt extrase din tabelele MySQL \u0219i salvate ca obiecte JSONB \u00een baza de date PostgreSQL, apoi sunt dezv\u0103luite prin func\u021bia pl\/pgsql \u0219i reproduse \u00een baza de date PostgreSQL.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">Func\u021bionalit\u0103\u021bile pg_chameleon<\/h3>\n<p><\/p>\n<p>Mai multe scheme MySQL dintr-un singur cluster pot fi replicate \u00eentr-o singur\u0103 baz\u0103 de date \u021bint\u0103 PostgreSQL cu o configura\u021bie \u201eunu la multe\u201d<br \/>\nNumele schemei surs\u0103 \u0219i \u021bint\u0103 nu pot coincide.<br \/>\nDatele de replicare pot fi extrase dintr-o replic\u0103 \u00een cascad\u0103 MySQL.<br \/>\nTabelele care nu pot fi replicate sau care genereaz\u0103 erori sunt excluse.<br \/>\nFiecare func\u021bie de replicare este gestionat\u0103 de demonii.<br \/>\nControl prin intermediul parametrilor \u0219i fi\u0219ierelor de configurare bazate pe YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Exemplu<\/h3>\n<p><\/p>\n<p>Gazd\u0103<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versiunea OS<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>Versiunea serverului DB<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Portul DB<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>Adres\u0103 IP<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Pentru a \u00eencepe, preg\u0103ti\u021bi toate componentele necesare pentru instalarea pg_chameleon. \u00cen acest exemplu, este instalat Python 3.6.8, care creeaz\u0103 un mediu virtual \u0219i \u00eel activeaz\u0103.<\/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>Dup\u0103 instalarea cu succes a Python 3.6, trebuie s\u0103 \u00eendeplini\u021bi celelalte cerin\u021be, cum ar fi crearea \u0219i activarea mediu virtual. \u00cen plus, modulul pip este actualizat la cea mai recent\u0103 versiune \u0219i este utilizat pentru instalarea pg_chameleon. \u00cen comenzile de mai jos, se instaleaz\u0103 inten\u021bionat pg_chameleon 2.0.9, de\u0219i ultima versiune este 2.0.10. Acest lucru este necesar pentru a evita erorile noi din versiunea actualizat\u0103.<\/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>Apoi apel\u0103m pg_chameleon (chameleon \u2014 aceasta este comanda) cu argumentul set_configuration_files, pentru a activa pg_chameleon \u0219i a crea directoare \u0219i fi\u0219iere de configurare implicite.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\ncre\u00e2nd directorul \/root\/.pg_chameleon\ncre\u00e2nd directorul \/root\/.pg_chameleon\/configuration\/\ncre\u00e2nd directorul \/root\/.pg_chameleon\/logs\/\ncre\u00e2nd directorul \/root\/.pg_chameleon\/pid\/\ncopiind configura\u021bia exemplu \u00een \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Acum cre\u0103m o copie a config-example.yml ca default.yml, astfel \u00eenc\u00e2t s\u0103 devin\u0103 fi\u0219ierul de configurare implicit. Exemplul fi\u0219ierului de configurare pentru acest exemplu este prezentat mai jos.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#set\u0103ri globale\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 permite utilizatorului s\u0103 suprascrie conversia implicit\u0103 a tipului \u00eentr-unul diferit.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#conexiune de destina\u021bie postgres\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 #sari peste inser\u021biile \u00een tabela delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #sari peste \u0219tergerile din schema delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>Fi\u0219ierul de configurare \u00een acest exemplu este un model de fi\u0219ier cu pg_chameleon, cu modific\u0103ri minore conform mediilor surs\u0103 \u0219i destina\u021bie, iar mai jos se ofer\u0103 o prezentare general\u0103 a diferitelor sec\u021biuni ale fi\u0219ierului de configurare.<\/p>\n<p><\/p>\n<p>\u00cen fi\u0219ierul de configurare default.yml exist\u0103 o sec\u021biune de set\u0103ri globale, unde se pot gestiona set\u0103ri precum loca\u021bia fi\u0219ierului de blocare, loca\u021bia jurnalelor, perioada de p\u0103strare a jurnalelor etc. Apoi urmeaz\u0103 sec\u021biunea de suprascriere a tipurilor, unde sunt specificate un set de reguli pentru suprascrierea tipurilor \u00een timpul replic\u0103rii. \u00cen exemplul implicit se folose\u0219te o regul\u0103 de suprascriere care transform\u0103 tinyint(1) \u00een boolean. \u00cen urm\u0103toarea sec\u021biune specific\u0103m detaliile de conectare la baza de date \u021bint\u0103. \u00cen cazul nostru, aceasta este baza de date PostgreSQL, numit\u0103 pg_conn. \u00cen ultima sec\u021biune, indic\u0103m datele surs\u0103, adic\u0103 parametrii de conectare ai bazei de date surs\u0103, schema de mapare a bazelor de date surs\u0103 \u0219i \u021bint\u0103, tabelele care trebuie ocolite, timpul de a\u0219teptare, memoria, dimensiunea lotului. Observa\u021bi c\u0103 \u201esources\u201d este specificat la plural, ceea ce \u00eenseamn\u0103 c\u0103 putem ad\u0103uga mai multe baze de date surs\u0103 pentru una singur\u0103 \u021bint\u0103, pentru a configura o configura\u021bie de tip \u201emulte la unul\u201d.<\/p>\n<p><\/p>\n<p>Baza de date world_x din exemplu con\u021bine 4 tabele cu r\u00e2nduri, pe care comunitatea MySQL le ofer\u0103 ca exemplu. Aceasta poate fi \u00eenc\u0103rcat\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">aici<\/a><\/noindex>. Exemplul bazei de date este furnizat sub form\u0103 de arhiv\u0103 tar comprimat\u0103 cu instruc\u021biuni pentru crearea \u0219i importul r\u00e2ndurilor.<\/p>\n<p><\/p>\n<p>\u00cen bazele de date MySQL \u0219i PostgreSQL se creeaz\u0103 un utilizator special cu acela\u0219i nume usr_replica. \u00cen MySQL, acesta prime\u0219te drepturi suplimentare de citire asupra tuturor tabelelor replicate.<\/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>Pe partea PostgreSQL se creeaz\u0103 baza de date db_replica, care va primi modific\u0103rile din baza de date MySQL. Utilizatorul usr_replica \u00een PostgreSQL este configurat automat ca proprietar al celor dou\u0103 scheme pgworld_x \u0219i sch_chameleon, care con\u021bin tabelele replicate efective \u0219i tabelele cu directoarele de replicare, respectiv. Configurarea automat\u0103 este gestionat\u0103 de argumentul create_replica_schema, a\u0219a cum ve\u021bi vedea mai jos.<\/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 de date MySQL este configurat\u0103 cu modific\u0103ri ale unor parametri, pentru a o preg\u0103ti pentru replicare, a\u0219a cum este ilustrat mai jos. Va trebui s\u0103 reporni\u021bi serverul de baze de date pentru ca modific\u0103rile s\u0103 intre \u00een vigoare.<\/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>Acum este important s\u0103 verifica\u021bi conexiunea la ambele servere de baze de date, pentru a evita problemele \u00een timpul execut\u0103rii comenzilor pg_chameleon.<\/p>\n<p><\/p>\n<p>Pe nodul 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>Pe nodul 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>Urm\u0103toarele trei comenzi pg_chameleon (chameleon) preg\u0103tesc mediul, adaug\u0103 sursa \u0219i ini\u021bializeaz\u0103 replica. Argumentul create_replica_schema \u00een pg_chameleon creeaz\u0103 schema implicit\u0103 (sch_chameleon) \u0219i schema de replicare (pgworld_x) \u00een baza de date PostgreSQL, a\u0219a cum am men\u021bionat anterior. Argumentul add_source adaug\u0103 baza de date surs\u0103 \u00een configura\u021bie, citind fi\u0219ierul de configura\u021bie (default.yml), iar ini\u021bializarea replicii se face pe baza parametrilor din fi\u0219ierul de configura\u021bie.<\/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>Rezultatele acestor trei comenzi indic\u0103 \u00een mod clar finalizarea lor cu succes. Toate erorile sau problemele de sintax\u0103 sunt indicate prin mesaje simple \u0219i clare, cu sugestii pentru corectarea problemelor.<\/p>\n<p><\/p>\n<p>\u00cen cele din urm\u0103, s\u0103 lans\u0103m replicarea folosind start_replica \u0219i s\u0103 ob\u021binem un mesaj de finalizare cu succes.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \noutput: Pornirea procesului de replicare pentru sursa mysql<\/code><\/pre>\n<p><\/p>\n<p>Starea replic\u0103rii poate fi solicitat\u0103 cu ajutorul argumentului show_status, iar erorile pot fi vizualizate prin argumentul show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Rezultatul.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>A\u0219a cum am spus, fiecare func\u021bie de replicare este gestionat\u0103 de demoni. Pentru a le vizualiza, vom solicita tabelul de procese cu comanda Linux ps, a\u0219a cum este prezentat mai jos.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Rezultatul.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replicarea nu este considerat\u0103 configurat\u0103 p\u00e2n\u0103 c\u00e2nd nu o test\u0103m \u00een timp real, a\u0219a cum este prezentat mai jos. Cre\u0103m un tabel, inser\u0103m c\u00e2teva \u00eenscrieri \u00een baza de date MySQL \u0219i apel\u0103m argumentul sync_tables din pg_chameleon pentru a actualiza demonii \u0219i a replica tabelul cu \u00eenscrierile \u00een baza de date PostgreSQL.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nQuery OK, 0 rows affected (0.01 sec)\nmysql&gt; insert into t1 values (1,'one');\nQuery OK, 1 row affected (0.00 sec)\nmysql&gt; insert into t1 values (2,'two');\nQuery OK, 1 row affected (0.00 sec)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon sync_tables --tables world_x.t1 --config default --source mysql\nProcesul de sincronizare a tabelului pentru sursa mysql a \u00eenceput.<\/code><\/pre>\n<p><\/p>\n<p>Pentru a confirma rezultatele testului, solicit\u0103m tabelul din baza de date PostgreSQL \u0219i afi\u0219\u0103m r\u00e2ndurile.<\/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>Dac\u0103 efectuam migrarea, urm\u0103toarele comenzi pg_chameleon vor marca finalizarea acesteia. Comenzile trebuie executate dup\u0103 ce ne asigur\u0103m c\u0103 r\u00e2ndurile din toate tabelele \u021bint\u0103 au fost replicate, iar rezultatul va fi o baz\u0103 de date PostgreSQL transferat\u0103 cu succes, f\u0103r\u0103 referin\u021be la baza de date sau schema de replicare original\u0103 (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>Op\u021bional, urm\u0103toarele comenzi pot elimina configura\u021bia original\u0103 \u0219i schema de replicare.<\/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\">Avantajele pg_chameleon<\/h3>\n<p><\/p>\n<p>Configurare \u0219i setare simpl\u0103.<br \/>\nDepanare convenabil\u0103 \u0219i identificare a anomaliilor cu mesaje de eroare clare.<br \/>\n\u00cen replicare pot fi ad\u0103ugate tabele speciale suplimentare dup\u0103 ini\u021bializare, f\u0103r\u0103 a schimba restul configura\u021biei.<br \/>\nPute\u021bi configura mai multe baze de date surs\u0103 pentru o singur\u0103 destina\u021bie, ceea ce este foarte convenabil atunci c\u00e2nd combina\u021bi date din una sau mai multe baze de date MySQL \u00eentr-o singur\u0103 baz\u0103 de date PostgreSQL.<br \/>\nPute\u021bi alege s\u0103 nu replica\u021bi tabelele selectate.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">Dezavantajele pg_chameleon<\/h3>\n<p><\/p>\n<p>Este compatibil doar cu MySQL 5.5 \u0219i versiuni superioare ca surs\u0103 \u0219i PostgreSQL 9.5 \u0219i versiuni superioare ca baz\u0103 de date destina\u021bie.<br \/>\nFiecare tabel trebuie s\u0103 aib\u0103 o cheie primar\u0103 sau unic\u0103, altfel tabelele sunt ini\u021bializate \u00een timpul procesului init_replica, dar nu sunt replicate.<br \/>\nReplicarea unidirec\u021bional\u0103 - doar din MySQL \u00een PostgreSQL. De aceea, este potrivit\u0103 doar pentru schema \u201eactiv-pasiv\u201d.<br \/>\nBaza de date surs\u0103 poate fi doar MySQL, iar suportul pentru baza de date PostgreSQL ca surs\u0103 este doar experimental \u0219i cu limit\u0103ri (afla\u021bi mai multe <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">aici<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Concluziile despre pg_chameleon<\/h3>\n<p><\/p>\n<p>Metoda de replicare din pg_chameleon este excelent\u0103 pentru migrarea unei baze de date din MySQL \u00een PostgreSQL. Un dezavantaj semnificativ este c\u0103 replicarea este doar unidirec\u021bional\u0103, a\u0219a c\u0103 speciali\u0219tii \u00een baze de date probabil c\u0103 nu vor dori s\u0103 o foloseasc\u0103 pentru altceva dec\u00e2t migrarea. Dar problema replic\u0103rii unidirec\u021bionale poate fi rezolvat\u0103 cu un alt instrument open-source - SymmetricDS.<\/p>\n<p><\/p>\n<p>Citi\u021bi mai multe \u00een documenta\u021bia oficial\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">aici<\/a><\/noindex>. Pute\u021bi g\u0103si ajutorul pentru linia de comand\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">aici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">Prezentare general\u0103 a SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS este un instrument open-source care replic\u0103 orice baz\u0103 de date \u00een orice alt\u0103 baz\u0103 de date popular\u0103: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird \u0219i alte instan\u021be cloud de baze de date, cum ar fi Redshift \u0219i Azure etc. Func\u021bii disponibile: sincronizarea bazelor de date \u0219i fi\u0219ierelor, replicarea mai multor baze de date master, sincronizarea filtrat\u0103, transformarea \u0219i altele. Este un instrument pe Java \u0219i necesit\u0103 o versiune standard JRE sau JDK (versiunea 8.0 sau mai recent\u0103). Aici pute\u021bi \u00eenregistra modific\u0103rile datelor prin intermediul trigger-elor \u00een baza de date surs\u0103 \u0219i le pute\u021bi direc\u021biona c\u0103tre baza de date destina\u021bie corespunz\u0103toare sub form\u0103 de pachete.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">Func\u021bionalit\u0103\u021bile SymmetricDS<\/h3>\n<p><\/p>\n<p>Instrumentul nu depinde de platform\u0103, adic\u0103 dou\u0103 sau mai multe baze de date diferite pot schimba date.<br \/>\nBaze de date rela\u021bionale sunt sincronizate prin \u00eenregistrarea modific\u0103rii datelor, iar bazele de date bazate pe sisteme de fi\u0219iere utilizeaz\u0103 sincronizarea fi\u0219ierelor.<br \/>\nReplicare bidirec\u021bional\u0103 folosind metode Push \u0219i Pull pe baza unui set de reguli.<br \/>\nTransmisia datelor se poate efectua prin re\u021bele securizate \u0219i re\u021bele cu l\u0103\u021bimi de band\u0103 sc\u0103zut\u0103.<br \/>\nRecuperare automat\u0103 la repornirea nodurilor dup\u0103 o eroare \u0219i rezolvare automat\u0103 a conflictelor.<br \/>\nCompatibilitate cu cloud-ul \u0219i API-uri de extensie eficiente.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">Exemplu<\/h3>\n<p><\/p>\n<p>SymmetricDS poate fi configurat \u00een una dintre cele dou\u0103 variante:<br \/>\nNodul principal (p\u0103rinte) care coordoneaz\u0103 central replicarea datelor \u00eentre dou\u0103 noduri secundare (fii), iar schimbul de date \u00eentre nodurile fiice se realizeaz\u0103 doar prin intermediul p\u0103rintelui.<br \/>\nNodul activ (nodul 1) poate schimba date pentru replicare cu un alt nod activ (nodul 2) f\u0103r\u0103 un intermediar.<\/p>\n<p><\/p>\n<p>\u00cen ambele variante, schimbul de date se face prin Push \u0219i Pull. \u00cen acest exemplu, vom analiza configura\u021bia \u201eactiv-activ\u201d. Este prea lung s\u0103 descriem \u00eentreaga arhitectur\u0103, a\u0219a c\u0103 verifica\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">ghid<\/a><\/noindex>, pentru a afla mai multe despre dispozitivul SymmetricDS.<\/p>\n<p><\/p>\n<p>Instalarea SymmetricDS este foarte simpl\u0103: desc\u0103rca\u021bi versiunea open-source zip a fi\u0219ierului <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">de aici<\/a><\/noindex> \u0219i extrage\u021bi-o unde dori\u021bi. Tabelul de mai jos ofer\u0103 detalii despre loca\u021bia de instalare \u0219i versiunea SymmetricDS \u00een acest exemplu, precum \u0219i versiuni ale bazelor de date, versiuni Linux, adrese IP \u0219i porturi pentru ambele noduri.<\/p>\n<p><\/p>\n<p>Gazd\u0103<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>Versiunea OS<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>Versiunea serverului DB<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>Portul DB<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>Adres\u0103 IP<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>Versiunea SymmetricDS<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>Calea de instalare SymmetricDS<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>Numele nodului SymmetricDS<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>Aici instal\u0103m SymmetricDS \u00een \/usr\/local\/symmetric-server-3.9.20, iar aici vor fi stocate diferite directoare \u0219i fi\u0219iere \u00eencorporate. Ne intereseaz\u0103 directoarele \u00eencorporate samples \u0219i engines. \u00cen directorul samples se afl\u0103 exemple de fi\u0219iere de configurare cu propriet\u0103\u021bi de nod, precum \u0219i exemple de scripturi SQL pentru a \u00eencepe rapid demonstra\u021bia.<\/p>\n<p><\/p>\n<p>\u00cen directorul samples vedem trei fi\u0219iere de configurare cu propriet\u0103\u021bi de nod \u2014 numele arat\u0103 caracterul nodului \u00een cadrul unei scheme anume.<\/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 are toate fi\u0219ierele de configurare necesare pentru o schem\u0103 de baz\u0103 cu 3 noduri (varianta 1), iar acelea\u0219i fi\u0219iere pot fi folosite pentru o schem\u0103 cu 2 noduri (varianta 2). Copiem fi\u0219ierul de configurare necesar din directorul samples \u00een engines pe gazda vm1. A\u0219adar:<\/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>Acest nod \u00een configura\u021bia SymmetricDS se nume\u0219te corp-000, iar conexiunea la baza de date este procesat\u0103 de driverul mysql jdbc, care folose\u0219te \u0219irul de conectare specificat mai sus \u0219i acreditivele de autentificare. Ne conect\u0103m la baza de date replica_db, iar \u00een timpul cre\u0103rii schemei vor fi create tabelele. sync.url arat\u0103 locul de leg\u0103tur\u0103 cu nodul pentru sincronizare.<\/p>\n<p><\/p>\n<p>Nodul 2 de pe gazda vm2 este configurat ca store-001, iar restul este specificat \u00een fi\u0219ierul node.properties, care este prezentat mai jos. Nodul store-001 utilizeaz\u0103 baza de date PostgreSQL, iar pgdb_replica este baza de date pentru replicare. registration.url permite gazdei vm2 s\u0103 contacteze gazda vm1 \u0219i s\u0103 ob\u021bin\u0103 detalii despre configura\u021bie.<\/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>Exemplul complet de SymmetricDS con\u021bine parametrii pentru configurarea replic\u0103rii bidirec\u021bionale \u00eentre dou\u0103 servere de baze de date (dou\u0103 noduri). Pa\u0219ii de mai jos sunt executa\u021bi pe gazda vm1 (corp-000), care va crea un exemplu de schem\u0103 cu 4 tabele. Apoi, executarea comenzii create-sym-tables cu symadmin va crea tabelele de catalog, unde vor fi stocate regulile \u0219i direc\u021bia replic\u0103rii \u00eentre noduri. \u00cen final, vor fi \u00eenc\u0103rcate datele de exemplu \u00een tabele.<\/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>\u00cen exemplu, tabelele item \u0219i item_selling_price sunt configurate automat pentru replicare din corp-000 \u00een store-001, iar tabelele sale (sale_transaction \u0219i sale_return_line_item) sunt configurate automat pentru replicare din store-001 \u00een corp-000. Acum cre\u0103m schema \u00een baza de date PostgreSQL pe gazda vm2 (store-001) pentru a o preg\u0103ti s\u0103 primeasc\u0103 date de la 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>Asigur\u0103-te c\u0103 \u00een baza de date MySQL pe vm1 exist\u0103 exemple de tabele \u0219i tabele de catalog pentru SymmetricDS. Observa\u021bi c\u0103 tabelele de sistem SymmetricDS (cu prefixul sym_) sunt acum disponibile doar pe nodul corp-000, deoarece acolo am executat comanda create-sym-tables \u0219i vom gestiona replicarea. De asemenea, \u00een baza de date de pe nodul store-001 vor fi doar 4 tabele de exemplu f\u0103r\u0103 date.<\/p>\n<p><\/p>\n<p>Totul. Mediu este preg\u0103tit pentru a rula procesele serverului sym pe ambele noduri, a\u0219a cum este prezentat mai jos.<\/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>Jurnalele sunt trimise \u00eentr-un fi\u0219ier de logare \u00een fundal (symmetric.log) \u00een folderul de log-uri din directorul unde este instalat SymmetricDS, precum \u0219i \u00een ie\u0219irea standard. Serverul sym poate fi acum ini\u021biat pe nodul 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>Dac\u0103 se ruleaz\u0103 procesul server sym pe gazda vm2, acesta va crea tabelele directorului SymmetricDS \u0219i \u00een baza de date PostgreSQL. Dac\u0103 se ruleaz\u0103 procesul server sym pe ambele noduri, acestea se vor coordona \u00eentre ele pentru a replica datele de la corp-000 la store-001. Dac\u0103 dup\u0103 c\u00e2teva secunde cerem toate cele 4 tabele de ambele p\u0103r\u021bi, vom vedea c\u0103 replicarea a fost efectuat\u0103 cu succes. Sau putem trimite o \u00eenc\u0103rc\u0103tur\u0103 ini\u021bial\u0103 pe nodul store-001 din corp-000 folosind urm\u0103toarea comand\u0103.<\/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>\u00cen acest moment, o nou\u0103 \u00eenregistrare este inserat\u0103 \u00een tabela item din baza de date MySQL de pe nodul corp-000 (gazd\u0103: vm1), iar replica poate fi verificat\u0103 \u00een baza de date PostgreSQL de pe nodul store-001 (gazd\u0103: vm2). Observ\u0103m opera\u021bia Pull pentru a muta datele din corp-000 \u00een store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; insert into item values ('22000002','Jelly Bean');\nInterogare OK, 1 r\u00e2nd afectat (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 r\u00e2nduri)<\/code><\/pre>\n<p><\/p>\n<p>Pentru a efectua opera\u021bia Push pentru a muta datele din store-001 \u00een corp-000, inser\u0103m o \u00eenregistrare \u00een tabela sale_transaction \u0219i verific\u0103m c\u0103 replicarea a fost efectuat\u0103.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Rezultatul.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Observ\u0103m configurarea reu\u0219it\u0103 a replic\u0103rii bidirec\u021bionale \u00eentre tabelele exemple \u00eentre bazele de date MySQL \u0219i PostgreSQL. Pentru a configura replicarea pentru tabelele noi ale utilizatorilor, efectueaz\u0103 urm\u0103torii pa\u0219i. Cre\u0103m tabela t1 pentru exemplu \u0219i configur\u0103m regulile de replicare astfel. A\u0219adar, configur\u0103m doar replicarea din corp-000 \u00een store-001.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (no integer);\nInterogare OK, 0 r\u00e2nduri afectate (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);\nInterogare OK, 1 r\u00e2nd afectat (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);\nInterogare OK, 1 r\u00e2nd afectat (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);\nInterogare OK, 1 r\u00e2nd afectat (0.01 sec)<\/code><\/pre>\n<p><\/p>\n<p>Apoi, configura\u021bia prime\u0219te o notificare despre schimbarea schemei, adic\u0103 ad\u0103ugarea unei noi tabele, prin comanda symadmin cu argumentul sync-triggers, care recreeaz\u0103 declan\u0219atoarele pentru a se potrivi defini\u021biilor tabelelor. Este executat\u0103 comanda send-schema pentru a trimite modific\u0103rile schemei la nodul store-001, iar replicarea tabelei t1 este configurat\u0103.<\/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\">Avantajele SymmetricDS<\/h3>\n<p><\/p>\n<p>Instalare \u0219i configurare simpl\u0103, inclusiv un set gata de fi\u0219iere cu parametrii pentru crearea schemei cu trei sau dou\u0103 noduri.<br \/>\nInteroperabilitate \u00eentre baze de date \u0219i independen\u021b\u0103 de platform\u0103, incluz\u00e2nd servere, laptopuri \u0219i dispozitive mobile.<br \/>\nReplicarea oric\u0103rei baze de date \u00een orice alt\u0103 baz\u0103 de date local, \u00een WAN sau \u00een cloud.<br \/>\nCapacitatea de a func\u021biona optim cu o pereche de baze de date sau chiar c\u00e2teva mii pentru o replicare convenabil\u0103.<br \/>\nVersiune pl\u0103tit\u0103 cu interfa\u021b\u0103 grafic\u0103 \u0219i suport excelent.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">Dezavantajele SymmetricDS<\/h3>\n<p><\/p>\n<p>Trebuie s\u0103 define\u0219ti manual \u00een linia de comand\u0103 regulile \u0219i direc\u021bia replic\u0103rii prin operatori SQL pentru a \u00eenc\u0103rca tabelele de catalog, ceea ce poate fi incomod.<br \/>\nConfigurarea multor tabele pentru replicare poate fi obositoare, dac\u0103 nu folose\u0219ti scripturi pentru a crea operatori SQL care definesc regulile \u0219i direc\u021bia replic\u0103rii.<br \/>\n\u00cen loguri se adun\u0103 prea multe informa\u021bii, iar uneori trebuie s\u0103 organizezi fi\u0219ierul de log pentru a nu ocupa prea mult spa\u021biu.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Concluzii despre SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS permite configurarea replic\u0103rii bidirec\u021bionale \u00eentre dou\u0103, trei \u0219i chiar c\u00e2teva mii de noduri, pentru a efectua replicarea \u0219i sincronizarea fi\u0219ierelor. Este un instrument unic care automatizeaz\u0103 multe sarcini, de exemplu, recuperarea automat\u0103 a datelor dup\u0103 o perioad\u0103 lung\u0103 de inactivitate a nodului, schimbul de date sigur \u0219i eficient \u00eentre noduri prin HTTPS, gestionarea automat\u0103 a conflictelor pe baza unui set de reguli etc. SymmetricDS efectueaz\u0103 replicarea \u00eentre orice baze de date, a\u0219a c\u0103 poate fi utilizat pentru cele mai diverse scenarii, inclusiv migrare, actualizare de versiune, distribu\u021bie, filtrare \u0219i transformare a datelor pe diferite platforme.<\/p>\n<p><\/p>\n<p>Exemplul a fost creat pe baza documenta\u021biei oficiale <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">ghidului scurt<\/a><\/noindex> pentru SymmetricDS. \u00cen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">manualul utilizatorului<\/a><\/noindex> sunt descrise \u00een detaliu diverse concepte legate de configurarea replic\u0103rii cu ajutorul SymmetricDS.<\/p>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47 Replicarea \u00eencruci\u0219at\u0103 \u00eentre PostgreSQL \u0219i MySQL | ProHoster","description":"Voi vorbi pe scurt despre.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}