cronjob do automatycznego tworzenia kopii zapasowych DB do aktualnego pliku z prefiksem

12

Korzystam z najnowszej Linux Mint. Zastanawiałem się, czy jest możliwe utworzenie specjalnego kronika dla kopii zapasowej bazy danych.

W moim /etc/cronjobpliku mam następujący kod:

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh

W moim /home/users/backup.shmam:

mysqldump -uroot -p MyDatabase > /home/users/backup_MyDB/full_myDB.sql

Zamiast tego full_myDB.sqlchciałbym mieć coś takiego, 2014-04-04_full_myDB.sqlgdzie data jest dodawana dynamicznie w zależności od naszej daty.

Jeśli plik SQL Backup jest starszy niż jeden tydzień Chciałbym cron aby usunąć automatycznie go.

pbaldauf
źródło

Odpowiedzi:

15

Za pomocą GNU date(domyślnie w Linux Mint) możesz:

mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql

Aby usunąć pliki starsze niż 1 tydzień:

find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +

Chociaż ogólnie mądrze jest zobaczyć, co usuwasz, zanim je usuniesz (przynajmniej podczas testowania skryptu), po prostu wykonaj następujące czynności:

find /home/users/backup_MyDB -type f -mtime +7
Graeme
źródło
Przygotowywałem odpowiedź, ale pobiłeś mnie: P
Ramesh
2
@Ramesh, cieszę się, że pobiłem kogoś innego dla odmiany - zwykle piszę, a ktoś już ma podobną odpowiedź.
Graeme
Bardzo dobrze. Jedyną rzeczą, którą zmieniam na swój użytek, jest umieszczenie szczegółów dostępu do bazy danych w pliku .my.cnf.
Johann Dyck
4

Wykorzystałem powyższe informacje i chciałem dostarczyć jeszcze jedną drobną aktualizację, która faktycznie obciąża jedną z naprawdę dużych tabel, która spowalniała nasze kopie zapasowe.

Mam nadzieję, że pomoże to komuś innemu.

Korzystając z powyższych informacji, stworzyłem podstawowy skrypt powłoki o nazwie mysqlbackup.sh o następującej treści:

#!/bin/sh
find /data/var/backups/mysql/dumps -type f -mtime +3 -exec rm {} +
mysql -e "truncate table sitename_prod.cache_table"
mysqldump sitename_prod > /data/var/backups/mysql/dumps/$(date +%F)_full_sitename_prod.sql

Pamiętaj, aby uruchomić: chmod + x mysqlbackup.sh

Umieściłem to również w moim crontabie -e:

# MYSQL Dump and retention for 3 days
30 22 * * * bash /root/bin/mysqldump.sh > /dev/null 2>&1
Jason Ruyle
źródło
3

Wiem, że to duży stary, ale użyłem powyższych odpowiedzi i dodałem instrukcję kompresji pliku. Mam nadzieję, że ktoś inny uzna to za przydatne.

1) Badając nieco, 7-zip wydaje się najlepszą dostępną sprężarką. Jeśli twoja dystrybucja linuksowa to obsługuje, możesz użyć apt installera:

sudo apt-get install p7zip-full

Alternatywnie możesz użyć tar.gz, jeśli czujesz się z tym lepiej.

2) Następnie tworzysz skrypt, na przykład /home/users/backup.sh z zawartością:

#!/bin/sh
find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +
mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql
7z a /home/users/backup_MyDB/$(date +%F)_full_myDB.7z /home/users/backup_MyDB/*.sql
rm -f /home/users/backup_MyDB/*.sql

Ten skrypt znajdzie pliki na więcej niż 7 dni i usunie je, następnie wykona zrzut SQL, następnie 7-zip wszystkich plików .sql w katalogu, a następnie usunie wszystkie .sql w katalogu ( BTW, możesz opcjonalnie dodać komendę mysql przed zrzutem, jak wspomniano w poprzedniej odpowiedzi, jeśli jej potrzebujesz)

3) Robimy chmod +x /home/users/backup.shtak, aby można go było wykonać.

3.1) Powinieneś przetestować skrypt, jeśli działa zgodnie z przeznaczeniem

4) Programujemy zadanie za pomocą crontab -e

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh >> /dev/null 2>&1

I to wszystko. Wykona kopię zapasową bazy danych MySQL każdego dnia w tygodniu o 4:30 (z wyjątkiem niedziel) i skompresuje kopię zapasową

Gusstavv Gil
źródło
1

Aby dodać do odpowiedzi @ Graeme, warto zauważyć, że czasami może być konieczne ucieczka od znaku „%” w zadaniu cron, aby wyglądał następująco:

 mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +\%F)_full_myDB.sql
frezq
źródło