Avatar billede Swift Praktikant
19. november 2002 - 10:21 Der er 12 kommentarer og
4 løsninger

Backup uden database-brugere forstyrres - HVORDAN ???

Jeg har en MySQL database på 2GB jeg meget gerne vil have lavet backup af.
Det tager ca. 300 sekunder at lave backupen.
Men databasen får nye data lagt ind hver 10. sekund - DØGNET RUNDT!
Og med fx. mysqlhotcopy bliver de aktuelle tabeller låst så de database opdateringer der gerne skulle ske hver 10. sekund - bliver sat i kø. Og det er MEGET uheldigt, fordi det forsinker alle de øvrige systemer!

Hvordan får jeg lavet en backup der IKKE forstyrre de andre SQL opgaver ??

FreeBDS: 4.7
MySQL: 3.23.53
Avatar billede flse Nybegynder
19. november 2002 - 10:29 #1
Du kan evt. lave en replikering af databasen, og så lave en backup af kopi-databasen (selvom den i sig selv er en backup).

Det kræver dog at du har ekstra 2GB plads :-)
Avatar billede disky Nybegynder
19. november 2002 - 10:30 #2
Jeg bruger med success dette script:

mysqldump -A --user=root --password=PASSWORD > /root/sqldump.sql
cd /root
zip /root/sqldump.zip sqldump.sql > /dev/null
rm -f /root/sqldump.sql

Det dumper alle databaser og zip'er filen.
Avatar billede Swift Praktikant
19. november 2002 - 11:26 #3
Øv, bøv - databasen låser stadig alle andre SQL kommandoer i mellemtiden!!
Det kan jeg ikke bruge til noget!
Avatar billede disky Nybegynder
19. november 2002 - 12:26 #4
Hmmm.

Okay så skal du lave en backup database der er 100% magen til den første rent configurations mæssigt, når du så vil lave et backup sørger du rent programmeringsmæssigt for at du begynder at lægge data over i backupbasen.
Derefter laver du et backup af den rigtige base, via mit script. Når du er færdig kobler du tilbage på den rigtige base, og merger data fra backupbasen.
Avatar billede Swift Praktikant
19. november 2002 - 12:34 #5
Nej, backupen behøber ikke være 100% magen til.
Hvis der mangler de sidste 5 minutters data der er kommet ind samtidig med at jeg laver backupen - det gør ikke noget.

Men det store problem er at der hver 10. sekund kommer data ind som SKAL afleveres i databasen!

Er der ikke nogle bedre ideer ??
Avatar billede disky Nybegynder
19. november 2002 - 12:37 #6
Så skift base som jeg lige foreslog, men drop merge af baserne bagefter.

Jeg grubler lidt over om der findes andre måder at gøre det på.
Avatar billede arne_v Ekspert
19. november 2002 - 13:43 #7
Det er en yderst vanskelig opgave.

Af indlysende årsager kan man ikke umiddelbart
lave backup af en database mens den bliver opdateret,
fordi man vil få en inkonsistent backup.

For at du overhovedet kan lave en konsistent
backup kræver det at du har et tidspunkt T, hvor
der ikke er udestående transaktioner.

Men hvis jeg forstå dig korrekt, så har du
et vindue på 10 sekunder minus den tid det
tager at at indsætte data.

Der er high-end databaser som kan fryse
alle data-pages  på et sekund og så putte alle
rettelser i nye data-pages, mens backup kører.
Det tvivler jeg på at MySQL kan.

Der er log-baserede fil-systemer altid skriver en
ny disk blok i.s.f. at opdatere en gammel og derfor
kan gøre det. Men næppe heller en option.

Så kan du bruge database replikering til at have en
kopi standby og du skifter så over til kopien i vinduet
på 10 sekunder. Jeg mener bestemt at MySQL kan lave
replikering, men jeg ved ikke hvor godt det virker
(specielt når den første skal bringes tilbage efter
backuppen er færdig).

Nu skrev du "data ind som SKAL afleveres". Betyder det
at det er en ren INSERT uafhængig af eksisterende
data i databasen ?

Hvis ja, så kan du lave en simpel "store and forward".
I 10 sekunders vinduet skifter du til at begynde at
gemme de nye INSERT's. Du kan enten gemme data i en
tabel magen til de rigtige tabeller eller bare gemme
SQL sætningerne. Når så du er færdig med backup
henter du de ekstra data. Enten ved at hente data
fra en tabel til en anden tabel eller ved at applye
SQL sætninger.
Avatar billede disky Nybegynder
19. november 2002 - 13:54 #8
Arne sagt på en anden måde, foreslår du det samme som jeg gjorde.


swift:
Du siger det ikke gør noget om man mister data lidt, hvorfor så ikke bare lade være med at gemme data i den tid et dump af basen tager ?
Avatar billede arne_v Ekspert
19. november 2002 - 15:20 #9
disky>

1) Du kan godt opfatte det jeg skrev som det samme som
  dit forslag. Jeg synes at der er nogle ekstra
  relevante betragtninger.

