18. juli 2008 - 00:35Der er
12 kommentarer og 1 løsning
Konsolidering af data med mysql
Jeg har 6 servere placeret på forskellige landelokationer, som konstant står og opsamler data. Så har jeg købt et værktøj "Navicat" som bl.a. kan overføre data fra remote servere. Det virker næsten godt. Hvis man afbryder forbindelsen mellem serverne midt i en proces får man inkonsistente databaser.
Er der nogen der kan vise mig hvordan man skriver en transaktion, evt blot pr. server, således jeg forstår hvordan man opretter forbindelse til en database på en remote server og sikrer at opgaverne enten bliver ført igennem eller ført tilbage?
Ja - Det fungerer på den måde at man opretter en "Connetion" til en server og gemmer den så den forbliver synlig i det grafiske interface med de databaser der nu måtte være. Herefter kan man under hver database oprette udføre og gemme alle de queries man ønsker. Man kan så gemme en query som et batchjob, og herefter få windows sceduler til at afvikle jobbene hvilket rækker fint til mit behov.
"Datatransfer" er et separat modul i Navicat som simpelthen kan flytte data fra en database til en anden eller fra en server til en anden, blot kræver det at databaserne er ens hvis man hele tiden ønsker at tilføje nye data til den centrale database. Til gængæld kan man ikke i dette modul sætte nogen parametre eller kriterier for hvilke data der skal hentes - den henter alt fra pr tabel.
Så det jeg gør nu er først at køre et job der opdaterer en kolonne "to_copy" på remote tabellen til 1, samt opdaterer et par kolonner med stamdata.
Derefter kører jeg datatransfer jobbet.
Så kører jeg et job der sletter records i remote tabellen som har "to_copy" sat til 1
Til sidst når denne rutine har kørt på alle servere kører jeg et job på den centrale server der sletter evt. rækker der har "to_copy" sat til 0. Metoden er i produktion men som sagt kan den fejle.
Bemærk at det der forudsætter at alle ændringer sker på en enkelt server. Hvis man skal have en transaktion som spanner flere servere skal man have en Transaction Manager og bruge XA transaktioner.
Undgå det lyder interessant og tiltalende - men hvordan? Opgaven er jo netop at flytte data fra et antal "satelit servere" til en central server.
Så har jeg wrapped alle de statements der kører på samme server i transaktioner som du skriver og det virker perfekt. Men jeg har stadig det problem at jeg ikke aner hvordan jeg skal få selve dataoverførslen lagt ind i en query, og derved opnå fuld kontrol over hvad der sker.
Hvis "Datatransfer" svigter, mister jeg data sådan som jeg kører nu, fordi jeg kører 3 separate job, opdatering > datatransfer > sletning. Jeg risikerer altså at slette data på remote serveren selvom de ikke er blevet overført.
Hvis vi snakker transaction manager og XA transaktioner, er det så noget med at man skal skrive en separat applikation eller er det ren SQL?
top1: remote - START TRANSACTION remote - UPDATE / on error ROLLBACK and goto top1 remote - COMMIT top2: remote - generate INSERT statements and move to central / on error goto top2 top3: central - START TRANASCTION central - multi INSERT / on error ROLLBACK and goto top3 central - COMMIT top4: remote - START TRANSACTION remote - DELETE / on error ROLLBACK and goto top4 remote - COMMIT top5: central - START TRANSACTION central - DELETE / on error ROLLBACK and goto top5 central - COMMIT
Vi måtte skrive en applikation til formålet. Lukker @KH
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.