STANPOL
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ę.