{"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\/lv\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","title":{"rendered":"Krustenisk\u0101 replik\u0101cija starp PostgreSQL un MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Krustenisk\u0101 replik\u0101cija starp PostgreSQL un MySQL\" src=\"\/wp-content\/uploads\/2019\/09\/47cf48f9024f406d625ecb6b21020c74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es snieg\u0161u visp\u0101r\u012bgu p\u0101rskatu par krustreplic\u0101ciju starp PostgreSQL un MySQL, k\u0101 ar\u012b par iestat\u012b\u0161anas metod\u0113m krustreplic\u0101cijai starp \u0161\u012bm div\u0101m datub\u0101zu serveriem. Parasti datub\u0101zes krustreplic\u0101cij\u0101 tiek uzskat\u012btas par homog\u0113n\u0101m, un tas ir \u0113rts veids, k\u0101 p\u0101riet no viena rel\u0101ciju DB servera uz citu.<\/p>\n<p><\/p>\n<p>PostgreSQL un MySQL datub\u0101zes tiek uzskat\u012btas par rel\u0101ciju, ta\u010du ar papildu papla\u0161in\u0101jumiem t\u0101s pied\u0101v\u0101 iesp\u0113jas NoSQL. \u0160eit m\u0113s apspried\u012bsim replic\u0113\u0161anu starp PostgreSQL un MySQL, no rel\u0101ciju DB skatupunkta.<\/p>\n<p><\/p>\n<p>M\u0113s nepied\u0101v\u0101sim detaliz\u0113tu iek\u0161\u0113jo inform\u0101ciju, tikai pamata principus, lai j\u016bs ieg\u016btu priek\u0161statu par replic\u0113\u0161anas iestat\u012b\u0161anu starp datub\u0101zu serveriem, priek\u0161roc\u012bb\u0101m, ierobe\u017eojumiem un lieto\u0161anas scen\u0101rijiem.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Parasti replic\u0113\u0161ana starp diviem identiskiem datub\u0101zu serveriem tiek veikta vai nu bin\u0101r\u0101 re\u017e\u012bm\u0101, vai izmantojot vaic\u0101jumus starp vad\u012bbas mezglu (kas ir izdev\u0113js, galvenais vai akt\u012bvais) un sekot\u0101ju (abonents, gaid\u012bt\u0101js vai pas\u012bvais). Replic\u0113\u0161anas m\u0113r\u0137is ir nodro\u0161in\u0101t re\u0101llaika galveno datub\u0101zi sekot\u0101ja pus\u0113. Dati tiek p\u0101rs\u016bt\u012bti no vad\u012bt\u0101ja uz sekot\u0101ju, t\u0101tad no akt\u012bv\u0101 uz pas\u012bvo, jo replic\u0113\u0161ana tiek veikta tikai vien\u0101 virzien\u0101. Tom\u0113r ir iesp\u0113jams iestat\u012bt replic\u0113\u0161anu starp div\u0101m datub\u0101z\u0113m abos virzienos, lai dati tiktu p\u0101rs\u016bt\u012bti no sekot\u0101ja uz vad\u012bt\u0101ju akt\u012bvo-akt\u012bvo konfigur\u0101cij\u0101. Viss tas, tostarp kask\u0101des replic\u0113\u0161ana, ir iesp\u0113jama starp diviem vai vair\u0101kiem identiskiem datub\u0101zu serveriem. Akt\u012bvo-akt\u012bvo vai akt\u012bvu-pas\u012bvo konfigur\u0101cija ir atkar\u012bga no vajadz\u012bb\u0101m, pieejam\u012bbas \u0161\u0101d\u0101m iesp\u0113j\u0101m s\u0101kotn\u0113j\u0101 konfigur\u0101cij\u0101 vai no \u0101r\u0113jo risin\u0101jumu izmanto\u0161anas iestat\u012b\u0161anai un eso\u0161ajiem kompromisiem.<\/p>\n<p><\/p>\n<p>Aprakst\u012bt\u0101 konfigur\u0101cija ir iesp\u0113jama starp da\u017e\u0101diem datub\u0101zu serveriem. Serveri var iestat\u012bt, lai sa\u0146emtu replik\u0113tus datus no cita datub\u0101zu servera, vienlaikus saglab\u0101jot replik\u0113jamo datu re\u0101l\u0101s laika att\u0113lus. MySQL un PostgreSQL pied\u0101v\u0101 liel\u0101ko da\u013cu no \u0161\u012bm konfigur\u0101cij\u0101m pa\u0161i vai ar tre\u0161o pu\u0161u papla\u0161in\u0101jumiem, tostarp bin\u0101r\u0101 \u017eurn\u0101la, diska blo\u0137\u0113\u0161anas un operatoru un rindu b\u0101zes metod\u0113m.<\/p>\n<p><\/p>\n<p>Krusta replik\u0101cija starp MySQL un PostgreSQL ir nepiecie\u0161ama vienreiz\u0113jai migr\u0101cijai no viena datub\u0101zu servera uz citu. \u0160\u012bs datub\u0101zes izmanto at\u0161\u0137ir\u012bgus protokolus, t\u0101p\u0113c t\u0101s nevar tie\u0161i savienot. Lai izveidotu datu apmai\u0146u, varat izmantot \u0101r\u0113ju atv\u0113rt\u0101 koda r\u012bku, piem\u0113ram, pg_chameleon.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-pg_chameleon\">Kas ir pg_chameleon<\/h3>\n<p><\/p>\n<p>pg_chameleon ir replik\u0101cijas sist\u0113ma no MySQL uz PostgreSQL, kas izstr\u0101d\u0101ta Python 3 valod\u0101. Taj\u0101 tiek izmantota atv\u0113rt\u0101 koda bibliot\u0113ka mysql-replication, kas ar\u012b ir uz Python. Rindu att\u0113li tiek izvilkti no MySQL tabul\u0101m un saglab\u0101ti k\u0101 JSONB objekti PostgreSQL datub\u0101z\u0113, p\u0113c tam tos at\u0161ifr\u0113 pl\/pgSQL funkcija un reproduc\u0113 PostgreSQL datub\u0101z\u0113.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-pg_chameleon\">pg_chameleon iesp\u0113jas<\/h3>\n<p><\/p>\n<p>Vair\u0101kas MySQL sh\u0113mas no viena klastera var replik\u0113t vien\u0101 m\u0113r\u0137a PostgreSQL datub\u0101z\u0113 ar konfigur\u0101ciju \"viens pret daudziem\".<br \/>\nS\u0101kotnes un m\u0113r\u0137a sh\u0113mu nosaukumi nedr\u012bkst sakrist.<br \/>\nReplik\u0101cijas datus var izvilkt no MySQL kask\u0101des replik\u0101cijas.<br \/>\nTabulas, kuras nevar replik\u0113t vai kur\u0101m rodas k\u013c\u016bdas, tiek izsl\u0113gtas.<br \/>\nKatru replik\u0101cijas funkciju p\u0101rvalda demoni.<br \/>\nKontrole, izmantojot parametrus un konfigur\u0101cijas failus, kas balst\u012bti uz YAML.<\/p>\n<p><\/p>\n<h3 id=\"primer\">uzbrukumam<\/h3>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS versija<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.5 x86_64<\/p>\n<p><strong>DB servera versija<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>DB ports<\/strong><br \/>\n3306<br \/>\n5433<\/p>\n<p><strong>IP adrese<\/strong><br \/>\n192.168.56.102<br \/>\n192.168.56.106<\/p>\n<p><\/p>\n<p>Pirms uzs\u0101kat, sagatavojiet visus nepiecie\u0161amos komponentus pg_chameleon uzst\u0101d\u012b\u0161anai. \u0160aj\u0101 piem\u0113r\u0101 ir instal\u0113ta Python 3.6.8, kas rada virtu\u0101lo vidi un aktiviz\u0113 to.<\/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>P\u0113c veiksm\u012bgas Python3.6 uzst\u0101d\u012b\u0161anas ir j\u0101izpilda p\u0101r\u0113j\u0101s pras\u012bbas, piem\u0113ram, j\u0101izveido un j\u0101aktiv\u0113 virtu\u0101la vide. Turkl\u0101t pip modulis tiek atjaunin\u0101ts uz jaun\u0101ko versiju un tiek izmantots pg_chameleon uzst\u0101d\u012b\u0161anai. Zem\u0101k nor\u0101d\u012btaj\u0101s komand\u0101s tiek m\u0113r\u0137tiec\u012bgi instal\u0113ta pg_chameleon 2.0.9, lai gan jaun\u0101k\u0101 versija ir 2.0.10. Tas tiek dar\u012bts, lai izvair\u012btos no jaun\u0101m k\u013c\u016bd\u0101m atjaunotaj\u0101 versij\u0101.<\/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>P\u0113c tam m\u0113s izsaucam pg_chameleon (chameleon ir komanda) ar argumentu set_configuration_files, lai aktiviz\u0113tu pg_chameleon un izveidotu noklus\u0113juma konfigur\u0101cijas katalogus un failus.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">(venv) $&gt; chameleon set_configuration_files\nizveido katalogu \/root\/.pg_chameleon\nizveido katalogu \/root\/.pg_chameleon\/configuration\/\nizveido katalogu \/root\/.pg_chameleon\/logs\/\nizveido katalogu \/root\/.pg_chameleon\/pid\/\nkop\u0113 konfigur\u0101cijas piem\u0113ru uz \/root\/.pg_chameleon\/configuration\/\/config-example.yml<\/code><\/pre>\n<p><\/p>\n<p>Tagad m\u0113s veidojam config-example.yml kopiju k\u0101 default.yml, lai t\u0101 k\u013c\u016btu par noklus\u0113juma konfigur\u0101cijas failu. Zem\u0101k ir paraugs konfigur\u0101cijas faila \u0161im piem\u0113ram.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; cat default.yml\n---\n#glob\u0101l\u0101s iestat\u012bjumi\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 \u013cauj lietot\u0101jam p\u0101rdefin\u0113t noklus\u0113juma tipu p\u0101rv\u0113r\u0161anu cit\u0101.\ntype_override:\n  \"tinyint(1)\":\n    override_to: boolean\n    override_tables:\n      - \"*\"\n\n#postgres m\u0113r\u0137a savienojums\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 #izlai\u017e ievades tabul\u0101 delphis_mediterranea.foo\n      delete:\n        - delphis_mediterranea #izlai\u017e dz\u0113\u0161anas oper\u0101cijas sh\u0113m\u0101 delphis_mediterranea\n      update:<\/code><\/pre>\n<p><\/p>\n<p>\u0160\u012b piem\u0113ra konfigur\u0101cijas fails ir paraugs failam ar pg_chameleon, kam ir nelielas izmai\u0146as attiec\u012bb\u0101 pret avota un m\u0113r\u0137a vid\u0113m, un zem\u0101k ir sniegts da\u017e\u0101du konfigur\u0101cijas faila da\u013cu p\u0101rskats.<\/p>\n<p><\/p>\n<p>Konfigur\u0101cijas fail\u0101 default.yml ir glob\u0101lo iestat\u012bjumu da\u013ca, kur\u0101 varat p\u0101rvald\u012bt t\u0101das iestat\u012bjumu lietas k\u0101 blo\u0137\u0113\u0161anas faila atra\u0161an\u0101s vieta, lo\u0123u atra\u0161an\u0101s vieta, lo\u0123u glab\u0101\u0161anas periods utt. T\u0101l\u0101k ir iestat\u012bjumu p\u0101rvieto\u0161anas da\u013ca (type override), kur\u0101 ir nor\u0101d\u012bts noteikumu kopums, k\u0101 p\u0101rdefin\u0113t tipus replik\u0101cijas laik\u0101. Noklus\u0113juma piem\u0113r\u0101 tiek izmantots p\u0101rvieto\u0161anas noteikums, kas p\u0101rv\u0113r\u0161 tinyint(1) par lo\u0123isko v\u0113rt\u012bbu. N\u0101kamaj\u0101 da\u013c\u0101 nor\u0101diet savienojuma deta\u013cas uz m\u0113r\u0137a datu b\u0101zi. M\u016bsu gad\u012bjum\u0101 t\u0101 ir PostgreSQL datu b\u0101ze, ko apz\u012bm\u0113 pg_conn. P\u0113d\u0113j\u0101 da\u013c\u0101 nor\u0101d\u0101m avota datus, proti, avota datu b\u0101zes savienojuma parametrus, avota un m\u0113r\u0137a datu b\u0101zes sh\u0113mas saska\u0146o\u0161anu, tabulas, kuras j\u0101izlai\u017e, gaid\u012b\u0161anas laiku, atmi\u0146u, pakotnes lielumu. Iev\u0113rojiet, ka \u201esources\u201c ir nor\u0101d\u012bts daudzskaitl\u012b, t.i., m\u0113s varam pievienot vair\u0101kas avota datu b\u0101zes vienai m\u0113r\u0137a datu b\u0101zei, lai piel\u0101gotu konfigur\u0101ciju \u201edaudzi uz vienu\u201c.<\/p>\n<p><\/p>\n<p>Datub\u0101ze world_x piem\u0113r\u0101 satur 4 tabulas ar rind\u0101m, kuras MySQL kopiena pied\u0101v\u0101 k\u0101 piem\u0113ru. To var lejupiel\u0101d\u0113t <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/index-other.html\">\u0161eit<\/a><\/noindex>. Piem\u0113ra datub\u0101ze tiek pieg\u0101d\u0101ta k\u0101 tar un saspiests archives ar instrukcij\u0101m rindas izveidei un import\u0113\u0161anai.<\/p>\n<p><\/p>\n<p>MySQL un PostgreSQL datub\u0101z\u0113s tiek izveidots \u012bpa\u0161s lietot\u0101js ar vien\u0101du nosaukumu usr_replica. MySQL vi\u0146am pie\u0161\u0137ir papildu ties\u012bbas las\u012bt visas replik\u0113jamas tabulas.<\/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>PostgreSQL pus\u0113 tiek izveidota datub\u0101ze db_replica, kas pie\u0146ems izmai\u0146as no MySQL datub\u0101zes. Lietot\u0101js usr_replica PostgreSQL autom\u0101tiski tiek iestat\u012bts k\u0101 divu sh\u0113mu pgworld_x un sch_chameleon \u012bpa\u0161nieks, kuras satur attiec\u012bgi faktisk\u0101s replik\u0113t\u0101s tabulas un replik\u0101cijas katalogu tabulas. Autom\u0101tisko konfigur\u0101ciju nodro\u0161ina arguments create_replica_schema, k\u0101 j\u016bs redz\u0113sit zem\u0101k.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';\nCREATE ROLE\npostgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;\nCREATE DATABASE<\/code><\/pre>\n<p><\/p>\n<p>MySQL datub\u0101ze tiek konfigur\u0113ta, mainot da\u017eus parametrus, lai to sagatavotu replik\u0101cijai, k\u0101 par\u0101d\u012bts zem\u0101k. B\u016bs nepiecie\u0161ams restart\u0113t datub\u0101zu serveri, lai izmai\u0146as st\u0101tos sp\u0113k\u0101.<\/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>\u0160obr\u012bd ir svar\u012bgi p\u0101rbaud\u012bt savienojumu ar abiem datub\u0101zu serveriem, lai izpildot komandas pg_chameleon nerad\u012btu probl\u0113mas.<\/p>\n<p><\/p>\n<p>PostgreSQL mezgl\u0101:<\/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>MySQL mezgl\u0101:<\/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>N\u0101kam\u0101s tr\u012bs pg_chameleon (chameleon) komandas sagatavo vidi, pievieno avotu un inicializ\u0113 replik\u0101ciju. Arguments create_replica_schema pg_chameleon izveido noklus\u0113juma sh\u0113mu (sch_chameleon) un replik\u0101cijas sh\u0113mu (pgworld_x) PostgreSQL datub\u0101z\u0113, k\u0101 jau tika min\u0113ts. Arguments add_source pievieno avota datub\u0101zi konfigur\u0101cijai, izlasot konfigur\u0101cijas failu (default.yml), un m\u016bsu gad\u012bjum\u0101 tas ir mysql, bet init_replica inicializ\u0113 konfigur\u0101ciju, balstoties uz parametriem konfigur\u0101cijas fail\u0101.<\/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>\u0160o tr\u012bs komandu izvad\u0113 redzams to veiksm\u012bgas izpildes apliecin\u0101jums. Visas k\u013c\u016bdas vai sintaksiskas k\u013c\u016bdas tiek nor\u0101d\u012btas vienk\u0101r\u0161os un saprotamos zi\u0146ojumos ar ieteikumiem probl\u0113mu nov\u0113r\u0161anai.<\/p>\n<p><\/p>\n<p>Visbeidzot, uzs\u0101ksim replik\u0101ciju, izmantojot start_replica, un sa\u0146emsim zi\u0146ojumu par veiksm\u012bgu izpildi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon start_replica --config default --source mysql \nizvade: Replik\u0101cijas procesa uzs\u0101k\u0161ana avotam mysql<\/code><\/pre>\n<p><\/p>\n<p>Replik\u0101cijas statusu var piepras\u012bt, izmantojot argumentu show_status, bet k\u013c\u016bdas var apskat\u012bt, izmantojot argumentu show_errors.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/iYMdAf0b\">Rezult\u0101ts.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>K\u0101 jau min\u0113j\u0101m, katru replik\u0101cijas funkciju p\u0101rvalda d\u0113moni. Lai tos apskat\u012btu, piepras\u012bsim procesu tabulu ar Linux komandu ps, k\u0101 par\u0101d\u012bts zem\u0101k.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/59GfdvHA\">Rezult\u0101ts.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Replik\u0101cija netiek uzskat\u012bta par iestat\u012btu, l\u012bdz to neesam p\u0101rbaud\u012bju\u0161i re\u0101laj\u0101 laik\u0101, k\u0101 par\u0101d\u012bts zem\u0101k. M\u0113s izveidojam tabulu, ievietojam p\u0101ris ierakstus MySQL datub\u0101z\u0113 un izmantojam argumentu sync_tables, lai atjaunin\u0101tu d\u0113monus un replik\u0113tu tabulu ar ierakstiem PostgreSQL datub\u0101z\u0113.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mysql&gt; create table t1 (n1 int primary key, n2 varchar(10));\nVaic\u0101jums apstiprin\u0101ts, 0 rindu ietekm\u0113ts (0.01 sek)\nmysql&gt; insert into t1 values (1,'one');\nVaic\u0101jums apstiprin\u0101ts, 1 rinda ietekm\u0113ta (0.00 sek)\nmysql&gt; insert into t1 values (2,'two');\nVaic\u0101jums apstiprin\u0101ts, 1 rinda ietekm\u0113ta (0.00 sek)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; chameleon sync_tables --tables world_x.t1 --config default --source mysql\nSync tables process for source mysql started.<\/code><\/pre>\n<p><\/p>\n<p>Lai apstiprin\u0101tu testa rezult\u0101tus, piepras\u0101m tabulu no PostgreSQL datub\u0101zes un izvad\u0101m rindas.<\/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>Ja m\u0113s veicam migr\u0101ciju, \u0161\u012bs komandas pg_chameleon b\u016bs t\u0101s pabeig\u0161ana. Komandas j\u0101izpilda p\u0113c tam, kad m\u0113s esam p\u0101rliecin\u0101ju\u0161ies, ka visas m\u0113r\u0137a tabulu rindas ir replik\u0113tas, un rezult\u0101t\u0101 b\u016bs r\u016bp\u012bgi p\u0101rnesta PostgreSQL datub\u0101ze bez atsauc\u0113m uz s\u0101kotn\u0113jo datub\u0101zi vai replik\u0101cijas sh\u0113mu (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>P\u0113c v\u0113l\u0113\u0161an\u0101s, sekojo\u0161\u0101s komandas var izdz\u0113st ori\u0123in\u0101lo konfigur\u0101ciju un replik\u0101cijas sh\u0113mu.<\/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\">pg_chameleon priek\u0161roc\u012bbas<\/h3>\n<p><\/p>\n<p>Vienk\u0101r\u0161a uzst\u0101d\u012b\u0161ana un konfigur\u0101cija.<br \/>\nUz\u0146\u0113m\u012bgas un saprotamas k\u013c\u016bdu zi\u0146ojumu nov\u0113r\u0161ana un anom\u0101liju noteik\u0161ana.<br \/>\nReplik\u0101cijai var pievienot papildu speci\u0101las tabulas p\u0113c inicializ\u0113\u0161anas, nemainot p\u0101r\u0113jo konfigur\u0101ciju.<br \/>\nIr iesp\u0113jams iestat\u012bt vair\u0101kas avota datu b\u0101zes vienai m\u0113r\u0137a datu b\u0101zei, un tas ir \u013coti \u0113rti, ja apvienojat datus no vienas vai vair\u0101k\u0101m MySQL datu b\u0101z\u0113m vien\u0101 PostgreSQL datu b\u0101z\u0113.<br \/>\nIzv\u0113l\u0113t\u0101s tabulas var nereplic\u0113t.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-pg_chameleon\">pg_chameleon tr\u016bkumi<\/h3>\n<p><\/p>\n<p>Atbalsts ir tikai MySQL 5.5 vai jaun\u0101k\u0101m versij\u0101m k\u0101 avotam un PostgreSQL 9.5 vai jaun\u0101k\u0101m versij\u0101m k\u0101 m\u0113r\u0137a datu b\u0101zei.<br \/>\nKatram tabul\u0101 j\u0101b\u016bt prim\u0101rajam vai unik\u0101lajam atsl\u0113ga, pret\u0113j\u0101 gad\u012bjum\u0101 tabulas tiek inicializ\u0113tas init_replica proces\u0101, bet netiek replik\u0113tas.<br \/>\nVienvirziena replik\u0101cija \u2014 tikai no MySQL uz PostgreSQL. T\u0101d\u0113\u013c t\u0101 ir piem\u0113rota tikai 'akt\u012bv\u0101-pas\u012bv\u0101' sh\u0113mai.<br \/>\nAvots var b\u016bt tikai MySQL datu b\u0101ze, bet PostgreSQL datu b\u0101zes atbalsts k\u0101 avots ir tikai eksperiments ar ierobe\u017eojumiem (uzziniet vair\u0101k <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/configuration_file.html#postgresql-source-type-experimental\">\u0161eit<\/a><\/noindex>)<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-pg_chameleon\">Secin\u0101jumi par pg_chameleon<\/h3>\n<p><\/p>\n<p>Replik\u0101cijas metode pg_chameleon lieliski der MySQL datu b\u0101zes migr\u0113\u0161anai uz PostgreSQL. B\u016btisks tr\u016bkums ir tas, ka replik\u0101cija ir tikai vienvirziena, t\u0101p\u0113c datu speci\u0101listi, visticam\u0101k, nev\u0113l\u0113sies to izmantot nekam citam, k\u0101 tikai migr\u0101cijai. Ta\u010du vienvirziena replik\u0101cijas probl\u0113mu var atrisin\u0101t ar v\u0113l vienu atv\u0113rt\u0101 koda r\u012bku \u2014 SymmetricDS.<\/p>\n<p><\/p>\n<p>S\u012bk\u0101k lasiet ofici\u0101laj\u0101 dokument\u0101cij\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/\">\u0161eit<\/a><\/noindex>. Komandl\u012bnijas rokasgr\u0101matu var atrast <noindex><a rel=\"nofollow\" href=\"https:\/\/pgchameleon.org\/documents\/usage.html#https:\/\/pgchameleon.org\/documents\/usage.html\">\u0161eit<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"obzor-symmetricds\">SymmetricDS p\u0101rskats<\/h3>\n<p><\/p>\n<p>SymmetricDS \u2014 tas ir atv\u0113rt\u0101 koda r\u012bks, kas replik\u0113 jebkuru datu b\u0101zi uz jebkuru citu popul\u0101ru datu b\u0101zi: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird un citas m\u0101ko\u0146a datu b\u0101zes instanc\u0113, piem\u0113ram, Redshift un Azure utt. Pieejam\u0101s funkcijas: datu un failu sinhroniz\u0101cija, vair\u0101ku vado\u0161o datu b\u0101zu replik\u0101cija, filtr\u0113ta sinhroniz\u0101cija, p\u0101rveido\u0161ana un citas. Tas ir Java r\u012bks, un nepiecie\u0161ama standarta JRE vai JDK izdo\u0161ana (versijas 8.0 vai jaun\u0101kas). \u0160eit var re\u0123istr\u0113t datu izmai\u0146as uz trigeriem avota datu b\u0101z\u0113 un nos\u016bt\u012bt tos attiec\u012bgaj\u0101 m\u0113r\u0137a datu b\u0101z\u0113 pakotn\u0113s.<\/p>\n<p><\/p>\n<h3 id=\"vozmozhnosti-symmetricds\">SymmetricDS iesp\u0113jas<\/h3>\n<p><\/p>\n<p>R\u012bks nav atkar\u012bgs no platformas, tas ir, divas vai vair\u0101kas da\u017e\u0101das datu b\u0101zes var apmain\u012bties ar datiem.<br \/>\nRelat\u012bv\u0101s datu b\u0101zes tiek sinhroniz\u0113tas, izmantojot datu izmai\u0146u ierakstus, bet failu sist\u0113mu datu b\u0101zes izmanto failu sinhroniz\u0101ciju.<br \/>\nDivvirzienu replik\u0101cija, izmantojot Push un Pull metodes, pamatojoties uz noteikumu kopu.<br \/>\nDatu p\u0101rs\u016bt\u012b\u0161ana ir iesp\u0113jama aizsarg\u0101t\u0101s un zema caurlaidsp\u0113jas t\u012bklos.<br \/>\nAutom\u0101tiska atjauno\u0161ana, ats\u0101kot mezglu darbu p\u0113c k\u013c\u016bdes, un autom\u0101tiska konfliktu risin\u0101\u0161ana.<br \/>\nSader\u012bba ar m\u0101ko\u0146iem un efekt\u012bvi papla\u0161in\u0101jumi API.<\/p>\n<p><\/p>\n<h3 id=\"primer-1\">uzbrukumam<\/h3>\n<p><\/p>\n<p>SymmetricDS var konfigur\u0113t divos variantos:<br \/>\nVado\u0161ais (vec\u0101ks) mezgls, kas centraliz\u0113ti koordin\u0113 datu replik\u0101ciju starp diviem pak\u0101rtotajiem (b\u0113rnu) mezgliem, un datu apmai\u0146a starp b\u0113rnu mezgliem notiek tikai caur vec\u0101ko.<br \/>\nAkt\u012bvs mezgls (mezgls 1) var apmain\u012bties ar datiem replik\u0101cijai ar citu akt\u012bvo mezglu (mezgls 2) bez starpnieka.<\/p>\n<p><\/p>\n<p>Abos variantos datu apmai\u0146a notiek ar Push un Pull. \u0160aj\u0101 piem\u0113r\u0101 apl\u016bkosim konfigur\u0101ciju \"akt\u012bvs-akt\u012bvs\". Piln\u012bga arhitekt\u016bras aprakst\u012b\u0161ana ir p\u0101r\u0101k gara, t\u0101p\u0113c izp\u0113tiet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.10\/html\/user-guide.html#_architecture\">rokasgr\u0101matu<\/a><\/noindex>, lai uzzin\u0101tu vair\u0101k par SymmetricDS ier\u012bci.<\/p>\n<p><\/p>\n<p>Instal\u0113t SymmetricDS ir \u013coti viegli: lejupiel\u0101d\u0113jiet atv\u0113rt\u0101 koda zip failu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/download\">no \u0161ejienes<\/a><\/noindex> un izvelciet to, kur vien v\u0113laties. Zem\u0101k eso\u0161aj\u0101 tabul\u0101 sniegta inform\u0101cija par instal\u0101cijas vietu un versij\u0101m SymmetricDS \u0161aj\u0101 piem\u0113r\u0101, k\u0101 ar\u012b datu b\u0101zu versijas, Linux versijas, IP adreses un ostas abiem mezgliem.<\/p>\n<p><\/p>\n<p>Host<br \/>\nvm1<br \/>\nvm2<\/p>\n<p><strong>OS versija<\/strong><br \/>\nCentOS Linux 7.6 x86_64<br \/>\nCentOS Linux 7.6 x86_64<\/p>\n<p><strong>DB servera versija<\/strong><br \/>\nMySQL 5.7.26<br \/>\nPostgreSQL 10.5<\/p>\n<p><strong>DB ports<\/strong><br \/>\n3306<br \/>\n5832<\/p>\n<p><strong>IP adrese<\/strong><br \/>\n192.168.1.107<br \/>\n192.168.1.112<\/p>\n<p><strong>SymmetricDS versija<\/strong><br \/>\nSymmetricDS 3.9<br \/>\nSymmetricDS 3.9<\/p>\n<p><strong>SymmetricDS instal\u0101cijas ce\u013c\u0161<\/strong><br \/>\n\/usr\/local\/symmetric-server-3.9.20<br \/>\n\/usr\/local\/symmetric-server-3.9.20<\/p>\n<p><strong>SymmetricDS mezgla nosaukums<\/strong><br \/>\ncorp-000<br \/>\nstore-001<\/p>\n<p><\/p>\n<p>\u0160eit m\u0113s instal\u0113jam SymmetricDS viet\u0101 \/usr\/local\/symmetric-server-3.9.20, un \u0161eit tiks glab\u0101ti da\u017e\u0101di apak\u0161direktoriji un faili. M\u016bs interes\u0113 apak\u0161direktoriji samples un engines. Direkt\u012bva samples satur konfidenci\u0101lo failu piem\u0113rus ar mezga \u012bpa\u0161\u012bb\u0101m, k\u0101 ar\u012b SQL skriptu piem\u0113rus \u0101trai demonstr\u0101cijas uzs\u0101k\u0161anai.<\/p>\n<p><\/p>\n<p>Direktorij\u0101 samples redzam tr\u012bs konfidenci\u0101lo failu piem\u0113rus ar mezga \u012bpa\u0161\u012bb\u0101m \u2014 nosaukums nor\u0101da uz mezga raksturu noteikt\u0101 sh\u0113m\u0101.<\/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 ir visi nepiecie\u0161amie konfigur\u0101cijas faili pamata sh\u0113mai ar 3 mezgliem (variants 1), un tos pa\u0161us failus var izmantot 2 mezglu sh\u0113m\u0101 (variants 2). Nokop\u0113jam nepiecie\u0161amo konfigur\u0101cijas failu no samples direktorijas uz engines viet\u0101 vm1. Tas izskat\u0101s \u0161\u0101di:<\/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>\u0160is mezgls SymmetricDS konfigur\u0101cij\u0101 tiek d\u0113v\u0113ts par corp-000, un piesl\u0113g\u0161anos datu b\u0101zei apstr\u0101d\u0101 mysql jdbc draiveris, kas izmanto iepriek\u0161 nor\u0101d\u012bto savienojuma virkni un piesl\u0113g\u0161an\u0101s akredit\u012bvus. M\u0113s piesl\u0113dzamies datu b\u0101zei replica_db, un, veidojot sh\u0113mu, tiks izveidotas tabulas. sync.url nor\u0101da saiti uz mezglu sinhroniz\u0101cijai.<\/p>\n<p><\/p>\n<p>Mezgls 2 uz vm2 hosta tiek konfigur\u0113ts k\u0101 store-001, bet p\u0101r\u0113jais ir nor\u0101d\u012bts node.properties fail\u0101, kur\u0161 ir dots zem\u0101k. Mezgls store-001 izmanto PostgreSQL datu b\u0101zi, bet pgdb_replica ir datu b\u0101ze replik\u0101cijai. registration.url \u013cauj vm2 hostam sazin\u0101ties ar vm1 hostu un ieg\u016bt no t\u0101 konfigur\u0101cijas deta\u013cas.<\/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>Gatavais SymmetricDS piem\u0113rs satur parametrus, lai konfigur\u0113tu divvirzienu replik\u0101ciju starp div\u0101m datu b\u0101zu serveriem (diviem mezgliem). Zem\u0101k nor\u0101d\u012btie so\u013ci tiek veikti uz vm1 hosta (corp-000), kas izveidos sh\u0113mas piem\u0113ru ar 4 tabul\u0101m. P\u0113c tam komandai create-sym-tables, ko izpilda symadmin, tiek izveidotas katalogu tabulas, kur tiks glab\u0101tas noteikumi un replik\u0101cijas virziens starp mezgliem. Visbeidzot, tabul\u0101s tiek iel\u0101d\u0113ti piem\u0113ra dati.<\/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>Piem\u0113r\u0101 tabulas item un item_selling_price autom\u0101tiski iestat\u012btas replik\u0101cijai no corp-000 uz store-001, bet tabulas sale (sale_transaction un sale_return_line_item) autom\u0101tiski iestat\u012btas replik\u0101cijai no store-001 uz corp-000. Tagad izveidojam sh\u0113mu PostgreSQL datu b\u0101z\u0113 uz vm2 (store-001), lai sagatavotu to datu pie\u0146em\u0161anai no 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>Oblig\u0101ti j\u0101p\u0101rbauda, ka MySQL datu b\u0101z\u0113 uz vm1 ir piem\u0113ru tabulas un SymmetricDS katalogu tabulas. \u0145emiet v\u0113r\u0101, ka SymmetricDS sist\u0113mas tabulas (ar prefiksu sym_) \u0161obr\u012bd ir pieejamas tikai mezgl\u0101 corp-000, jo tur m\u0113s izpild\u012bj\u0101m komandu create-sym-tables un p\u0101rvald\u012bsim replik\u0101ciju. Turkl\u0101t datu b\u0101z\u0113 uz mezglu store-001 b\u016bs tikai 4 piem\u0113ru tabulas bez datiem.<\/p>\n<p><\/p>\n<p>Viss. Vide ir gatava servera procesus sym uz abiem mezgliem, k\u0101 nor\u0101d\u012bts zem\u0101k.<\/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>Re\u0123istr\u0101cijas ieraksti tiek nos\u016bt\u012bti uz fon\u0101l\u0101 \u017eurn\u0101la failu (symmetric.log) \u017eurn\u0101la map\u0113 katalog\u0101, kur ir instal\u0113ts SymmetricDS, k\u0101 ar\u012b standarta izejas datos. Serveri sym tagad var uzs\u0101kt mezgl\u0101 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>Ja servera process sym tiek palaists mezgl\u0101 vm2, tas izveidos SymmetricDS katalogu tabulas ar\u012b PostgreSQL datub\u0101z\u0113. Ja servera process sym tiek palaists abos mezglos, tie koordin\u0113s savus darbus, lai replik\u0113tu datus no corp-000 uz store-001. Ja p\u0113c da\u017e\u0101m sekund\u0113m m\u0113s piepras\u012bsim visas 4 tabulas abos galos, m\u0113s redz\u0113sim, ka replik\u0101cija ir veiksm\u012bgi pabeigta. Vai ar\u012b var nos\u016bt\u012bt s\u0101kotn\u0113jo iel\u0101dei uz mezglu store-001 no corp-000 ar n\u0101kamo komandu.<\/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>\u0160aj\u0101 posm\u0101 tabul\u0101 item datub\u0101z\u0113 MySQL mezgl\u0101 corp-000 (hosts: vm1) tiek pievienots jauns ieraksts, un to var p\u0101rbaud\u012bt t\u0101s replik\u0101cij\u0101 PostgreSQL datub\u0101z\u0113 mezgl\u0101 store-001 (hosts: vm2). M\u0113s redzam Pull oper\u0101ciju, lai p\u0101rvietotu datus no corp-000 uz 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>Lai veiktu Push oper\u0101ciju, lai p\u0101rvietotu datus no store-001 uz corp-000, pievienojam ierakstu tabul\u0101 sale_transaction un p\u0101rbaud\u0101m, vai replik\u0101cija ir veikta.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xpaste.pro\/p\/B23cJ4sP\">Rezult\u0101ts.<\/a><\/noindex><\/p>\n<p><\/p>\n<p>M\u0113s redzam veiksm\u012bgu divvirzienu replik\u0101ciju tabul\u0101m starp MySQL un PostgreSQL datub\u0101z\u0113m. Lai iestat\u012btu replik\u0101ciju jaun\u0101m lietot\u0101ju tabul\u0101m, veicam \u0161\u0101das darb\u012bbas. Izveidojam tabulu t1 piem\u0113ram un konfigur\u0113jam t\u0101s replik\u0101cijas noteikumus \u0161\u0101d\u0101 veid\u0101. M\u0113s \u0161\u0101di konfigur\u0113jam tikai replik\u0101ciju no corp-000 uz 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>P\u0113c tam konfigur\u0101cija sa\u0146em zi\u0146ojumu par sh\u0113mas izmai\u0146\u0101m, proti, jaunas tabulas pievieno\u0161anu, izmantojot komandu symadmin ar argumentu sync-triggers, kas atjauno izsist\u012bjus, lai saska\u0146otu tabulu defin\u012bcijas. Tiek veikta send-schema, lai nos\u016bt\u012btu sh\u0113mas izmai\u0146as mezglam store-001, un tabulas t1 replik\u0101cija ir iestat\u012bta.<\/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\">SymmetricDS priek\u0161roc\u012bbas<\/h3>\n<p><\/p>\n<p>Vienk\u0101r\u0161a uzst\u0101d\u012b\u0161ana un konfigur\u0101cija, tostarp gatavs konfigur\u0101cijas failu kopums sh\u0113mas izveidei ar trim vai diviem mezgliem.<br \/>\nKrusta platformas datub\u0101zu un platformas neatkar\u012bba, tostarp serveri, kl\u0113pjdatori un mobil\u0101s ier\u012bces.<br \/>\nJebkuras datub\u0101zes replik\u0101cija uz jebkuru citu datub\u0101zi viet\u0113j\u0101, WAN vai m\u0101ko\u0146u vid\u0113.<br \/>\nOptimiz\u0113ta darb\u012bba ar divu datub\u0101zu p\u0101ri vai vair\u0101kiem t\u016bksto\u0161iem \u0113rtai replik\u0101cijai.<br \/>\nMaksas versija ar grafisko saskarni un lielisku atbalstu.<\/p>\n<p><\/p>\n<h3 id=\"nedostatki-symmetricds\">SymmetricDS tr\u016bkumi<\/h3>\n<p><\/p>\n<p>J\u0101defin\u0113 manu\u0101li komandrind\u0101 replik\u0101cijas noteikumi un virziens, izmantojot SQL operatorus katalogu tabulu iel\u0101dei, kas da\u017ereiz ir ne\u0113rti.<br \/>\nDaudz tabulu konfigur\u0113\u0161ana replik\u0101cijai var b\u016bt nogurdino\u0161a, ja netiek izmantoti skripti SQL operatoru veido\u0161anai, kas nosaka replik\u0101cijas noteikumus un virzienu.<br \/>\nLogos tiek ierakst\u012bta p\u0101r\u0101k liela inform\u0101cijas apjoms, un da\u017ereiz ir j\u0101k\u0101rt to, lai logs neaiz\u0146emtu p\u0101r\u0101k daudz vietas.<\/p>\n<p><\/p>\n<h3 id=\"itogi-po-symmetricds\">Secin\u0101jumi par SymmetricDS<\/h3>\n<p><\/p>\n<p>SymmetricDS \u013cauj iestat\u012bt divvirzienu replik\u0101ciju starp diviem, trim un pat vair\u0101kiem t\u016bksto\u0161iem mezglu, lai veiktu replik\u0101ciju un sinhroniz\u0113tu failus. Tas ir unik\u0101ls r\u012bks, kas pats veic daudzas darb\u012bbas, piem\u0113ram, autom\u0101tisku datu atjauno\u0161anu p\u0113c ilgsto\u0161as d\u012bkst\u0101ves mezgl\u0101, dro\u0161u un efekt\u012bvu datu apmai\u0146u starp mezgliem pa HTTPS, autom\u0101tisku konfliktu p\u0101rvald\u012bbu, pamatojoties uz noteikumu kopumu utt. SymmetricDS veic replik\u0101ciju starp jebkur\u0101m datub\u0101z\u0113m, t\u0101p\u0113c to var izmantot visda\u017e\u0101d\u0101kajiem scen\u0101rijiem, tostarp migr\u0101cijai, p\u0101rejai uz jaunu versiju, izplat\u012b\u0161anai, filtr\u0113\u0161anai un datu p\u0101rveido\u0161anai da\u017e\u0101d\u0101s platform\u0101s.<\/p>\n<p><\/p>\n<p>Piem\u0113rs izveidots, pamatojoties uz ofici\u0101lo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/tutorials.html\">\u012bso rokasgr\u0101matu<\/a><\/noindex> par SymmetricDS. Taj\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.symmetricds.org\/doc\/3.9\/html\/user-guide.html\">lietot\u0101ja rokasgr\u0101mat\u0101<\/a><\/noindex> s\u012bki aprakst\u012bti da\u017e\u0101di j\u0113dzieni, kas saist\u012bti ar replik\u0101cijas iestat\u012b\u0161anu, izmantojot SymmetricDS.<\/p>\n<p>Avots: <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\/lv\/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=\"lv_LV\" \/>\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\/lv\/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\udd47Krusto\u0161a replik\u0101cija starp PostgreSQL un MySQL | ProHoster","description":"Es visp\u0101r\u012bgi past\u0101st\u012b\u0161u par.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/perekrestnaya-replikatsiya-mezhdu-postgresql-i-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/38146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=38146"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/38146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/28635"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=38146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=38146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=38146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}