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


75

我在crontab上班时遇到问题。我想自动执行MySQL数据库备份。

设置:

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

从外壳程序执行此命令

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

我将不胜感激的解释。

谢谢


对不起,第一行代码中的错字应该是gzip而不是zip
user3397547 2014年

我不会每分钟都运行一次
m79lkm 2014年

我运行它只是为了测试命令。
user3397547 2014年

Answers:


110

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

例如,此命令将转储数据库并通过gzip运行它,数据最终将存储在three.gz中。

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


我遇到的问题是mysqldump和gzip命令正常工作。在第一次重定向到目录“备份”时,将创建一个0字节的文件。第二个重定向到不涉及任何重新压缩的目录“ backup2”,将创建所需的文件。我想知道为什么会这样。
user3397547 2014年

1
输出没有通过管道传递到gzip中,而是被重定向了。它将重定向直到到达最后一部分。那就是gzip将其拾取并压缩的时间
m79lkm 2014年

1
Bash识别了重定向,并首先尝试打开文件。打开(创建)文件,然后bash确定如何重定向数据。如果打开文件时出错,该命令将失败并将错误写入stderr。如果再次重定向输出,则第一个命令的标准输入将发送到下一个文件。如果文件打开并且没有其他重定向,则数据将被写入文件。
m79lkm 2014年

感谢您的解释,bash会将stdin输出重定向到行的末尾,然后gzip会在末尾压缩文件。我认为我的初始代码中有> / dev / null 2>&1,并且mysqldump文件正被发送到/ dev / null并被丢弃。现在,我的代码可以正常工作了。
user3397547 2014年

1
次要:请勿在命令中添加密码。它最终将出现在您的历史记录中,并且可以被检索。(对于cron来说很好)
tibi

17

如果需要在备份文件名(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


12

您可以使用以下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

在这里查看文档


我的问题是第一次重定向如何导致一个0字节的文件,而第二次重定向如何导致一个完整的文件
user3397547 2014年

2
抱歉-我发布了您原始问题的答案。我将其留在此处-希望这个小片段对某人有用。
m79lkm 2014年

1
确实是:)
保罗·斯特凡

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

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

此外,该选项--single-transaction可防止锁定表,但仍可进行可靠备份。因此,您可以考虑使用该选项。在这里查看文档

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.