Regulāri datubāzes backupi ir absolūts "must have" ikvienam sevi cienošam web projektam. Šeit pastāstīšu par metodēm kā tos veidot uz Linux servera.
1. mysqldump
Pirmais un vienkāršākais veids kā izveidot datubāzes backupu ir lietojot mysqldump komandrindas rīku. Ar tā palīdzību tiek izveidots sql fails kas satur visus datubāzē esošos datus un to vēlāk importējot citā serverī vai pēc jaunas datubāzes izveides, tas uztaisa pa vienai tabulai un insert'o tajās datus.
mysqldump ir ļoti vienkāršs un labs rīks datubāzēm ar nelielām tabulām (daži desmiti vai varbūt simti megabaitu) vai tabulām, kurās netiek visu laiku veikti ieraksti. Diemžēl tas darbojoties locko tabulas, līdz ar to ja vajag veidot backupu lielākām datubāzēm, ar tabulām miljonos ierakstu un gigabaitu izmērā, šis rīks nederēs.
Par mysqldump izmantošanu lai eksportētu datus un pēc tam to importēšanu datubāzē es jau esmu rakstījis.
Tāpēc uzreiz neliels skripts lai to darītu automātiski:
#!/bin/sh
#dodas uz mapi kur glabājas backupi, izveido ja neeksistē
mkdir -p /root/backup-mysql && cd /root/backup-mysql
#izveido un saspiež backupu
mysqldump -uLIETOTAJS -pPAROLE DATUBĀZE | gzip > $(date +%y%m%d%H)-backup.sql.gz
#izdzēš backupus kas vecāki par 3 dienām
find . -name '*.sql.gz' -mtime +3 -delete
Saglabājam piemēram kā /root/mysql.sh (šajā gadījumā izvēlējos /root un root lietotāju, lai citiem šie faili nebūtu pieejami un arī lietotājs kuram šie backupi pieder nevarētu tos tīši vai netīši nodzēst).
Failu jāpadara izpildāmu:
sudo chmod +x /root/mysql.sh
Un beidzamais solis, jāuzliek lai to regulāri izsauktu cron.
sudo nano /etc/crontab
Un pievienojam rindu
30 4 * * * root /root/mysql.sh
Tas izpildīs skriptu katru nakti 04:30
Jāizvēlas tāds laiks, kad datubāzi iezmanti iespējami mazāk lietotāju, jo tas rada noslodzi un lock'o tabulas.
2. mysql datu mapes kopēšana
Otra metode, kas ļauj backupu lielākām datubāzēm izveidot un atjaunot ļoti ātri, ir veidot kopiju mapei, kurā glabājas mysql dati un informācija par tabulām. Šis variants derēs tad, ja uz servera ir viena datubāze vai tās vajag atjaunot kopā.
Pēc noklusējuma mysql dati uz debian/ubuntu servera glabājas /var/lib/mysql
Nokopējot visu šo mapi var pēc tam ātri atjaunot visu kas bijis mysql serverī, tai skaitā lietotājus un tiesības.
Kā veidot mapes backupu es jau esmu rakstījis.
Diemžēl lai droši kopētu datus mysql serverim ir jābūt izslēgtam. Līdz ar to šī metode ir noderīga lai ātri migrētu mysql no viena servera uz otru, bet kā regulāru backupu metodi es to neieteiktu. Pats gan kādu laiku esmu izmantojis to kopējot datus un neslēdzot ārā serveri - problēmu nav bijis, bet ja nepareizajā brīdī kaut kas tiek rakstīts, var arī nepaveikties.
3. percona xtrabackup
xtrabackup ir utilīta ko sāku lietot nesen. Tā ļauj veidot backupus lielām tabulām netraucējot datubāzes darbību backupu veidošanas laikā un nesatraucoties par datu sabojāšanu dēļ rakstīšanas failos, kamēr tie tiek kopēti.
Šī ir labākā no šeit aprakstītajām metodēm ja vajag veidot rezerves kopijas lielām datubāzēm, kuras tiek visu laiku izmantotas.
Programmas uzstādīšana ir aprakstīta šeit:
http://www.percona.com/doc/percona-xtrabackup/2.1/installation/apt_repo.html
3.1 Backup izveidošana:
innobackupex --user=LIETOTĀJS --password=PAROLE /root/backup-mysql/
Šo arī liekam cronā kā tas jau bija aprakstīts mysqldump gadījumā.
3.2 Backup atjaunošana:
Pēc izveidošanas dati nav gatavi atjaunošanai. Vispirms tos ir jāsagatavo:
innobackupex --apply-log /root/backup-mysql/2013-12-23_12-10-45/
Tālāk jāatbrīvo mysql datu folderis no visa kas tur bijis iepriekš:
mv /var/lib/mysql /var/lib/mysql_fuckedup
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
Un atjaunojam datus:
innobackupex --copy-back /root/backup-mysql/2013-12-23_12-10-45/
Un startējam mysql serveri:
service mysql start
Laboja mad, labots 5x