Toon posts:

MySQL databases synchroniseren?

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Ik zit met het volgende probleem en hoop dat iemand me verder kan helpen.

Ik draai lokaal binnen een netwerk een webserver en mysql server. Dit netwerk hangt vanwege de kosten niet constant aan het internet (gaat om een netwerk in senegal). Nu kunnen gebruikers lokaal via een werkstation de database uptdaten.

Wanneer men "online" gaat moet dus de database gesynchroniseert worden met een database die remote met een host draait. Bepaalde tabellen moeten gedownload worden, en andere tabellen moeten geupdate worden.

Hoe kan ik dit het beste aanpakken? Ik heb weinig tot geen ervaring met mySQL. Moet ik het met een dump doen van bepaalde tabellen? Kan het met PHP? Zijn er programmaatjes voor? Ik kan me namelijk goed voorstellen dat dit soort dingen al vaker gedaan zijn.

Alle hulp of info is meer dan welkom,

Groeten Tom

  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Als de gebruikers gegevens updaten kan je 2 query's doen, 1 lokaal 1 op internet. Dat werkt.

Maar of dat de makkelijkste manier is weet ik niet.

Verwijderd

Topicstarter
Joost,

Kan je een voorbeeld geven hoe je dat in gedachten had?

Groeten Tom

Verwijderd

Topicstarter
Zou het met replicate kunnen? Kan iemand me daar wat over vertellen?

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 15-09 14:25

Martijn02

/* No Comment */

Op vrijdag 18 januari 2002 14:10 schreef Tommienbp het volgende:
Hallo,
Groeten Tom
Die mag je voortaan weglaten hier hoor, lees de faq maar even, dan snap je wat ik bedoel.

Maareuh met dat probleem zit ik ook een beetje, ik heb een devserver en een productserver, nou zou ik graag op de devserver data van de liveserver willen gebruiken, omdat ik anders altijd met oude data loop te klooien, en sommige data nogal tijdsgebonden is (na 3 dagen heb ik er niks meer aan) Dus voor sommige tabellen wil ik graag recente info hebben. Maar het is niet mogelijk om de liverserver te gebruiken om testdata in weg te schrijven, dus de devserver moet een backup worden van de live server.

Alleen niet alle tabellen mogen gesynchroniseerd worden.

Hoe los je dat mooi op?

  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 14-09 23:09
Op vrijdag 18 januari 2002 14:14 schreef joostbaksteen het volgende:
Als de gebruikers gegevens updaten kan je 2 query's doen, 1 lokaal 1 op internet. Dat werkt.

Maar of dat de makkelijkste manier is weet ik niet.
Dit klopt in ieder geval niet, aangezien je niet altijd op internet kan. Wat misschien wel zou kunnen, is de queries bewaren tot het netwerk weer online gaat, en deze dan uitvoeren, dit duurt natuurlijk wel even. Ik vraag me alleen af of dit de makkelijkste manier is.
Op vrijdag 18 januari 2002 14:44 schreef Tommienbp het volgende:
Zou het met replicate kunnen? Kan iemand me daar wat over vertellen?
Ik denk dat dit handiger zou zijn in dit geval. Ik weet alleen niet of de replication in MySQL berekend is op langere tijden van downtime. Hoe lang zou er eigenlijk tussen de verschillende verbindingen met internet zitten? Het is namelijk zo dat de slave elke 60 seconden opnieuw probeert te verbinden(wel instelbaar natuurlijk). Ik zou in ieder geval beginnen met de manual over replication te lezen.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 14-09 23:09
Op vrijdag 18 januari 2002 16:21 schreef Martijn02 het volgende:

Maareuh met dat probleem zit ik ook een beetje, ik heb een devserver en een productserver, nou zou ik graag op de devserver data van de liveserver willen gebruiken, omdat ik anders altijd met oude data loop te klooien, en sommige data nogal tijdsgebonden is (na 3 dagen heb ik er niks meer aan) Dus voor sommige tabellen wil ik graag recente info hebben. Maar het is niet mogelijk om de liverserver te gebruiken om testdata in weg te schrijven, dus de devserver moet een backup worden van de live server.

Alleen niet alle tabellen mogen gesynchroniseerd worden.

Hoe los je dat mooi op?
Ten eerste: is het echt nodig om constant op nieuwe data te werken? Vaak is een oude set ook gewoon goed op een devserver.

