Avatar billede ecpower Nybegynder
18. juli 2008 - 00:35 Der 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?

mvh Karl Henrik
Avatar billede arne_v Ekspert
18. juli 2008 - 01:04 #1
Du kan kun bruge transaktioner med InnoDB tabeller - ikke med MyISAM tabeller.

Hvilken type tabeller bruger du ?
Avatar billede ecpower Nybegynder
18. juli 2008 - 09:07 #2
Tabel typen er InnoDB på all serverne.
Avatar billede arne_v Ekspert
19. juli 2008 - 04:01 #3
Så kan det jo i princippet lade sig gøre.

Kan du få Navicat til at generere og gemme SQL sætninger fremfor at udføre dem ?
Avatar billede ecpower Nybegynder
19. juli 2008 - 10:47 #4
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.

@KH
Avatar billede arne_v Ekspert
20. juli 2008 - 04:28 #5
I princippet er det nemt:

SET AUTOCOMMIT = 0;
START TRANSACTION;
alle de SQL sætninger som skal bundtes
COMMIT;

enten går hele bundtet igennem eller så går ingen igennem.
Avatar billede arne_v Ekspert
20. juli 2008 - 04:29 #6
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.

MySQL understøtter dette.

Men jeg tror at du kan undgå dette.
Avatar billede ecpower Nybegynder
20. juli 2008 - 20:50 #7
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?

@KH
Avatar billede arne_v Ekspert
21. juli 2008 - 01:59 #8
XA of 2PC kræver noget andet software
Avatar billede arne_v Ekspert
21. juli 2008 - 02:04 #9
Men jeg kan ikke se at du har brug for det.

Følgende burde vel være sikkert nok.

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
Avatar billede ecpower Nybegynder
21. juli 2008 - 15:27 #10
Du skriver;
"remote - generate INSERT statements and move to central"

Kan du give et lille eksempel på hvordan sådan en kode ser ud i pkaksis?

@KH
Avatar billede arne_v Ekspert
22. juli 2008 - 04:10 #11
Det var min forståelse at Navicat kunne generere de SQL statements.

19/07-2008 04:01:30
19/07-2008 10:47:33
Avatar billede arne_v Ekspert
25. oktober 2008 - 23:19 #12
Tid at få afsluttet her ?
Avatar billede ecpower Nybegynder
18. november 2008 - 16:15 #13
Vi måtte skrive en applikation til formålet. Lukker @KH
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester