अपने मूल स्क्रिप्ट काम करता है, कुछ इस तरह बहुत आसान हो सकता है:
mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz
यह विशेष रूप से 7 दिन बैकअप के लायक रखेंगे। यह सप्ताह के दिन और घंटे का उपयोग करके काम करता है। तो यह data-Mon-00.sql.gz
(सोमवार मध्यरात्रि) जैसा दिखता है। जब सप्ताह चारों ओर घूमता है, तो पिछले बैकअप ओवरराइट हो जाते हैं।
यदि आप हर 6 घंटे चलाने के लिए अपना क्रॉन सेट करते हैं तो आपको 28 बैकअप (24/6) * 7 = 28
तक पहुंच जाएगा।
mysqldump के साथ एक सतत बैकअप प्राप्त करने के लिए आपको तालिकाओं को लॉक करना होगा, इसलिए इसे केवल प्रतिकृति या कम-वॉल्यूम सर्वर से ही किया जाना चाहिए। mysqldump भी एक पूर्ण स्नैपशॉट बनाता है, इसलिए आप प्रत्येक बैकअप के लिए एक पूर्ण स्नैपशॉट रखते हैं, जो बहुत सी डिस्क स्पेस ले सकता है। यह एक बड़े डेटाबेस के साथ जल्दी से अप्रबंधनीय बन सकता है। आप प्रतिकृति को भी बैकअप लेने के लिए भरोसा नहीं करना चाहेंगे क्योंकि प्रतिकृति को सिंक में भी रहना होगा।
एक बेहतर विकल्प xtrabackup by Percona है। यह खुला स्रोत है, इसलिए यह मुफ़्त है। इसके लिए इनो डीबी टेबल की आवश्यकता होती है और डाउनटाइम या लॉक के बिना आपके प्राथमिक MySQL सर्वर का गर्म बैकअप लेने में सक्षम होता है (आपको वैसे भी माईसैम का उपयोग नहीं करना चाहिए)।यह बैकअप स्थिर होने के लिए इनो डीबी की क्रैश रिकवरी सुविधा के साथ एक संशोधित इनो डीबी इंजन का उपयोग करता है। यह बेस स्नैपशॉट के बढ़ते बैकअप भी लेता है, ताकि आप सैकड़ों बैकअप बना सकें और इसे एक स्नैपशॉट का आकार ले सकें। यह माईएसक्यूएल, मारियाडीबी, पेर्कोन डीडी (माईएसक्यूएल के कांटे), और इनो डीडी और एक्सटीडीबीबी (मारिया डीबी और पेर्कोनिया दोनों में बेहतर इनो डीबी) के साथ काम करता है।
व्यक्तिगत रूप से मैं xtrabackup के साथ रहूंगा और mysqldump से भी परेशान नहीं होगा। आपको उतना ही काम कमांड लाइन के अनुसार करना होगा, और आपके पास छोटे वृद्धिशील बैकअप का अतिरिक्त लाभ होगा। वहाँ ऐसे उपकरण हैं जो गैलेरा क्लस्टर में भी xtrabackup के उपयोग को स्वचालित करते हैं। Facebook uses it।
मूल स्क्रिप्ट:
नीचे स्क्रिप्ट "backup.sql.gz", उदाहरण के लिए ले जाता है, और यह बैकअप-13Nov2012-01_30.sql.gz की तरह कुछ में बदल जाता है, तो घूमता है मुश्किल का उपयोग करके फ़ाइलें लिंक।
#!/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
मुझे यकीन नहीं है कि यह प्रश्न क्यों बंद था। यह एक महान सवाल की तरह लगता है। – ryvantage