Introducere
În această scriere, vom parcurge cum să faceți backup pentru mai multe baze de date MySQL sau MariaDB, care stau pe aceeași mașină, folosind un script bash personalizat și setând un job cron.
Copie de rezervă a bazei de date
Vom presupune că avem trei baze de date MySQL pe instanța noastră Vultr numită db-vultr-site , db-vultr-blog , db-vultr-app (Nu vă faceți griji despre crearea acestor baze de date, veți putea să le înlocuiți numele pentru dvs., atunci când sunt utilizate în scriptul de la Pasul 2 de mai jos) .
-
Conectați-vă la baza de date MySQL sau MariaDB și executați mai jos interogarea pentru a crea un utilizator al bazei de date care db_user_backupssă se ocupe de copii de rezervă
GRANT LOCK TABLES, SELECT, SHOW VIEW, REPLICATION CLIENT ON *.* TO 'db_user_backups'@'%' IDENTIFIED BY '{COMPLEX-PASSWORD}';
De asemenea, executați mai jos pentru a vă asigura că MySQL este configurat pentru a restaura corect procedurile stocate
SET GLOBAL log_bin_trust_function_creators = 1;
-
Configurați structura și fișierele necesare în mod necesar
# create backup directory with environment and log file
sudo mkdir /backups && cd /backups
sudo touch .env db-backup.sh db-backup.log
sudo chmod -R 775 /backups
sudo chmod -R g+s /backups
sudo chmod +x db-backup.sh
# add mysql backup user credentials into environment file
echo "export MYSQL_USER=db_user_backups" > /backups/.env
echo "export MYSQL_PASS={COMPLEX-PASSWORD}" >> /backups/.env
-
Deschideți db-backup.sh nano /backups/db-backup.shși lipiți codul de mai jos în el, apoi salvați fișierul (Ctrl + X -> Y -> apăsați Enter) .
DB_NAMES=( 'db-vultr-site' 'db-vultr-blog' 'db-vultr-app' ) #replace with your own database name(s)
BKUP_NAMES=()
BKUP_DIR="/backups"
# get total number of directories
total_dbs=${#DB_NAMES[@]}
# create backup file names
for (( i=0; i<${total_dbs}; i++ )); do
BKUP_NAMES[$i]="`date +%Y%m%d%H%M`-backup-$${DB_NAMES[$i]}.sql.gz"
done
# get backup users credentials
source $BKUP_DIR/.env
# create backups
for (( i=0; i<${total_dbs}; i++ )); do
# NOTE: --routines flag makes sure stored procedures are also backed up
mysqldump --routines -u ${MYSQL_USER} -p${MYSQL_PASS} | gzip > ${BKUP_DIR}/${BKUP_NAMES[$i]}
done
Codul de mai sus se realizează în buclă printr-un tablou cu numele (numele) bazei de date pe care doriți să le faceți backup și faceți acest lucru.
Configurare Cronjob
Configurați un cronjob pentru a rula în fiecare miez de noapte care rulează scriptul de rezervă și salvează rezultatul / ieșirea în jurnalul de rezervă.
-
Deschide crontab
crontab -e
-
Adăugați mai jos intrarea în crontab
0 0 * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Notă: În timp ce testați, puteți seta cronjob-ul să ruleze la fiecare 1 minut în loc ca mai jos
* * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
-OR- la fiecare 5 minute (înlocuiți 5 cu numărul de minute pe care doriți)
*/5 * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Ce urmeaza
Probabil că nu doriți backup-ul dvs. copie de rezervă pe același server (e) care rulează baza de date, dar în schimb pe un server într-o locație geografică diferită. Există mai multe modalități de a face acest lucru, de la utilizarea SFTP, la utilizarea instrumentelor personalizate furnizate de o mulțime de furnizori de stocare cloud disponibili acolo. O alternativă bună este Rsync așa cum se explică aici - vultr.com/docs/setup-file-mirroring-using-rsync-in-debian-ubuntu
Scris de Lami Adabonyan