用于数据库备份的Linux shell脚本

tra*_*nte 38 mysql linux shell cron

我尝试了许多用于数据库备份的脚本,但我无法做到.我想每小时备份一次我的数据库.
我将文件添加到"/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将被添加.

tra*_*nte 94

经过数小时和数小时的工作,我创建了如下的解决方案.我为其他可以受益的人复制粘贴.

首先创建一个脚本文件并授予此文件可执行权限.

# 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
Run Code Online (Sandbox Code Playgroud)

然后使用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
Run Code Online (Sandbox Code Playgroud)

编辑:
如果使用InnoDB并且备份需要花费太多时间,则可以添加" single-transaction "参数以防止锁定.所以mysqldump行将是这样的:

mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
          --single-transaction mydatabase | gzip > "$fullpathbackupfile"
Run Code Online (Sandbox Code Playgroud)

  • 安全警告:使用--password参数可以通过在/ proc中查找进程命令行来发现您的密码.除非您已应用各种内核安全修补程序以阻止用户查看其他用户的进程信息,否则请勿在多用户系统上使用. (5认同)

Pet*_*Bus 31

创建一个类似于此的脚本:

#!/bin/sh -e

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

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

gzip $location
Run Code Online (Sandbox Code Playgroud)

然后,您可以编辑crontab脚本将要运行的用户:

$> crontab -e
Run Code Online (Sandbox Code Playgroud)

并附上条目

01 * * * * ~/script_path.sh
Run Code Online (Sandbox Code Playgroud)

这将使它在每天每小时的第一分钟运行.

然后你只需要添加你的卷和其他功能,你就可以了.

  • 如何将输出管道连接到gzip以节省磁盘空间? (4认同)

小智 7

我遇到了同样的问题.但我设法编写一个脚本.希望这会有所帮助.

#!/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
Run Code Online (Sandbox Code Playgroud)