2012-11-05 15 views
7

le seguenti opere:Aggiunta dell'ora al cron job mysqldump?

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

Essa si traduce in

Il cron "full_backup_2012-11-04.sql" sta andando ogni minuto, ma il nome del file è solo per una volta al giorno ... che volevo per includere l'ora e il minuto anche nel nome del file .... (alla fine il cron job potrebbe essere eseguito ogni ora circa)

Quindi data -Io funziona ... altre opzioni tipiche per la data non sembra funzionare ... c'è qualche documentazione che dice -I è valido? Se è così che la documentazione potrebbe avere anche altre opzioni che funzionano.

+1

Non sono sicuro del motivo per cui questa domanda è stata chiusa. Questa sembra una bella domanda. – ryvantage

risposta

2

date -Iminutes potrebbe essere la strada da percorrere, che utilizza il formato ISO 8601. Il Wiki page ha alcune informazioni.

+0

Ho un cron job in esecuzione due volte al giorno e finora ha aggiunto: "full_backup_2012-11-14T00: 00-0600.sql" controllerò che continua a funzionare ... –

3

Usa date +%Y-%m-%d_%H-%M-%S invece (o qualsiasi altro formato):

a cura

Per evitare soggetti lunghe in messaggi di posta elettronica da cron, utilizzare creare un file /home/<your user>/mycron.sh (nome del file e la posizione è solo un esempio):

#!/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 

Assicurati di avere chmod +x /home/<your user>/mycron.sh.

Questa data di uscita formato sarà:

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

Poi utilizzare per le cron il nome dello script, vale a dire:

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

Ciao, sto usando cPanel X e mi è stato inviato il seguente indirizzo: /bin/sh: -c: riga 0: EOF inaspettato durante la ricerca di corrispondenza '' ' /bin/sh: -c: riga 1: errore di sintassi : fine del file imprevisto –

+0

Nel mio post precedente potresti voler rimuovere le nuove righe e il '\\' backslash. Li ho posizionati solo qui per la leggibilità del forum. Sto modificando. – JScoobyCed

+0

Sì, ho rimosso i backslash. BTW nella riga dell'oggetto dell'e-mail che invia mi ha detto in origine ".../public_html/backups/full_backup_'date -I'.sql" ma ora dice ".../public_html/backups/full_backup_'date + " –

1

La data (1) Il comando ha un "+ [FORMATO] " opzione. Credo che l'opzione che desideri sia l'opzione '% s' o '% N', che ti darà rispettivamente secondi o nanosecondi. Dal tuo percorso per MySQL, assumerò che tu sia su Linux. Se questo è davvero il caso, puoi trovare la manpage here che ti fornirà ulteriori dettagli.

+0

Sto usando cPanel X .... BTW l'opzione della data corrente è -I ... Non riesco a vedere quell'opzione su quella manpage. –

1

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 
0

Se si vuole fare tutto nella voce crontab (e non uno script di shell), ecco come:

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

il nome del file di output come: full_backup_2017-08-18_17: 52. sql

il passaggio chiave dal vostro comando è questo: date +\%F_\%R

Nota: l'% nel comando data deve essere sfuggito a crontab, altrimenti è probabile che ottiene un errore EOF. Funzionerà sulla riga di comando senza sfuggire alla% ma non in crontab. Spero che questo ti aiuti.