我正在尝试从 MySQL 备份中获得更多实用性。当备份通过 cron 作业完成时,我想使用 gzip 压缩我的备份。这是我目前执行备份的脚本。
#!/bin/sh
date=`date -Iminutes`
mysqldump --all-databases > /var/sqlbackup/sqlbackup-$date.sql -pmypassword
find /var/sqlbackup/ -mtime 3 | xargs rm
任何帮助都会有益,即使它只是关于如何做得更好的指示。
答案1
这是我使用的备份/维护脚本:
#!/usr/bin/sh
#backup all mysql databases
# list MySQL databases and dump each
DIR=
DATESTAMP=$(date +%Y%m%d)
DB_USER=
DB_PASS=
# remove old backups
find ${DIR} -type f -mtime +5 -exec rm -rf {} \;
DB_LIST=`mysql -u $DB_USER -p"$DB_PASS" -e'show databases;'`
DB_LIST=${DB_LIST##Database}
for DB in $DB_LIST;
do
FILENAME=${DIR}${DB}-${DATESTAMP}.sql.gz
mysqldump -u $DB_USER -p"$DB_PASS" --opt --flush-logs $DB | gzip > $FILENAME
done
mysqlcheck -u $DB_USER -p"$DB_PASS" --all-databases > /root/mysql_backups/check_errors-${DATESTAMP}.log
此脚本会为每个数据库生成单独的 gzip 压缩备份,这样如果只有一个数据库出现问题,您就不必恢复整个服务器的数据库。它还包括一些 mysql 检查完整性,并查找旧数据库备份并将其删除。
根据要求恢复:
我已经恢复过好几次了。这种事时有发生。
gunzip backup_file.sql.gz
mysql -u <username> -p <database_name> < backup_file.sql
可能有更“一行”的方式来做到这一点......但这就是它对我的作用。
答案2
#!/bin/sh
date=`date -Iminutes`
find /var/sqlbackup/ -name 'sqlbackup-*' -mtime +2 -delete
mysqldump --all-databases -pmypassword | gzip > /var/sqlbackup/sqlbackup-$date.sql.gz
您可以通过管道进行gzip
压缩。
我将 find 移到了 mysqldump 之前。我不确定您的数据库有多大,但它有助于降低磁盘使用率并避免任何空间问题。
通常,最好使用-mtime +2
而不是-mtime 3
来影响两天前的文件,而不是正好 3 天前的文件。这样,如果您的 cron 错过了一天,您就不会得到被删除遗漏的旧文件。
就我个人而言,我也更喜欢限制find
名称模式,以确保您不会意外删除任何内容。
-delete
如果您不想使用,find 中的选项会很有用。xargs
两种方法都可以,但我更喜欢尽可能少地使用命令。
答案3
您可以将其添加gzip /var/sqlbackup/sqlbackup-$date.sql
到脚本末尾。
答案4
您是否曾经研究过 R-FX 网络的 irsync ?
一个很棒的小脚本,可以让您获取数据库的热副本和 gzip 压缩,并将其发送到远程服务器。:)