2012-11-05 14 views
7

निम्नलिखित काम करता है:mysqldump cron job में समय जोड़ना?

/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date -I`.sql 

यह "full_backup_2012-11-04.sql"

क्रॉन जॉब में जो परिणाम हर मिनट जा रहा है, लेकिन फ़ाइल नाम केवल एक बार एक दिन के लिए है ... मैं चाहता था फ़ाइल नाम में घंटे और मिनट भी शामिल करने के लिए .... (अंत में क्रॉन नौकरी हर घंटे या तो चल सकती है)

तो तिथि-मैं काम करता हूं ... तारीख के लिए अन्य सामान्य विकल्प नहीं काम करने लगते हैं ... क्या कोई दस्तावेज है जो कहता है- मैं मान्य हूं? यदि ऐसा है कि दस्तावेज़ में अन्य विकल्प भी हो सकते हैं जो काम करते हैं।

+1

मुझे यकीन नहीं है कि यह प्रश्न क्यों बंद था। यह एक महान सवाल की तरह लगता है। – ryvantage

उत्तर

2

date -Iminutes जाने का तरीका हो सकता है, जो आईएसओ 8601 प्रारूप का उपयोग करता है। Wiki page कुछ जानकारी है।

+0

मुझे एक क्रॉन नौकरी दिन में दो बार चल रही है और अब तक यह जोड़ा गया है: "full_backup_2012-11-14T00: 00-0600.sql" मैं बस यह जांचूंगा कि यह काम करता रहता है ... –

3

उपयोग date +%Y-%m-%d_%H-%M-%S बजाय (या किसी अन्य प्रारूप):

संपादित

क्रॉन से ईमेल में लंबे विषयों से बचने के लिए एक फ़ाइल /home/<your user>/mycron.sh बनाने का उपयोग करें (फ़ाइल नाम और स्थान सिर्फ एक उदाहरण है):

#!/bin/sh 
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +%Y-%m-%d_%H-%M-%S`.sql 

सुनिश्चित करें कि आप chmod +x /home/<your user>/mycron.sh हैं।

इस दिनांक स्वरूप इच्छा उत्पादन:

full_backup_2012-11-05_08-49-19.sql 

फिर अपने क्रॉन स्क्रिप्ट के नाम पर उपयोग करते हैं, अर्थात्:

[cron parameters] /home/<your user>/mycron.sh 
+1

नमस्ते मैं सीपीनल एक्स का उपयोग कर रहा हूं और मुझे निम्नलिखित ईमेल किया गया था: /bin/sh: -c: line 0: अनपेक्षित ईओएफ मिलान ''' /bin/sh: -c: लाइन 1: वाक्यविन्यास त्रुटि : फ़ाइल का अप्रत्याशित अंत –

+0

मेरी पिछली पोस्ट में आप नई लाइनों और '\\' बैकस्लैश को हटाना चाहेंगे। मैंने उन्हें फोरम पठनीयता के लिए यहां रखा है। मैं संपादन कर रहा हूँ – JScoobyCed

+0

हाँ मैंने बैकस्लाश को हटा दिया। ईमेल की विषय पंक्ति में बीटीडब्ल्यू ने मुझे मूल रूप से कहा है ".../public_html/बैकअप/full_backup_'date -I'.sql" लेकिन अब यह कहता है ".../public_html/बैकअप/full_backup_'date + " –

1

तारीख (1) आदेश एक "+ [प्रारूप] है "विकल्प। मुझे विश्वास है कि आप जिस विकल्प को चाहते हैं वह '% s' या '% N' विकल्प हैं, जो आपको क्रमशः सेकंड या नैनोसेकंड देंगे। MySQL के लिए आपके पथ से, मुझे लगता है कि आप लिनक्स पर हैं। यदि यह वास्तव में मामला है, तो आप मैनपेज here पा सकते हैं जो आपको और विवरण देगा।

+0

मैं सीपीनल एक्स का उपयोग कर रहा हूं .... बीटीडब्ल्यू वर्तमान दिनांक विकल्प है- मैं ... मैं उस मैनपेज पर उस विकल्प को नहीं देख सकता। –

1

अपने मूल स्क्रिप्ट काम करता है, कुछ इस तरह बहुत आसान हो सकता है:

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 
0

आप यह सब crontab प्रविष्टि (और नहीं एक खोल स्क्रिप्ट) में क्या करना चाहते हैं, तो यहां बताया गया है:

/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +\%F_\%R`.sql 

फ़ाइल नाम होगा के रूप में उत्पादन: full_backup_2017-08-18_17: 52। date +\%F_\%R

नोट:: एसक्यूएल

अपने आदेश से महत्वपूर्ण परिवर्तन यह है की तारीख आदेश में% crontab में भाग निकले होना चाहिए, अन्यथा आप की संभावना एक EOF त्रुटि प्राप्त होगी। यह% से बचने के बिना कमांड लाइन पर काम करेगा लेकिन crontab में नहीं होगा। उम्मीद है की यह मदद करेगा।

संबंधित मुद्दे