ugrás a tartalomhoz

Szinkronizálás

lalaszesze · 2011. Okt. 23. (V), 15.11
Sziasztok!
Pár hónapja használom a PHP-t. Azt kellene megoldanom, hogy a helyi hálózaton használt adatbázisból (PostgeSql) adatokat tudjak frissíteni a MySql adatbázisba, ami persze webszerveren van. Az a kérdés, ezt hogyan lehetnem automatikusan megoldani, mert semmi kedvem akár naponta többször is scripteket készíteni, és kézzel frissíteni az adatbázisomat.
 
1

kapcsolódás

Poetro · 2011. Okt. 23. (V), 18.06
És tudsz PHP-ból kapcsolódni mindkettőhöz? Mert akkor csinálhatsz egy lekérdezést, ami lekérdezi az adatokat az egyik adatbázisból, és beszúrja azokat egy másik adatbázisba. De természetesen ha nem megy a PHP, akkor megoldhatod bármilyen másik szkriptnyelven, Perl, Pyton stb alatt. Vagy használhatsz bash, awk stb. parancssoros szkript eszközöket, csak a parancssoros alkalmazásokat kell ismerni mindkettő adatbázishoz.
2

Mit nem értek?

H.Z. v2 · 2011. Okt. 23. (V), 19.25
Mivel tőled megszoktam, hogy nem írsz hülyeségeket, feltételezem, én nem látok valamit át a feladványban.
Hogy gondoltad az adatbázisok közti szinkronizációt, parancssori eszközökkel?
A bash-awk-... vonulattal csak olyat tudok elképzelni, hogy textbe ki, onnan valami mysql utility-vel adatbázisba be.
Ez meg nem tűnik optimális eljárásnak.
Én úgy képzelném a megoldást, hogy valami köztes programnyelvből (akát PHP-ből, ha nincs más), ami be tud konnektálni mindkét adatbázisba, szépen átpakolni egyikből a másikba a szükséges adatokat, lehetőleg tempolrális file-ok létrehozása nélkül...
3

Miért?

Poetro · 2011. Okt. 23. (V), 20.00
Miért gondolod, hogy erre képtelen egy bash szkript?
$ mysql ... | awk ... átalakítom a kimenetet | psql ...
Itt nem keletkezett semmilyen átmeneti kimenet, az egyik lekérdezés kimenete átment a másik adatbázisba.

Persze én nem vagyok nagy parancssori mágus, de szerintem a fenti kivitelezhető.
5

Jó, végülis pipe-on keresztül

H.Z. v2 · 2011. Okt. 23. (V), 20.13
Jó, végülis pipe-on keresztül valóban nem keletkezik a hagyományos értelemben vett file, de egy adatbázis szöveges kimenetét kell egy másik adatbázis SQL-jére fordítani, szóval azt a plusz egy lépést közbe kell iktatni.
4

Hogy gondoltad az adatbázisok

kuka · 2011. Okt. 23. (V), 20.01
Hogy gondoltad az adatbázisok közti szinkronizációt, parancssori eszközökkel?
Azért nem világvége az inkompatibilitás köztük. A dolgot pedig könnyíti, hogy ha jól értettem, csak adatokat kell átvinni, a szerkezet megvan. Szerencsés esetben ennyi is működhet:

pg_dump adatbazis -a -d | grep -vE '^(\\|SET )' | mysql -D adatbazis -h szolgaltato_gepe
6

Parancssort automatikusan?

lalaszesze · 2011. Okt. 24. (H), 10.11
Köszönöm a hozzászólást. A pg_dump megoldás tetszik, ki is próbáltam, de nem ez a tökéletes megoldás. A dump adatbázison "kívüli esemény", így, ha az adatbázisba bekerül egy újabb sor, azt még mindig nem tudom ezzel automatikusan egy INSERT paranccsal beírni a MySql táblába. Megoldható, hogy naponta akár többször is lefusson a parancssor, feladatütemezővel akár, de szebb megoldás lenne, ha az INSERT parancs automatikusan futna le.
(A történet egyébként annyi, hogy az ügyfelek beiktatott megrendeléseiről szeretném infót megadni a weben az ügyfeleknek, hogy nyomon követhessék a megrendelés állapotát.) Máshol hogyan oldják ezt meg?
7

Ütemezés

Schmidi · 2011. Okt. 24. (H), 10.34
X percenként fut cronból egy script, ami megnézi hogy van-e releváns változás, és ha van, akkor azt átviszi a másik adatbázisba.

X = feladat és körülményfüggő, hogy mennyire gyors reakcióra van szükség.
1 perc, 5 perc, 10 perc, fél óra, egy óra, fél nap, ahogy jól esik.
10

Crontab

lalaszesze · 2011. Okt. 24. (H), 11.01
Nem gondoltam volna, hogy ez ennyire körülményes. Ez a cron tetszik, már csak egy script megírásában kérném segítségetek, valamit kezdésnek, a többit valahogy már csak megtanulom. (Tudom cron+google 3 170 000 találat.)
8

Máshol hogyan oldják ezt

