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

问题描述 投票:0回答:6

我在让

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

设置:

  • Debian GNU/Linux 7.3(喘息)
  • 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

我非常感谢您的解释。

谢谢

cron mysql
6个回答
142
投票

首先执行 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


38
投票

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


16
投票

除了m79lkm的解决方案,我对这个主题的2分钱:

不要直接管道 |将结果放入 gzip 中,但首先将其转储为 .sql 文件,然后对其进行 gzip。
因此,如果您有可用磁盘空间,请选择

&& gzip
而不是
| gzip

根据您的系统,转储本身可以轻松实现双倍速度,但您将需要大量更多可用磁盘空间。您的表将锁定的时间更短,从而减少应用程序的停机时间/响应缓慢。最终结果将完全相同。

因此非常重要的是首先使用

df -h

检查可用磁盘空间

然后估计数据库的转储大小并查看它是否适合可用空间:

# edit this code to only get the size of what you would like to dump

SELECT Data_BB / POWER(1024,2) Data_MB, Data_BB / POWER(1024,3) Data_GB
FROM (SELECT SUM(data_length) Data_BB FROM 
information_schema.tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')) A;

(学分dba.stackexchange.com/a/37168

然后像这样执行你的转储:

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

另一个提示是使用选项

--single-transaction
。它可以防止表被锁定,但仍然会产生可靠的备份! 请参阅此处的文档。由于这不会锁定您的表对于大多数查询您实际上可以通过管道传输转储|直接在 gzip 中...(如果您没有可用磁盘空间)

mysqldump --single-transaction -u user -p [database_name] | gzip > dumpfilename.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

请参阅文档此处


1
投票

就我个人而言,我在根目录中创建了一个 file.sh(右 755),根据 crontab 的命令,文件谁执行此工作。

crontab代码:

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

文件.sh代码:

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

mysqldump 莫 | 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

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


0
投票

越南语,

lúcSữngngngngnn -dẫnnàyrấn,lúcsữdụngmysqldumpthếnàytạor ra rabản备份,khônngbịlỗifont khi khi khi Import,unicode ho hoh ho -nicodehoànchỉnhchỉnhrấtnhiều。 mình đã áp dụng cho vbulletin 。 web mình là ngaytho.me ,các bạn cần hỏi gì về mysql có thể hỏi mình nhé。

© www.soinside.com 2019 - 2024. All rights reserved.