Portál AbcLinuxu, 13. května 2024 12:12


Dotaz: synchronizacia databáz

1.1.2012 18:28 adrinko | skóre: 22
synchronizacia databáz
Přečteno: 522×
Odpovědět | Admin
Zdravím všetkých a prajem krásny nový rok 2012! Ako tak nastúpil nový rok, mám jednu databázovú otázku (mysql, postgre...). Chcel by som mať v mojej db mysql na servri tie isté údaje, ako sú v inej db u klienta (len určité tabuľky a stĺpce). Vždy ma z klientovej db zaujíma len niekoľko tabuliek a určité stĺpce, ktoré by som potreboval mať vždy aktuálne aj u mňa na servri. Klientova db nie je voľne prístupná z webu, ale u klienta mi beží moja aplikácia, ktorá by mi mohla vyberať požadované stĺpce a poslať ku mne na server.

Problém je, že vždy potrebujem raz denne zaktualizovať z klientovej databázy (len tie určité dáta) cca 7000 riadkov a na mojom mysql ich porovnať v db a povedzme ak sa niečo zmenilo (dáta v stĺpcoch alebo pribudli riadky) tak by sa to malo v mojej mysql zaktualizovať. Otázkou zostáva, ak bude tých riadkov nie 7tisic ale povedzme 700tisíc, ako to spraviť tak, aby to bolo čo najšetrnejšie k výkonu oboch stojov? (a aby posielané dáta neboli veľmi veľké)

1. Mohol by som spraviť výber od klienta vo forme xml a potom toto xmlko spracoať u mňa a spraviť selecty (či existujúuž dané dáta), update poprípade inserty...ale neni to pri tak veľa dátach zdĺhavé/zbytočné/neefektívne?

2. ďalšia možnosť je nejaký dump, avšak tu by sa to asi skomplikovalo, pretože tie databázy nemajú uplne identickú štruktúru tabuliek (niekde je viac stĺpcov a niekde menej).

3. najlepšie by bolo, len inkrementárne zmeny získať, ale toto žiaľ neviem odsledovať, pretože na to by som musel mať aj časy jednotlivých zmien niekde evidované...no iná aplikácia, ktorá v klientovej db robí zmeny, nezapisuje a neloguje jednotlivé časy zmien, takže neviem selectnuť len tie, ktoré boli zmenené iba v určitom časovom období.

Poradíte mi prosím najvhodnejšiu a najefektívnejšiu cestu, ako dosiahnuť presne to čo potrebujem? veľká vďaka!
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.1.2012 20:08 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: synchronizacia databáz
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejjednodušší mi připadá přidat do zdrojových tabulek sloupec s datem a časem poslední změny a ten aktualizovat pomocí triggerů nebo podobného mechanismu. Pokud můžete do struktury těch tabulek zasáhnout.
1.1.2012 20:42 adrinko | skóre: 22
Rozbalit Rozbalit vše Re: synchronizacia databáz
áno, to by bolo úplne super, no práve toto nemôžem spraviť v tej pôvodnej databáze :/
pavlix avatar 1.1.2012 22:54 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: synchronizacia databáz
Tak udělat select podle času modifikace, pokud to jde... pokud to nejde, tak by mohlo jít spoléhat na rostoucí ID... pokud ani to ne, tak je jakákoli optimalizace problém.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
2.1.2012 01:21 adrinko | skóre: 22
Rozbalit Rozbalit vše Re: synchronizacia databáz
vďaka - Tak udělat select podle času modifikace, pokud to jde - toto ma zaujíma - má napr. postgre, alebo fbd v sebe nejakú "feature" ako zistiť, kedy ktorý riadok bol modifikovaný? (alebo bola pôvodná myšlienka myslená len tak, že by bol nutný ďalší stĺpec, v ktorom by sa automaticky ukladal čas modifikácie?)

ad rastúce ID - to by šlo za predpokladu, že dáta len pribúdajú, no v mojom prípade môžu dáta nielen pribúdať, ale aj už pôvodné updatnúť (takže rastúce ID mi nenapovie, či už predtým dáta iných IDečiek neboli modifikované)