kuka · 2011. Okt. 24. (H), 10.47
Máshol hogyan oldják ezt meg?
Valami Replication trükkel, vagy 9-től van hozzá Streaming Replication.

Persze az, hogy neked MySQL-be kell átnyomni az adatokat lényegesen szűkíti a lehetőségeket.

Ha azonnali és optimális replikálás kell, én írnék hozzá egy célszerszámot:
  • rule esetleg trigger minden táblára amelynek érdekel a frissülése – ezek egy(-egy) notify-al jelzést sütnek el.
  • Külön program amely listennel figyeli a jelzéseket és a friss adatokat átnyomja MySQL-be.

Megjegyzés, hogy a psql parancssoros kliens illetve egy csomó rutinkönyvtár hiányosan vagy egyáltalán nem kezeli a listen/notify jelzéseket. Konkrétan csak a QtSql-t tudom, hogy tökéletesen kezeli.
9

log

Poetro · 2011. Okt. 24. (H), 10.58
Azt nem tudom, a Postgre hogyan csinálja, de tudom, hogy a MySQL esetén van esetén logolni az INSERT / UPDATE utasításokat egy fájlba, és akkor csak ezt a fájlt kell feldolgozni, és továbbítani a másik adatbázisnak. Ez jelentősen megkönnyíti a felhasználandó kódot, valamint a futtatást.
11

És eszméletlenül lassít,

H.Z. v2 · 2011. Okt. 24. (H), 11.21
És eszméletlenül lassít, mivel emlékeim szerint ez egy debug funkció. (más adatbáziskezelőnél ezt tapasztaltam, ezeknél persze nem tudom, mi a helyzet)

szerk: bár lehet, hogy már megint keverem a szezont a fazonnal és eredendően auditálási céllal lettek kitalálva ezek a dolgok...

---

De már eleve nem értem a kérdezőt: nincs itt valami nagyon elszúrva a tervezésnél? Miért kell kétféle adatbázisba írni? Ráadásul mi lesz a tranzakciókkal? Mi van, ha rollbackelni kell? Azt hogy oldja meg?
Elsőre úgy értettem, hogy egy x időközönként lefutó eljárást akar, ami egyezteti a lokális és a távoli adatbázis tartalmát. De most úgy tűnik, párhuzamosan írná a két adatbázist úgy, hogy ne kelljen a saját, egy adatbázissal dolgozó programját módosítani(???).
12

Két adatbázis

lalaszesze · 2011. Okt. 24. (H), 11.43
A PostgreSqlnél nem tapasztaltam nagy mértékű lassulást az adatbázisban, ha részletesen logol, inkább csak a log fájl nőtt meg.

Nem ragaszkodom két adatbázishoz, de ha nem így, akkor hogyan? A cél, hogy az ügyfél megrendeléseit nyomon követhesse a weben.

Elsőre arra gondoltam, készítek egy ugyan olyan szerkezetű táblát MySql-ben, mint ami PostgreSql-ben van.(Hozzáteszem az adatbázisban nem olyan egyszerüen vannak az adatok, hogy ezt egy táblából kiolvasva teljes mértékben át lehessen tenni MySql-be, ehhez készítek egy táblát (triggerel), melybe beírom az ügyfél adatait, megrendelésének statuszát, és ezt szeretném közzétenni a weben. Ennek a táblának a szerkezete megfelelne a MySql adatbázis tábla szerkezetével. Így tranzakciós problémákkal sem lesz gond.) Ezt a két táblát szeretném, hogy szinkronban legyenek egymással, de ha ez nem jó megoldás, akkor várom a lehetséges ötleteket.
13

Miért MySQL?

Poetro · 2011. Okt. 24. (H), 12.23
Miért kell pont MySQL-ben? Miért nem lehet ott is PostgreSQL, és akkor használhatnád a PostgreSQL replikációs képességeit, és a konfiguráláson kívül nem is kellene semmi mást tenned, a PostgreSQL megoldaná magától. Vagy ha nem akarod az egész központi adatbázist replikálni, akkor csinálhatsz egy második adatbázist, amibe triggerrel beírogatod az adatokat a központiból, majd ezt a másodlagos adatbázist replikálod.
14

De ha már marad Postgre-ben,

Hidvégi Gábor · 2011. Okt. 24. (H), 12.33
De ha már marad Postgre-ben, akkor nem egyszerűbb egy View-t készíteni a replikáció helyett?
15

View

lalaszesze · 2011. Okt. 24. (H), 13.08
A Viewre én is gondoltam, megoldható, az sem gond, hogy a másik adatbázis is PostgreSql legyen, de a másik Webszerveren futó adatbázisba (legyen PostgreSql az egyszerűség kedvéért, nem MySql), hogyan kerül fel az adat? Tehát miként küldjem át az adatokat a localhoston működő PostgreSql-ből a webszerveren futó Postgres-be?
16

A kulcsszó a már említett

Hidvégi Gábor · 2011. Okt. 24. (H), 13.22
A kulcsszó a már említett replikáció, erre keress rá.