Skrip shell Linux untuk pencadangan basis data

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/.

  • Dapatkan tanggal saat ini dan buat variabel, tanggal=tanggal(d_m_y_H_M_S)
  • Buat variabel untuk nama file, filename="$date".gz
  • Dapatkan dump dari database saya seperti ini mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename")
  • Hapus semua file di folder /var/www/vhosts/system/example.com/httpdocs/backups/ yang lebih lama dari 8 hari
  • Ke file "/var/www/vhosts/system/example.com/httpdocs/backup_log.txt", teks ini akan ditulis: Backup dibuat pada $("date")
  • Ubah pemilik file (chown) dari root ke "my_user". Karena saya ingin membuka file backup dan log dari akun FTP "my_user".
  • Saya tidak ingin ada email setelah setiap cron. >/dev/null 2>&1 akan ditambahkan.
Larutan

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"
Komentar (8)

Buat skrip yang mirip dengan ini:

#!/bin/sh -e

location=~/`date +%Y%m%d_%H%M%S`.db

mysqldump -u root --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.

Komentar (3)
#!/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
Komentar (0)