Mentre il mio script originale funziona, qualcosa di simile a questo può essere molto più semplice:
mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz
Questo particolare non mancherà di tenere 7 giorni vale la pena di backup. Funziona usando il giorno della settimana più l'ora. Quindi sembrerebbe data-Mon-00.sql.gz
(lunedì a mezzanotte). Quando la settimana scorre, i backup precedenti vengono sovrascritti.
Se si imposta il cron per l'esecuzione ogni 6 ore, si ottengono fino a 28 backup (24/6) * 7 = 28
.
Per ottenere un backup coerente con mysqldump è necessario bloccare le tabelle, quindi questa operazione deve essere eseguita solo da una replica o da un server a basso volume. mysqldump crea anche un'istantanea completa, così si finisce per avere uno snapshot completo per ogni backup, che può finire per occupare molto spazio su disco. Questo può diventare rapidamente ingestibile con un grande database. È inoltre possibile che non si desideri considerare attendibile una replica per l'esecuzione di backup, poiché anche la replica deve rimanere sincronizzata.
Un'opzione migliore è xtrabackup by Percona. È open source, quindi è gratuito. Richiede tabelle InnoDB ed è in grado di effettuare un backup a caldo del tuo server MySQL primario senza tempi di fermo o blocchi (non dovresti comunque utilizzare MyISAM).Utilizza un motore InnoDB modificato con la funzionalità di ripristino di emergenza di InnoDB per garantire che i backup siano coerenti. Richiede anche backup incrementali di uno snapshot di base, in modo da poter fare centinaia di backup e far sì che occupi le dimensioni di una singola istantanea. Funziona con MySQL, MariaDB, PerconaDB (forks di MySQL), e sia InnoDB che XtraDB (InnoDB migliorato sia in MariaDB che in Percona).
Personalmente vorrei attenermi a xtrabackup e non preoccuparmi nemmeno di mysqldump. Devi fare tutto il lavoro da riga di comando e hai il vantaggio aggiuntivo di piccoli backup incrementali. Ci sono strumenti là fuori che automatizzano l'uso di xtrabackup, anche in un cluster di Galera. Facebook uses it.
sceneggiatura originale:
Lo script di seguito prende "backup.sql.gz", per esempio, e lo trasforma in qualcosa di simile di backup-13Nov2012-01_30.sql.gz, quindi ruota file utilizzando duro collegamenti.
#!/bin/bash
###########################################################################
# snapshot
#
# Rotates snapshots of backups using hard links
#
# Keeps track of:
# - 48 hours of snapshots (48*60/interval)
# - 60 days worth of midnight snapshots
# - 24 months of snapshots from the 1st
# Ussage:
# snapshot /path/to/backup.sql.gz
# mysqldump ... | gzip -c | snapshot /path/to/backup.sql.gz
#
###########################################################################
if ! hash date 2> /dev/null; then
echo "-snapshot: date command not found" 1>&2
exit 1
fi
if ! hash ln 2> /dev/null; then
echo "-snapshot: ln: command not found" 1>&2
exit 1
fi
# Date Info
month=$(date +"%b")
day=$(date +"%d")
year=$(date +"%Y")
time=$(date +"%H_%M")
date=$(date +"%d%b%Y")
dateFirst=$(date --date="$month 01" +"%d%b%Y" 2> /dev/null)
# Test to see if we're using GNU date or BSD date
if [ "$dateFirst" == "" ]; then
dateFirst=$(date -v1d +"%d%b%Y")
back2date=$(date -v-2d +"%d%b%Y")
back2monthY=$(date -v-2m +"%b%Y")
back2year=$(date -v-2y +"%Y")
else
back2date=$(date --date="-2 day" +"%d%b%Y")
back2monthY=$(date --date="-2 month" +"%b%Y")
back2year=$(date --date="-2 year" +"%Y")
fi
if [ "$dateFirst" == "" ]; then
echo "-snapshot: Unknown version of date command." 1>&2
exit 1
fi
# Directories
filepath=$1
backup=$2
if [ "$filepath" == "" ]; then
echo "-snapshot: Expecting filename as first argument" 1>&2
exit 1
fi
if [ "$backup" == "" ]; then
backup=/backup
fi
if [ ! -d "$backup" ]; then
echo "-snapshot: Directory "$backup" doesn't exist" 1>&2
exit 1
fi
snapshots=$backup/snapshots
daily=$backup/daily
monthly=$backup/monthly
basename=${filepath##*/}
ext=${basename#*.}
basename=${basename%%.*}
filename=$basename-$date-$time.$ext
##############################
# Make new snapshot
##############################
if [ ! -d "$snapshots/$date" ]; then
mkdir -p "$snapshots/$date"
fi
if [ -t 0 ]; then
if [ ! -f "$filepath" ]; then
echo "-snapshot: '$filepath' doesn't exist" 1>&2
exit 1
fi
ln "$filepath" "$snapshots/$date/$filename"
else
cat > "$snapshots/$date/$filename"
fi
##############################
# Daily/monthly snapshots
##############################
if [ "$time" == "00_00" ]; then
if [ ! -d "$daily/$month$year" ]; then
mkdir -p "$daily/$month$year"
fi
ln "$snapshots/$date/$filename" "$daily/$month$year/$filename"
if [ "$day" == "01" ]; then
if [ ! -d "$monthly/$year" ]; then
mkdir -p "$monthly/$year"
fi
ln "$snapshots/$date/$filename" "$monthly/$year/$filename"
fi
fi
##############################
# Clean up old snapshots
##############################
if [ -d "$snapshots/$back2date" ]; then
rm -fr "$snapshots/$back2date"
fi
if [ -d "$daily/$back2monthY" ]; then
rm -fr "$daily/$back2monthY"
fi
if [ -d "$monthly/$back2year" ]; then
rm -fr "$monthly/$back2year"
fi
Non sono sicuro del motivo per cui questa domanda è stata chiusa. Questa sembra una bella domanda. – ryvantage