Permalänk
Medlem

MySQLbackup per databas

Jag har just nu ett backupskript på min webbserver som varje dag kör ett backup skript som dumpar all information i alla databaser i en MySQL fil. Sql filen kopieras till en mapp på min hårddisk som efter dumpen backupas med rsync med inställningar att bara kopiera filer som ändrat på sig.

Jag skulle vilja ändra så att den dumpar alla databaser eller helst tabeller till separata filer. Jag vill nämligen ha så att jag enkelt skulle kunna återställa en backup för en viss databas på ett enkelt sätt. Nu måste jag ta ut det jag vill återställa ur en 150MB stor SQL fil.

Jag skulle gärna ha per tabell eftersom att ungefär 95% utav databasens storlek ligger i tre stycken statiska tabeller, så backupen skulle ta betydligt mindre plats.

Permalänk

du kan ju använda kommandot
mysqldump -u ANVÄNDARE databas > databasbackup.sql
Tyvärr är det kanske inte det mest smidiga, men det funkar väldigt bra.

Permalänk
Medlem

Ett annat alternativ borde vara att du kopiera hela katalogen med datafilerna för databasen. Ifall du nu har åtkomst till dessa. Sen bara packar du ner det i ett arkiv. I mitt fall blir det /var/lib/mysql.

Permalänk
Medlem

Istället för att du kör en mysqldump på allt som du verkar göra nu så är det bästa att köra en för varje databas. Det innebär inte heller några direkt förändringar i din rutin annat än att istället för en stor fil så får du en för varje db. Att hålla på och kopiera själva databas filen i sig som återfinnes i /var/lib/mysql är ingen bra idé eftersom det kommer vara pain att återställa om du exempelvis får datakrasch och måste installera om allt, medans om du har använt mysqldump så kör du bara "mysql -u user -p databas < databas.sql" för att återställa all information igen.

Permalänk
Medlem

men finns det något sätt att dumpa alla databaser till specifika filer, eller måste jag ställa in det manuellt? Jag vill nämligen göra så att allt sker automatiskt, det kommer inte bara vara jag som kan skapa databaser, alla användare kan skapa databaser med username_%.

Ett alternativ skulle ju vara att kopiera /var/lib/mysql varje natt och köra en mysqldump på hela serven en gång varje eller vartannan vecka.

Permalänk
Medlem

Du kan ju alltid generera och loopa över en lista på databaserna med något liknande

for db in $(echo "show databases;" | mysql -N); do mysqldump -u ${BACKUPUSER} ${DUMPOPTIONS} ${db} | bzip2 -9 >${BACKUPDIR}/${db}_${BACKUPDATE}.sql.bz2 done

Att definiera lämpligt innehåll för variablerna i exemplet ovan lämnar jag som en övning åt läsaren...

Permalänk
Medlem

Jag använder mig av Mysqldumper som dumpar ut en fil per databas. http://www.mysqldumper.net/

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av whzfred
Ett annat alternativ borde vara att du kopiera hela katalogen med datafilerna för databasen. Ifall du nu har åtkomst till dessa. Sen bara packar du ner det i ett arkiv. I mitt fall blir det /var/lib/mysql.

Du måste i så fall tänka på att STOPPA mysql innan du gör detta. Sedan kopiera filerna och starta mysql igen.

Därför använder man mysqldump som sköter lås och sånt själv.

Såhär kan du göra i bash för att dumpa en och en i egna filer.
Är du lite smart så skapar du en backup användare som har SELECT access till dom tabeller du vill backupa.

for table in `mysql -u USERNAME -pPASSWORD -e 'show databases' | egrep -v 'Database'`; do echo "`date +%T` - Dumpar $table" mysqldump -u USERNAME -pPASSWORD --databases $table > /tmp/$table.sql echo "`date +%T` - Packar $table" bzip2 -f /tmp/$table.sql echo "`date +%T` - flyttar $table till /MINBACKUPMAPP/" mv /tmp/$table.sql.bz2 /MINBACUPMAPP/ done

Permalänk
Medlem

Ett dumpscript jag skrev för en oändlighet sen.
http://www.netrogenic.com/public/mysql_backup/

Permalänk
Medlem

Tack för svaren!

Jag tog iXams script, men modifierade det lite, så att det grupperar databaserna i olika mappar, och sen tabellerna i .sql-filer inuti mapparna

#!/bin/sh rm -rf /var/sql mkdir /var/sql cd /var/sql DBS=`/usr/bin/mysql -ubackup -pPASS -e"show databases"` for b in $DBS ; do echo Database $b TAB=`/usr/bin/mysql -ubackup -pPASS -e"show tables from $b"` mkdir $b cd $b for t in $TAB ; do /usr/bin/mysqldump -ubackup -pPASS -e -v -f -q -Q -K $b $t > $t.sql done rm Tables_in_$b.sql cd .. done