2013-10-29 177 views
33

我嘗試了很多用於數據庫備份的腳本,但是我無法做到。我想每小時備份我的數據庫。
我將文件添加到「/etc/cron.hourly/」文件夾中,將其chmod更改爲755,但未運行。 至少我寫我的僞代碼。用於數據庫備份的Linux shell腳本

如果您可以爲此操作編寫腳本並告訴我該怎麼做,我會很高興? 將此腳本文件添加到/etc/cron.hourly/文件夾後。

  • 獲取當前日期和創建一個變量,date=date(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/中的所有文件大於8天
  • 對於文件"/var/www/vhosts/system/example.com/httpdocs/backup_log.txt",本文將寫爲:Backup is created at $("date")
  • Cha將文件所有者(chown)從根目錄更改爲「my_user」。因爲我想從「my_user」FTP帳戶打開備份和日誌文件。
  • 我不想在每個cron後發一封電子郵件。將添加>/dev/null 2>&1

回答

71

經過數小時和數小時的工作,我創建瞭如下所示的解決方案。我複製粘貼給其他人可以受益。

首先創建一個腳本文件並賦予該文件可執行權限。

# 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 

然後下面幾行復制到文件使用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 

編輯:
如果使用InnoDB和備份花費太多的時間,你可以添加「single-transaction」的說法,以防止鎖定。所以mysqldump的行會是這樣的:

mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 
      --single-transaction mydatabase | gzip > "$fullpathbackupfile" 
+0

不錯 - 但對於新手,您需要明確創建日誌文件(因爲您不能追加到不存在的文件)或檢查並創建日誌文件 – fezfox

+0

輪換就像這樣,每日備份的次數是多少保持? – alimack

+4

安全警告:使用--password參數可以通過查看/ proc中的進程命令行來發現您的密碼。不要在多用戶系統上使用,除非您已應用各種內核安全修補程序來阻止用戶查看其他用戶的進程信息。 – Perkins

27

創建類似下面的腳本:

#!/bin/sh -e 

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

mysqldump -u root --password=<your password> database_name > $location 

gzip $location 

然後,您可以編輯該腳本將作爲運行用戶的crontab

$> crontab -e 

並追加進入

01 * * * * ~/script_path.sh 

這將使它運行在t他每天每小時的第一分鐘。

然後,你只需添加你的卷和其他功能,你很好去。

+1

完美地工作! –

+4

如何將輸出管道配置爲gzip以節省磁盤空間? – James

+0

將此腳本作爲我的mac上的cron作業運行時遇到問題。添加了mysqldump和gzip二進制文件的完整路徑。這很好。沒有它,我得到一個文件($位置),大小爲0。 gzip從未跑過。由於我使用gzip作爲附加功能,我真正的問題是crontab無法識別mysqldump路徑(/ usr/local/bin)。希望這可以幫助任何有此問題的人。沒有完全發現它像我在這裏寫的。 – mmv1219

0
#!/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 
1
#!/bin/sh 
#Procedures = For DB Backup 
#Scheduled at : Every Day 22:00 

v_path=/etc/database_jobs/db_backup 
logfile_path=/etc/database_jobs 
v_file_name=DB_Production 
v_cnt=0 

MAILTO="[email protected]" 
touch "$logfile_path/kaka_db_log.log" 

#DB Backup 
mysqldump -uusername -ppassword -h111.111.111.111 ddbname > $v_path/$v_file_name`date +%Y-%m-%d`.sql 
if [ "$?" -eq 0 ] 
    then 
    v_cnt=`expr $v_cnt + 1` 
    mail -s "DB Backup has been done successfully" $MAILTO < $logfile_path/db_log.log 
else 
    mail -s "Alert : kaka DB Backup has been failed" $MAILTO < $logfile_path/db_log.log 
    exit 
fi 
5

我得到了同樣的問題。 但我設法寫一個腳本。 希望這會有所幫助。

#!/bin/bash 
# Database credentials 
user="username" 
password="password" 
host="localhost" 
db_name="dbname" 
# Other options 
backup_path="/DB/DB_Backup" 
date=$(date +"%d-%b-%Y") 
# Set default file permissions 
umask 177 
# Dump database into SQL file 
mysqldump --user=$user --password=$password --host=$host $db_name >$backup_path/$db_name-$date.sql 

# Delete files older than 30 days 
find $backup_path/* -mtime +30 -exec rm {} \; 


#DB backup log 
echo -e "$(date +'%d-%b-%y %r '):ALERT:Database has been Backuped" >>/var/log/DB_Backup.log