Chociaż mój pierwotny skrypt działa, coś w tym może być znacznie prostsza:
mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz
Ten specjalnie zachowa 7 dni warto kopii zapasowych. Działa za pomocą dnia tygodnia plus godziny. Wyglądałoby to tak: data-Mon-00.sql.gz
(poniedziałek o północy). Gdy tydzień się rozejdzie, poprzednie kopie zapasowe zostaną nadpisane.
Jeśli ustawisz crona tak, by działał co 6 godzin, uzyskasz do 28 kopii zapasowych: (24/6) * 7 = 28
.
Aby uzyskać spójne kopie zapasowe za pomocą mysqldump, należy zablokować tabele, więc należy to zrobić tylko z poziomu repliki lub serwera o małej objętości. mysqldump tworzy także pełną migawkę, dzięki czemu uzyskuje się pełną migawkę dla każdej kopii zapasowej, co może zaowocować zajmowaniem dużej ilości miejsca na dysku. To może szybko stać się niemożliwe do zarządzania z dużą bazą danych. Możesz także nie chcieć ufać replikę, aby wykonywać kopie zapasowe, ponieważ replika musi również pozostać zsynchronizowana.
Lepszą opcją jest xtrabackup by Percona. Jest open source, więc jest za darmo. Wymaga tablic InnoDB i jest w stanie wykonać gorącą kopię zapasową głównego serwera MySQL bez przestojów i blokad (nie powinieneś tak czy inaczej używać MyISAM).Używa zmodyfikowanego silnika InnoDB z funkcją odzyskiwania po awarii InnoDB, aby zapewnić spójność kopii zapasowych. Zyskuje nawet przyrostowe kopie podstawowej migawki, dzięki czemu można wykonać setki kopii zapasowych i uzyskać rozmiar pojedynczej migawki. Działa z MySQL, MariaDB, PerconaDB (widły MySQL), a także z InnoDB i XtraDB (ulepszone InnoDB zarówno w MariaDB jak i Percona).
Osobiście trzymałbym się z xtrabackup i nawet nie zawracałbym sobie głowy mysqldump. Trzeba zrobić tak samo dużo wiersza polecenia pracy, a masz dodatkową zaletę małych przyrostowych kopii zapasowych. Istnieją narzędzia, które automatyzują korzystanie z xtrabackup, nawet w klastrze Galera. Facebook uses it.
oryginalny scenariusz:
Poniższy skrypt wykonuje „backup.sql.gz”, na przykład, i zamienia ją w coś takiego backupu-13Nov2012-01_30.sql.gz, następnie obraca pliki używając ciężko spinki do mankietów.
#!/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
Nie jestem pewien, dlaczego to pytanie zostało zamknięte. To wydaje się świetne pytanie. – ryvantage