Saya mencoba banyak skrip untuk pencadangan basis data tetapi saya tidak bisa melakukannya. Saya ingin mencadangkan database saya setiap jam.
Saya menambahkan file ke folder "/etc/cron.hourly/", mengubah chmod menjadi 755, tetapi tidak bisa berjalan.
Setidaknya saya menulis kode pseudo saya.
Saya akan senang jika Anda dapat menulis skrip untuk operasi ini dan memberi tahu saya apa yang harus saya lakukan lebih lanjut?
Setelah menambahkan file skrip ini ke folder /etc/cron.hourly/
.
tanggal=tanggal(d_m_y_H_M_S)
filename="$date".gz
mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename")
/var/www/vhosts/system/example.com/httpdocs/backups/
yang lebih lama dari 8 hari"/var/www/vhosts/system/example.com/httpdocs/backup_log.txt"
, teks ini akan ditulis: Backup dibuat pada $("date")
>/dev/null 2>&1
akan ditambahkan.Setelah berjam-jam bekerja, saya menciptakan solusi seperti di bawah ini. Saya copy paste untuk orang lain yang bisa mendapatkan manfaat.
Pertama-tama buatlah sebuah file script dan berikan file ini izin eksekusi.
# cd /etc/cron.daily/
# touch /etc/cron.daily/dbbackup-daily.sh
# chmod 755 /etc/cron.daily/dbbackup-daily.sh
# vi /etc/cron.daily/dbbackup-daily.sh
Kemudian salin baris-baris berikut ke dalam file dengan Shift+Ins
#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/var/www/vhosts/example.com/httpdocs/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown myuser "$fullpathbackupfile"
chown myuser "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0
Edit: Jika Anda menggunakan InnoDB dan pencadangan membutuhkan waktu terlalu lama, Anda dapat menambahkan "transaksi tunggal" argumen untuk mencegah penguncian. Jadi baris mysqldump akan seperti ini:
mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
--single-transaction mydatabase | gzip > "$fullpathbackupfile"
Buat skrip yang mirip dengan ini:
#!/bin/sh -e
location=~/`date +%Y%m%d_%H%M%S`.db
mysqldump -u root --password=<your password> database_name > $location
gzip $location
Kemudian Anda dapat mengedit crontab
pengguna yang akan menjalankan skrip tersebut:
$> crontab -e
Dan tambahkan entri
01 * * * * ~/script_path.sh
Ini akan membuatnya berjalan pada menit pertama setiap jam setiap hari.
Kemudian Anda hanya perlu menambahkan gulungan Anda dan fungsi lainnya dan Anda siap untuk pergi.
#!/bin/bash
# Add your backup dir location, password, mysql location and mysqldump location
DATE=$(date +%d-%m-%Y)
BACKUP_DIR="/var/www/back"
MYSQL_USER="root"
MYSQL_PASSWORD=""
MYSQL='/usr/bin/mysql'
MYSQLDUMP='/usr/bin/mysqldump'
DB='demo'
#to empty the backup directory and delete all previous backups
rm -r $BACKUP_DIR/*
mysqldump -u root -p'' demo | gzip -9 > $BACKUP_DIR/demo$date_format.sql.$DATE.gz
#changing permissions of directory
chmod -R 777 $BACKUP_DIR