2) Jeg kan ikke se, hvor han siger at det er OK
  konsekvent at miste data ved backup. Han siger
  at det gør ikke noget om de sidste 5 minutter
  ikke er på backup (=> mister kun data hvis
  det går galt og han får brug for backup).
Avatar billede Swift Praktikant
19. november 2002 - 16:31 #10
Ang. at miste data:
Jeg vil selvfølgelig helst ikke miste data. Men hvis de data der kommer ind samtidig med backupen først kommer med næste gang der køres backup gør det ikke noget. På den måde mister jeg kun det data der "skulle være gemt" mellem Tbackupstart og Tbackupfærdig.
Så den har Arne gennemskuet!

Ang. div. andre ting:
- Det er ikke almindelige INSERT operatoner - men en "LOAD DATA LOCAL INFILE".
- Der foretages samtidig med indsættelses operationerne hvert 60. sekund mindst et SELECT kald til samme Tabel.
- De omtalte data der bliver indsat hver 10. sekund - er kun en start. Når jeg kommer længere med projektet er der ca. 50 klienter der "IKKE NØDVENDIGVIS SAMTIDIG" sender data hver 10. sekund.

Det kan godt være at den nemmeste løsning er at få klienterne til at arbejde korrekt med tråde så at SQL indsættelsen IKKE får hele programmet til at gå i stå...?

En anden ting - kan replikering laves på 1 PC med FreeBSD - eller skal der flere maskiner til ?
Og hvad så når den ene maskine er færdig med backupen og er 2-3 minutter bagefter - synkroniserer maskinerne selv op til hinanden ?
Og hvem styrer synkroniseringen - er det MASTER der kontakter SLAVE - eller omvendt.
Og vil mine "LOAD DATA LOCAL INFILE" indsættelser blive konverteret til almindelige INSERT operationer - mellem MASTER og SERVER - for så tror jeg at begge servere går i knæ. Det er trods alt ca. 1200 records pr. sekund.
Avatar billede arne_v Ekspert
19. november 2002 - 16:55 #11
Jeg kender ikke LOAD DATA LOCAL FILE, men det må
svare til N x INSERT, så det er OK.

SELECT er readonly. Det bekymrer vi os ikke om.
Og iøvrigt er 60 sekunder > 10 sekunder. No problem.

50 klienter som opdaterer hver 10. sekund usynkroniseret
er et mega problem. Fordi i worst case så vil der
ikke være noget vindue uden outstanding transactions.

Og så nytter alle de billige løsninger ikke. Hvis du har
en 5-10 millioner som du ikek ved hvad du skal bruge til,
så har IBM eller oracle sikkert en løsning.

:-)
Avatar billede arne_v Ekspert
19. november 2002 - 16:59 #12
Om du kan replikere mellem to databaser på samme
server ? Ved jeg ikke - men check i MySQL dokumentation -
det bør fremgå klart og tydeligt.

Jeg ved ikke hvordan MySQL laver replikering. Igen
tror jeg du må studere dokumentationen.

1200 TPS er 72000 TPM. Det er ret meget. Men hvis
en server kan klare det alene, så tror jeg også den
kan klare at replikere til en magen til. Det bør
ike være specielt dyrt at replikere. Flaskehalsen
ved replikation er ofte net-båndbredden mellem
systemerne.
Avatar billede JoeX2 Praktikant
19. november 2002 - 17:27 #13
Ønsker du at lave backup for at gemme historiske data, eller kun for sikkerhed ved nedbrud?

Hvis det er for at undgå nedbrud vil jeg anbefale software RAID løsning til spejling af diske, men dette er nok ubruglig, hvis du også vil have historiske data gemt.

Hvis du også vil have historiske data gemt, kan du programmere dig fra det, ved at kopiere alle data før de slettes/overskrives til en anden tabel måske i en anden database.
Avatar billede jesperhaun Nybegynder
20. november 2002 - 14:37 #14
Hvad med en slags manuel replikering? Start med at have en kopi af databasen på en anden computer eller på samme. I løbet af dagen bliver kopien forældet, men det gør ikke noget.

En gang i døgnet flusher du transaktionsloggen. Du skal altså køre med log-update eller log-bin.

Så tager du den gamle transaktionslog og kører den på kopi-databasen. Derefter tager du backup af kopi-databasen. Den gamle transaktionslog kan så slettes.

Det kan laves ret simpelt i scripts.

Så kan databasen køre videre hele tiden. Flush låser ikke noget som helst.
Avatar billede iqzero Nybegynder
22. november 2002 - 03:09 #15
Jeg skulle nu meget stærkt mene at disky har ret i sit første svar.. Den eneste grund til at inserts skulle blive forsinket skulle være rent load-mæssigt, men så må du jo køre mysqldump med lav prioritet. Uden --add-locks vil inserts stadig blive gennemført real-time og være tilgængelige i queries.
Avatar billede iqzero Nybegynder
22. november 2002 - 16:49 #16
Tjek evt. om din my.cnf påbyder table-locking.
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