Avatar billede krea Praktikant
21. januar 2010 - 22:25 Der er 13 kommentarer og
1 løsning

Backup med mysql samt tømme visse tabller

Jeg har en database kaldet db hvor der er 150 tabeller hvoraf 2 af dem hedder t1 og t2.

Det jeg har brug for er en backup af db med den detalje at t1 og t2 skal være tomme i backup'en (dvs. de skal tømmes for selve data, men selve struktur/index mv. beholdes - øvrige data/struktur i db skal være identisk).
Avatar billede arne_v Ekspert
21. januar 2010 - 22:32 #1
Den nemme loesning er at lave en mysqldump som tager det hele og saa slette alle INSERT saetningerne for de to tabeller i dump filen.
Avatar billede krea Praktikant
21. januar 2010 - 22:39 #2
Problemet er, at det er et batchjob, der skal køre flere gange om dagen.
Avatar billede arne_v Ekspert
21. januar 2010 - 22:46 #3
Saa script sletningen af de INSERT statements i det batchjob.
Avatar billede krea Praktikant
21. januar 2010 - 22:58 #4
Og hvordan gør man så lige det :)
Avatar billede arne_v Ekspert
21. januar 2010 - 23:15 #5
Hvilket styre system?
Avatar billede krea Praktikant
21. januar 2010 - 23:36 #6
Linux Centos
Avatar billede bauerdata Nybegynder
22. januar 2010 - 00:57 #7
mysqldump -u kejd -p kejd | python dump.py > dump.sql

Hvor følgende python script med navnte dump.py anvendes

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
import sys


line = sys.stdin.readline()
ignore = False
while line:
    if "LOCK TABLES" in line:
        l = line.replace("`", "")
        try:
            tname = l.split(" ")[2]
            sys.stderr.write(tname+"\n")
            if tname in ("tb1", "tb2"):
                ignore = True
        except IndexError:
            sys.stderr.write(l)
            pass
    if ignore and "INSERT" in line:
        line = sys.stdin.readline()
        continue
    if "UNLOCK TABLES" in line:
        ignore = False
       
    sys.stdout.write(line)
    line = sys.stdin.readline()
Avatar billede krea Praktikant
22. januar 2010 - 01:23 #8
Hold da op, det kalder jeg sgu et svar :)

Lige inden jeg tester det. For en sikkerheds skyld, hvis serveren bliver fanget i en uendelig løkke eller den "hænger" i jobbet, hvordan går jeg ind og terminerer det, hvis det er?

Normalt plejer det ikke at komme et job id, når man kører mysqldump, man kan lave kill på.
Avatar billede bauerdata Nybegynder
22. januar 2010 - 01:40 #9
Du kan fjerne linier med sys.stderr.write
De er kun for testudskrift
Avatar billede krea Praktikant
22. januar 2010 - 01:54 #10
Skal man ikke angive hvilken database man skal tage backup fra?

Jeg får mysqldump: Got error: 1044: Access denied for user 'xyz'@'%' to database 'kejd'                            when selecting the database

Skal den hedde: mysqldump -u kejd -p databasenavn kejd | python dump.py > dump.sql
Avatar billede krea Praktikant
22. januar 2010 - 02:36 #11
Ok, det var: mysqldump -u bruger -pkodeord dbname | python dump.py > dump.sql

Virker perfekt, takker!
Avatar billede arne_v Ekspert
22. januar 2010 - 03:22 #12
Python er ikke nødvendigt.

mysqldump database | grep -P -v "INSERT INTO (`t1`|`t2`)" > dump.sql
Avatar billede krea Praktikant
23. januar 2010 - 01:33 #13
arne_v lyder godt, men jeg oplever 2 ting jeg ikke gør med det andet script.

1. Jeg kan se dumpet i filezilla, men den siger alligevel at filen ikke eksisterer, jeg kan heller ikke lave mysql på filen - måske noget serverspecifikt hos mig, bare mærkeligt at jeg kan læse bauerdatas dump - samme chmod.

2. kan se at dump.sql fylder det samme som den originale database. Hvis cachetabellerne jeg har udeladt var tømte ville databasen kun fylde det halve som med bauers dump.

mysqldump -u xxx -pxxx xxx | grep -P -v "INSERT INTO (
't1'
|'t2'
)" > dump.sql
Avatar billede arne_v Ekspert
23. januar 2010 - 03:20 #14
Hvis python løsningen virker bedre, så brug den.

Jeg kan dog ihvertfald se en fejl i grep'en - det er venstrehældende dapper ikke lodrette dappe - altså `` ikke ''.
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