2012-11-05 21 views
7

następujące utwory:Dodawanie czasu do pracy mysqldump cron?

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

Skutkuje „full_backup_2012-11-04.sql”

zadanie cron będzie co minutę, ale nazwa pliku jest wyłącznie raz dziennie ... Chciałem dodać godzinę i minutę również w nazwie pliku ... (w końcu zadanie cron może być uruchamiane co godzinę)

Na dzień - działam ... inne typowe opcje daty nie wydaje się działać ... czy istnieje jakaś dokumentacja, która mówi: "Czy jest ważna? Jeśli tak, to dokumentacja może mieć również inne opcje, które działają.

+1

Nie jestem pewien, dlaczego to pytanie zostało zamknięte. To wydaje się świetne pytanie. – ryvantage

Odpowiedz

2

date -Iminutes może być drogą, która używa formatu ISO 8601. The Wiki page ma trochę informacji.

+0

Mam zadanie cron działające dwa razy dziennie i do tej pory dodało ono: "full_backup_2012-11-14T00: 00-0600.sql" Po prostu sprawdzę, czy działa dalej ... –

3

Zastosowanie date +%Y-%m-%d_%H-%M-%S zamiast (lub inny format):

EDITED

Aby uniknąć długich przedmiotów w wiadomości e-mail z CRON, należy utworzyć plik /home/<your user>/mycron.sh (nazwa pliku i położenie to tylko przykład):

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

Upewnij się, że jesteś chmod +x /home/<your user>/mycron.sh.

Ta data wyjściowa format będzie:

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

Następnie użyj w cron'a nazwa skryptu, czyli:

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

Witam Używam cPanel X i wysłano mi e-mailem: /bin/sh: -c: linia 0: nieoczekiwany EOF podczas szukania pasującego '' ' /bin/sh: -c: wiersz 1: błąd składni : nieoczekiwany koniec pliku –

+0

W moim poprzednim poście możesz chcieć usunąć nowe linie i "backslash". Umieściłem je tylko tutaj, aby ułatwić czytanie na forum. Edytuję. – JScoobyCed

+0

Tak, usunąłem ukośniki odwrotne. BTW w temacie wiadomości e-mail, którą przesyła mi, pierwotnie powiedział ".../public_html/backups/full_backup_'date -I'.sql", ale teraz mówi ".../public_html/backups/full_backup_'date + " –

1

data (1) komenda ma „+ [FORMAT] " opcja. Uważam, że wybraną opcją są opcje "% s" lub "% N", które dają odpowiednio sekundy lub nanosekundy. Z twojej ścieżki do MySQL, zakładam, że jesteś na Linuksie. Jeśli tak rzeczywiście jest, można znaleźć stronę podręcznika here, która zawiera dalsze szczegóły.

+0

Używam cPanel X .... BTW opcja bieżącej daty to -I ... Nie widzę takiej opcji na tej stronie. –

1

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 
0

Jeśli chcesz zrobić to we wpisie crontab (a nie skryptu powłoki), oto jak:

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

Nazwa pliku wyświetli jako: full_backup_2017-08-18_17: 52. sql

Kluczową zmianą z Twojego polecenia jest następująca: date +\%F_\%R

Uwaga:% w poleceniu data musi być uciekł w crontab, w przeciwnym razie będziesz prawdopodobnie pojawi się błąd EOF. Będzie działał na linii poleceń bez ucieczki przed%, ale nie będzie w crontab. Mam nadzieję że to pomoże.