Introduksjon
I denne artikkelen vil vi gå gjennom hvordan du sikkerhetskopierer flere MySQL- eller MariaDB-databaser som sitter på samme maskin ved å bruke et tilpasset bash-skript og sette opp en cron-jobb.
Databasesikkerhetskopi(er)
Vi antar at vi har tre MySQL-databaser på Vultr-forekomsten vår kalt db-vultr-site , db-vultr-blog , db-vultr-app (Ikke bekymre deg for å lage disse databasene, du vil kunne erstatte navnene deres for din hvor de brukes i skriptet på trinn 2 nedenfor) .
Logg på MySQL- eller MariaDB-databasen din og kjør spørringen nedenfor for å opprette en databasebruker for db_user_backupså håndtere sikkerhetskopier
GRANT LOCK TABLES, SELECT, SHOW VIEW, REPLICATION CLIENT ON *.* TO 'db_user_backups'@'%' IDENTIFIED BY '{COMPLEX-PASSWORD}';
Kjør også nedenfor for å sikre at MySQL er konfigurert til å gjenopprette lagrede prosedyrer på riktig måte
SET GLOBAL log_bin_trust_function_creators = 1;
Sett opp nødvendig katalogstruktur og nødvendige filer
# 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
Åpne db-backup.sh nano /backups/db-backup.shog lim inn koden nedenfor i den, lagre deretter filen (Ctrl+X -> Y -> trykk 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
Koden ovenfor går gjennom en matrise med navnene på databasen(e) du vil sikkerhetskopiere og gjør det.
Cronjob-oppsett
Sett opp en cronjob til å kjøre hver midnatt som kjører sikkerhetskopiskriptet og lagrer resultatet/utdataene i backuploggen.
Åpne crontab
crontab -e
Legg til oppføringen nedenfor i crontab
0 0 * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Merk: Mens du tester kan du stille inn cronjob til å kjøre hvert 1. minutt i stedet som nedenfor
* * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
-ELLER- hvert 5. minutt (erstatt 5 med det antall minutter du ønsker)
*/5 * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Hva blir det neste
Du vil sannsynligvis ikke ha sikkerhetskopien(e) på samme server(e) som kjører databasen(e), men i stedet på en server på en annen geografisk plassering. Det er flere måter å gjøre dette på, alt fra å bruke SFTP til å bruke tilpassede verktøy levert av myriade av skylagringsleverandører som er tilgjengelige der ute. Et godt alternativ er Rsync som forklart her - vultr.com/docs/setup-file-mirroring-using-rsync-in-debian-ubuntu
Skrevet av Lami Adabonyan