pavlix avatar 2.1.2012 01:39 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: synchronizacia databáz
Může se ti stát, že ta optimalizace fakt rozumně nepůjde.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
2.1.2012 08:13 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: synchronizacia databáz
Pokud do zdrojové databáze nemůžete přidat ani žádný trigger, natož měnit strukturu, tak samozřejmě přenést jen rozdíly nepůjde. Moc ale nechápu, proč se tady ptáte na různé typy databází a zda nemají funkci ukládání data a času modifikace už vestavěnou. Pokud už máte nějakou databázi, do které nesmíte nijak zasahovat, je snad jasné, na jakém databázovém stroji to běží. A ukládání data a času modifikace asi nebude mít vestavěné žádná velká databáze, protože se to dá snadno realizovat pomocí triggerů, navíc si to každý může udělat podle svých potřeb.
Josef Kufner avatar 6.1.2012 11:54 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: synchronizacia databáz
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vždycky můžeš udělat lokálně dump databáze a pak pomocí rsyncu přenést ten. U sebe si ho naimportuješ do pomocné databáze (před importem vždy prázdné) a vytáhneš si data jak potřebuješ. Bude to výpočetně náročnější než dostávat z databáze jen změněná data, ale samotný přenos bude vcelku malý.
Hello world ! Segmentation fault (core dumped)
6.1.2012 12:05 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: synchronizacia databáz
To hodně záleží na tom, jak ten dump bude vypadat – dovedu si snadno představit případ, kdy rsync vůbec nepomůže. Určitě ten dump nemůže být komprimovaný, ale i pro textový dump může dojít k tomu, že společné části budou příliš krátké.
Josef Kufner avatar 6.1.2012 12:18 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: synchronizacia databáz
Předpokládám textový dump, který produkuje například mysqldump (create table + hromada insertů).

Stát se to může, ale pravděpodobně budou změny mezi synchronizacema omezeny jen na relativně malou část řádek a starší data budou nezměněna. A i kdyby ne, v nejhorším případě se to přenese celé tak jako tak. Pokud by to ale byl příliš častý případ, asi by neřešil inkrementální update.
Hello world ! Segmentation fault (core dumped)
6.1.2012 12:41 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: synchronizacia databáz
Záleží i na pořadí řádků v exportu – je v případě dumpu stabilní? V nejhorším případě se to přenese celé plus overhead rsyncu, takže by bylo lepší použít obyčejné scp.
Josef Kufner avatar 6.1.2012 13:23 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: synchronizacia databáz
Dump stabilní bude, protože se provádí pokaždé stejným způsobem. I když databáze nijak nebude garantovat pořadí záznamů a není nijak definované, pořád to pořadí bude pokaždé stejné (pokud data nebyla měněna), protože jinak by se databáze musela postarat o jejich zamíchání. Nové záznamy můžou být na místech po smazaných, databáze může občas udělat defragmentaci (optimize table), ale ve většině případů to bude v pohodě.
Hello world ! Segmentation fault (core dumped)
6.1.2012 13:40 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: synchronizacia databáz
Zamíchání může být vedlejším efektem třeba paralelního zpracování. Jinak podle mne je dost pravděpodobné, že pořadí v dumpu bude víceméně stabilní, spíš jenom upozorňuju na to, že to chce vyzkoušet a nespoléhat jen slepě na to, že „rsync to zařídí“.
12.1.2012 10:43 vratidlo007 | skóre: 21
Rozbalit Rozbalit vše Re: synchronizacia databáz
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co zkusit nejake ETL (CloverETL nebo Kettle)? Kettle treba umoznuje porovnani podle hodnot vybranych poli. Ale na rovinu musim dodat, ze se nejedna o nic jineho, nez ze to precte radek po radku ze zdrojove DB a porovna s cilovou. Ty ktere se shoduji preskoci, ktere jsou modifikovane updatuje a ostatni insertuje. Pokud tam jsou nejake tabulky, co se nemeni, ale jen v case do nich pribyvaji nove zaznamy, pak staci udelat insert ... where x > posledni_zaznam_v_cilove_db. Vyhoda je, ze se takhle daji sync jakekoliv DB, ktere maji JDBC driver.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.