2013-10-29 9 views
33

私はデータベースバックアップのために多くのスクリプトを試しましたが、できませんでした。毎時データベースをバックアップしたい。
"/etc/cron.hourly/"フォルダにファイルを追加し、chmodを755に変更しましたが、実行されませんでした。 少なくとも私は擬似コードを書く。データベースバックアップのためのLinuxシェルスクリプト

この操作のスクリプトを書いて、もっと何をすべきか教えていただけたら幸いです。 このスクリプトファイルを/etc/cron.hourly/フォルダに追加した後。

  • filename="$date".gz
  • フォルダ/var/www/vhosts/system/example.com/httpdocs/backups/内のすべてのファイルを削除します。このmysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename")
  • のように私のデータベースのダンプを取得し、
  • date=date(d_m_y_H_M_S)は、ファイル名の変数を作成し、現在の日付を取得し、変数を作成しています8日以上経過している
  • ファイル"/var/www/vhosts/system/example.com/httpdocs/backup_log.txt"には、Backup is created at $("date")
  • チャファイル所有者(chown)をrootから "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キー+アドインでファイルに次の行をコピー

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

このようなスクリプトを作成します。そして、あなたはスクリプトとして実行しようとしているユーザーのcrontabを編集することができます

#!/bin/sh -e 

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

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

gzip $location 

を:

$> crontab -e 

エントリ

を追加
01 * * * * ~/script_path.sh 

これにより、彼は毎日1時間ごとの最初の分です。

次にロールやその他の機能を追加するだけでいいです。

+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 
関連する問題