/ 4 minutters læsning
Mit script jeg selv bruger til mysql-backup
🌩️ Forestil dig en mørk og stormfuld nat. Tordenen buldrer, og du — ja, du, den modige tech-helt fra IT-afdelingen går frem og tilbage i din fæstning (også kendt som dit hjemmekontor). 😰 Du er badet i en kold sved, hjemsøgt af Database-dæmonerne, der lurer i dybet af korrupte backups. De er truende, de er skræmmende, og de vil ødelægge din dag! 🧙♂️👹
Lige da du tror, alt håb er ude, træder den awesome superhelt ind af SSH-bagdørenm —Backup Manden, også kendt som mig, girafpingvin! 🦸♂️💫 Med en kappe lavet af kode og et skjold af bash-scripts suser jeg ind for at fordrive de onde Database-dæmoner en gang for alle.
Med et lyn og et brag slipper jeg mit hemmelige våben løs—et MySQL Backup Script så kraftfuldt, at selv de værste Database-dæmoner flygter i panik. 🌄 Scriptet udfører en komplet mysqldump
af dine dyrebare databaser, og gemmer X dage på serveren! 🗝️💼
Dine databaser er nu sikre, din integritet er intakt, og freden vender tilbage til serverlandets rige. 🏰🌈 Du kan endelig sove trygt om natten og drømme om optimerede forespørgsler og normaliserede tabeller. 😴💭
Haha, okay, det var måske lidt dramatisk! 😂 Men når det kommer til backups, så er en succesfuld og fungerende backup er ikke til at spøge med. 🤷♂️👍
Kernen i scriptet er at udføre automatiske backups af alle MySQL databaser på en server. Det gives mulighed for at udelukke specifikke databaser. Scriptet gemmer alle backups i en angivet mappe. Derudover sletter det automatisk backups, der er ældre end et bestemt antal dage. Her er scriptet, der kører på mine servere:
#!/bin/bash
# ------------------------------------------------------------------------
# girafpingvins MySQL Dump Script
# Skabt af girafpingvin.dk / Daniel Bahl 2023
#
# Udfører automatisk backups af alle MySQL databaser på serveren med mulighed
# for at udelukke specifikke databaser.
# Alle backups gemmes i /backup/mysql (ændr $DEST og $MBD nedenfor).
# ------------------------------------------------------------------------
# Konfiguration
MyUSER="root" # MySQL Brugernavn
MyHOST="localhost" # MySQL Server Hostname
IGNOREDB="test" # Databaser der skal ignoreres
DEST="/backup" # Backup Destination (ex. /tmp/backup eller /home/giraf/backup)
MBD="$DEST/mysql" # Main Backup Directory (undermappe der laves under DEST, ex. /mysql)
KEEPXDAYS=4 # Antal dage, gamle backups skal beholdes
# MySQL Password, læses fra en sikker fil
# HUSK AT CHMOD 400 mysqlpass for sikkerhed
MyPASS="$(cat /root/etc/mysqlpass)"
# Auto-detekter stier til nødvendige binære filer
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Hent systeminformation
HOST="$(hostname)"
NOW="$(date +"%d-%m-%Y")" # Aktuel dato i dd-mm-yyyy format
# Sørg for, at backup-mappen eksisterer
[ ! -d $MBD ] && mkdir -p $MBD
# Sæt mappe-tilladelser
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Hent liste over databaser
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'SHOW DATABASES')"
# Udfør backup
for db in $DBS; do
if [[ "$IGNOREDB" != *"$db"* ]]; then # Spring databaser i $IGNOREDB over
FILE="$MBD/$db.$HOST.$NOW.gz"
$MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
fi
done
# Slet gamle backups ældre end KEEPXDAYS
find $MBD -name "*.gz" -mtime +$KEEPXDAYS -exec rm {} \;
Start med at gøre scriptet eksekverbart ved at køre chmod +x /path/to/script.sh.
For sikkerhed læser scriptet MySQL password fra en fil (/root/etc/mysqlpass). Opret denne fil og placer dit MySQL password i den. Brug chmod 400 /root/etc/mysqlpass for kun at give root adgang.
For at køre scriptet automatisk hver nat, rediger din crontab:
crontab -e
Tilføj denne linje for at køre scriptet hver dag kl. 02:00:
0 2 * * * /path/to/script.sh
Et MySQL backup script er måske ikke helten i en storfilm, men det er den usungne helt på mine servere og redder dagen før potentielle katastrofer rammer. Hvis du mister søvn over mulige databasekorruptioner under backups, er du velkommen til at bruge og tilpasse dette script. Tro mig, dit fremtidige jeg vil takke dig.