44

データベースのバックアップ用に多くのスクリプトを試しましたが、できませんでした。データベースを 1 時間ごとにバックアップしたいと考えています。
「/etc/cron.hourly/」フォルダーにファイルを追加し、chmod を 755 に変更しましたが、実行されませんでした。少なくとも私は擬似コードを書きます。

この操作のスクリプトを作成して、さらに何をすればよいか教えていただければ幸いです。このスクリプトファイルを/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")
  • ファイルの所有者 (chown) を root から "my_user" に変更します。「my_user」FTP アカウントからバックアップ ファイルとログ ファイルを開きたいためです。
  • 各cronの後にメールを送りたくありません。>/dev/null 2>&1追加されます。
4

10 に答える 10

106

何時間も作業した後、以下のようなソリューションを作成しました。利益を得ることができる他の人々のために貼り付けをコピーします。

最初にスクリプト ファイルを作成し、このファイルに実行権限を付与します。

# 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"
于 2013-10-30T12:19:20.397 に答える
35

次のようなスクリプトを作成します。

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

これにより、毎日毎時の最初の 1 分に実行されます。

次に、ロールやその他の機能を追加するだけで、準備完了です。

于 2013-10-29T17:26:31.367 に答える
3
#!/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="abc@as.in"
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
于 2015-11-05T06:19:09.133 に答える
1

次に、次の内容をスクリプト ファイル (/backup/mysql-backup.sh など) にコピーし、Linux システムに保存します。

    #!/bin/bash

    export PATH=/bin:/usr/bin:/usr/local/bin
    TODAY=`date +"%d%b%Y"`

    DB_BACKUP_PATH='/backup/dbbackup'
    MYSQL_HOST='localhost'
    MYSQL_PORT='3306'
    MYSQL_USER='root'
    MYSQL_PASSWORD='mysecret'
    DATABASE_NAME='mydb'
    BACKUP_RETAIN_DAYS=30   

    mkdir -p ${DB_BACKUP_PATH}/${TODAY}
    echo "Backup started for database - ${DATABASE_NAME}"

    mysqldump -h ${MYSQL_HOST} \
   -P ${MYSQL_PORT} \
   -u ${MYSQL_USER} \
   -p${MYSQL_PASSWORD} \
   ${DATABASE_NAME} | gzip > ${DB_BACKUP_PATH}/${TODAY}/${DATABASE_NAME}-${TODAY}.sql.gz

if [ $? -eq 0 ]; then
  echo "Database backup successfully completed"
else
  echo "Error found during backup"
  exit 1
fi


##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####

DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`

if [ ! -z ${DB_BACKUP_PATH} ]; then
      cd ${DB_BACKUP_PATH}
      if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
            rm -rf ${DBDELDATE}
      fi
fi

スクリプトを作成またはダウンロードした後、適切に実行するために実行権限を設定してください。

$ chmod +x /backup/mysql-backup.sh

crontab -e コマンドを使用して、システムの crontab を編集します。次の設定を追加して、午前 3 時にバックアップを有効にします。

0 3 * * * root /backup/mysql-backup.sh
于 2020-03-07T16:11:31.957 に答える
0

このオープン ソース ツール、matiri、https://github.com/AAFC-MBB/matiriを考慮することができます。これは、Sqlite3 のメタデータを使用した同時 mysql バックアップ スクリプトです。特徴:

  • マルチサーバー: 複数の MySQL サーバーが、同じ物理サーバー上に配置されているか別の物理サーバーに配置されているかに関係なくサポートされます。
  • 並列: バックアップ対象のサーバー上の各データベースは、個別に並列に実行されます (同時実行数を設定可能: デフォルト: 3)
  • 圧縮: 各データベースのバックアップを圧縮
  • チェックサム: 保存されている各圧縮バックアップ ファイルの SHA256 とすべてのファイルのアーカイブ
  • アーカイブ済み: すべてのデータベース バックアップを 1 つのファイルにまとめて tar 化
  • 記録: Sqlite3 データベースに保存されたバックアップ情報

完全な開示:元のマトリの作者。

于 2018-03-17T08:04:18.873 に答える