Backup bazy danych

mysql jest na serwerze o nazwie rcp:

stanpol@finan stanpol]$ ssh -l kempny rcp

kempny@rcp's password:

kempny@rcp kempny]$ su -


Codziennie w nocy o 1.00 cron uruchamia skrypt backup_bazy, zapisując jego przebieg w zbiorze /var/log/dumpy.log (dopisuje na końcu):

[root@rcp root]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly


# backup bazy rcp

HOME=/root/backup/biez

MAILTO=""

0 1 * * * root /usr/local/sbin/rcp/backup_bazy >> /var/log/dumpy.log


Skrypt ten wygląda tak:

[root@rcp root]# cat /usr/local/sbin/rcp/backup_bazy

#!/bin/sh

echo "***************************************************"

echo -e "Poczatek archiwizacji rcp `date`"

NAME=backup-file-rcp.`date +%Y.%m.%d`

mysqldump -u root -p123 --opt rcp > /root/backup/$NAME

chmod 400 /root/backup/$NAME

gzip /root/backup/$NAME

cp /root/backup/$NAME.gz /root/backup/biez

cd /root/backup

find . -mtime +14 -name "*.gz" -exec rm -f {} \;

cd /root/backup/biez

ftp alpha.huta

rm -f *

echo -e "Koniec archiwizacji `date`"


Tak zrobiony backup zostaje na lokalnym dysku i jest przesyłany ftp na inny serwer (w innym budynku). Żeby to się zrobiło automatycznie, trzeba utworzyć zbiór .netrc:

[root@rcp biez]# cat .netrc

machine alpha.huta login kopie password Tu_wpisac_haslo

macdef init

prompt

bin

mput *.gz

bye


W zbiorze .netrc jawnym tekstem jest wpisane hasło, dlatego ftp nie skorzysta z niego, jeśli ktokolwiek inny, niż właściciel będzie miał do niego prawo odczytu:

[root@rcp biez]# ls -al

razem 32

drwx--x--x 2 root root 4096 sty 4 01:04 .

drwx--x--x 3 root root 24576 sty 4 01:04 ..

-rw------- 1 root root 85 lis 6 2003 .netrc


Na maszynie, na którą wysyłamy kopię wygląda to tak:

[root@rcp biez]# telnet alpha

Trying 192.168.0.30...

Connected to alpha.


Założony jest użytkownik kopie z hasłem takim, jak w .netrc:

# cat /etc/passwd

root:*:0:1: :/:/bin/sh

nobody:*Nologin:65534:65534:anonymous NFS user:/:

.....

kopie:*:39:15:Do ftp kopii z systemow na Linuxie:/u2/kopie:/bin/sh

....


Żeby nie przepełnić dumpami filesystemu, codziennie o godzinie 3.25 uruchamiany jest skrypt kasuj_stare:

# crontab -l

#

25 3 * * * /usr/users/kempny/kasuj_stare

3,13,23,39,43,53 * * * 0-6 /u/dlc/bin/proserve /u/newpotz/npotz -Mn 1 -n 14 -B 5

0000 -L 8000 > /tmp/errpotw


Skrypt kasuj_stare usuwa z kartoteki z dumpami wszystkie dumpy starsze niż 10 dni:

# cat /usr/users/kempny/kasuj_stare

cd /u2/kopie

find . -mtime +10 -name "*.gz" -exec rm -f {} \;

#


I to wszystko.

Ta baza danych, którą dumpujemy nie ma skomplikowanych powiązań między danymi w różnych tablicach, nie ma niebezpieczeństwa, że dump wykonany podczas zapisu do niej zapamięta ją w niespójnym stanie (kilka kolejnych zapisów do różnych tabel, które wzajemnie od siebie zależą, a dump skopiuje jedną tablice przed zapisem, a inną po zapisie), dlatego nie zamykam bazy przed zrobieniem kopii bezpieczeństwa.

W bardziej skomplikowanych bazach aplikacja musiałaby zadbać o spójność danych, albo trzeba by na czas wykonania mysqldump zamknąć bazę.