mysqldump& gzip命令使用crontab正确创建MySQL数据库的压缩文件

时间:2014-03-09 03:58:03

标签: crontab mysqldump

我在让crontab工作时遇到问题。我想自动化MySQL数据库备份。

设置:

  • Debian GNU / Linux 7.3(wheezy)
  • MySQL服务器版本:5.5.33-0 + wheezy1(Debian)
  • 目录user,backup和backup2具有755权限
  • MySQL db和Debian帐户的用户名相同

从shell开始,此命令可以正常工作

mysqldump -u user -p[user_password] [database_name] | gzip > dumpfilename.sql.gz

当我使用crontab -e

将其放在crontab中时
* * /usr/bin/mysqldump -u user -pupasswd mydatabase | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/dev/null 2>&1

在/ home / user / backup目录中每分钟创建一个文件,但是有0个字节。

但是,当我将此输出重定向到第二个目录backup2时,我注意到在其中创建了正确压缩的正确mysqldumpfile。我无法确定我所犯的错误是什么导致第一个目录中的0字节文件和第二个目录中的预期输出。

* * /usr/bin/mysqldump -u user -pupasswd my-database | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

我非常感谢你的解释。

由于

5 个答案:

答案 0 :(得分:86)

首先执行mysqldump命令,并使用管道重定向生成的输出。管道将标准输出作为标准输入发送到gzip命令。在filename.gz之后,是输出重定向操作符(>),它将继续将数据重定向到最后一个文件名,这是保存数据的地方。

例如,此命令将转储数据库并通过gzip运行它,数据最终将以三个格式登陆

mysqldump -u user -pupasswd my-database | gzip > one.gz > two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 one.gz
-rw-r--r--  1 uname  grp  1246 Mar  9 00:37 three.gz
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 two.gz

我的原始答案是将数据库转储重定向到许多压缩文件(不进行双重压缩)的示例。 (因为我扫描了这个问题并且严重错过了 - 抱歉)

这是重新压缩文件的示例:

mysqldump -u user -pupasswd my-database | gzip -c > one.gz; gzip -c one.gz > two.gz; gzip -c two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp  1246 Mar  9 00:44 one.gz
-rw-r--r--  1 uname  grp  1306 Mar  9 00:44 three.gz
-rw-r--r--  1 uname  grp  1276 Mar  9 00:44 two.gz

这是解释I / O重定向的好资源:http://www.codecoffee.com/tipsforlinux/articles2/042.html

答案 1 :(得分:9)

您可以使用tee命令重定向输出:

/usr/bin/mysqldump -u user -pupasswd my-database | \
tee >(gzip -9 -c > /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz)  | \
gzip> /home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

请参阅文档here

答案 2 :(得分:5)

如果您需要在备份文件名(Centos7)中添加日期时间,请使用以下命令:

/usr/bin/mysqldump -u USER -pPASSWD DBNAME | gzip > ~/backups/db.$(date +%F.%H%M%S).sql.gz

这将创建文件:db.2017-11-17.231537.sql.gz

答案 3 :(得分:1)

除了上述m79lkm的解决方案之外,我在此主题上的2美分不是直接将结果以管道传输到gzip中,而是先将其转储为.sql文件,然后再进行gzip处理。 (使用&&代替|)

转储本身将更快。 (对于我测试的结果,它快一倍

否则,您的表将被锁定更长,并且应用程序的停机时间/响应缓慢会打扰用户。 mysqldump命令正在从您的服务器中获取大量资源。

所以我会选择“ && gzip”而不是“ | gzip”

重要提示:首先需要使用df -h 检查可用磁盘空间,因为您需要更多的内容然后进行管道传输| gzip。

mysqldump -u user -p[user_password] [database_name] > dumpfilename.sql && gzip dumpfilename.sql

->也会产生1个名为dumpfilename.sql.gz的文件

此外,选项--single-transaction可以防止表被锁定,但仍可以进行可靠的备份。因此,您可以考虑使用该选项。 See docs here

mysqldump --single-transaction -u user -p[user_password] [database_name] > dumpfilename.sql && gzip dumpfilename.sql

答案 4 :(得分:0)

我个人在crontab的根目录下创建了一个file.sh(右755),该文件负责此工作。

Crontab代码:

10 2 * * * root /root/backupautomatique.sh

File.sh代码:

rm -f /home/mordb-148-251-89-66.sql.gz#(要删除旧的)

mysqldump mor | gzip> /home/mordb-148-251-89-66.sql.gz(您所做的事情)

scp -P2222 /home/mordb-148-251-89-66.sql.gz root @ otherip:/home/mordbexternes/mordb-148-251-89-66.sql.gz

(如果发送服务器崩溃,因为太老了(如我;-),将副本发送到其他地方)

www.tikvamal.org