Anders: replication is hier niet echt de goede oplossing, aangezien deze alleen complete databases kan replicaten(in MySQL tenminste, met de replication van andere heb ik geen ervaring). Wat je hierbij zou kunnen doen, is een script schrijven(Python is your friend, of een andere taal die je kent) die(met een cron) elke dag een mysqldump maakt van de liveserver tabellen die je nodig hebt, en die dan importeert in de devserver. Dit is wel niet zo mooi, omdat het nogal lang duurt.
Je zou ook kunnen proberen een script te schrijven dat de verschillen tussen de devserver en de liveserver tabellen analyseert en dan de verschillen synchroniseert, dit is wel moeilijker, maar het zal minder tijd kosten om te synchroniseren.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


Verwijderd

Topicstarter
Dat laatste lijkt mij de mooiste oplossing. Zijn hier voorbeelden van te vinden op internet?

Ik kan me niet voorstellen dat niet iemand al een tooltje voor dit probleem heeft geschreven.

  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Op vrijdag 18 januari 2002 16:52 schreef Taradino het volgende:
Je zou ook kunnen proberen een script te schrijven dat de verschillen tussen de devserver en de liveserver tabellen analyseert en dan de verschillen synchroniseert, dit is wel moeilijker, maar het zal minder tijd kosten om te synchroniseren.
Dit is opzich niet erg moeilijk (denk ik). Je moet al alles wat je in de db gooit een unieke waarde meegeven en een timestamp.

Je select alles uit de ene db en uit de andere.
Je kijkt bij elk id (ervan uitgaande auto-increment) de hoofdwaarde (van een topic dus het bericht, de tekst). Komt dat NIET overeen kijk je naar de unieke waarde. Komt die unieke waarde overeen, is het dus hetzelfde bericht. Dan kijk je naar de timestamp de oudste overschrijf je met de nieuwste.

Stel de unieke code komt NIET overeen, dit betekent een ander bericht, dan zet je het bericht in de database waar hij nog niet in staat. Zo komt dus de unieke code en timestamp ook in de andere db waardoor het dus hetzelfde is.

Nu hoef je dit alleen nog maar te coden, niet super veel werk. Alleen moet je die unieke code en timestamp hebben.

Deze manier is in 5 minuten bedacht en er zijn vast betere manieren.... zonder die extra unieke code, want dat is wel weer allemaal overhead.

  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 14-09 23:09
Dat is op zich wel een goed idee. Ik weet niet natuurlijk niet hoe groot de load is, maar ik denk dat er wel een timestamp bij kan, id heb je meestal wel in een tabel. Een nadeel is wel dat je dan bij elke query de timestamp moet inbouwen. Het is wel onhandig dat je alsnog eerst alle rows over het internet(waarschijnlijk niet al te snel, in Senegal) moet sturen, zodat je net zo goed alles kan dumpen. Het is daarom beter om alleen de rows met de timestamp nieuwer dan de laatste update te gebruiken.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


Verwijderd

Topicstarter
eh...even denken. Het klinkt logisch, maar het lijkt me toch behoorlijk pittig met een database met ongeveer 50 tabellen.

Het project waar ik mee bezig ben is op http://come.to/toubacouta te vinden.

Onder het kopje project staat wat de bedoeling is.

Ik wil nu dus die lui lokaal de dbs laten updaten en zodra er een kostbare verbinding met internet is, moeten de updates (nieuwe producten) doorgevoerd worden in de dbs die op de host staat.

Misschien zijn er andere oplossingen. Het gaat erom dat die lui niet online hoeven om de site te updaten en dat er efficient van de verbinding gebruik gemaakt wordt.

Ik gebruik overigens OSCommerce als webwinkel.
Bedankt voor elke tip.

  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Het is wel onhandig dat je alsnog eerst alle rows over het internet(waarschijnlijk niet al te snel, in Senegal) moet sturen, zodat je net zo goed alles kan dumpen.
Daar heb je gelijk in, tenzij je van 2 plaatsen updates uitvoert. Dan kan je niet meer dumpen, aangezien dan informatie verloren kan gaan.

Zo niet, als er dus maar vanaf 1 plaats geupdate wordt:
Het is daarom beter om alleen de rows met de timestamp nieuwer dan de laatste update te gebruiken.
Pagina: 1