备份 MySQL 数据库和 gzip

备份 MySQL 数据库和 gzip

我正在尝试从 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 压缩,并将其发送到远程服务器。:)

相关内容