use*_*547 64 mysqldump crontab
我在crontab上班途中遇到了问题.我想自动化MySQL数据库备份.
设置:
从shell开始,这个命令有效
mysqldump -u user -p[user_password] [database_name] | gzip > dumpfilename.sql.gz
Run Code Online (Sandbox Code Playgroud)
当我使用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
Run Code Online (Sandbox Code Playgroud)
在/ home/user/backup目录中每分钟创建一个文件,但是有0个字节.
但是,当我将此输出重定向到第二个目录backup2时,我注意到在其中创建了正确压缩的正确mysqldump文件.我无法确定我在第一个目录中的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
Run Code Online (Sandbox Code Playgroud)
我非常感谢你的解释.
谢谢
m79*_*lkm 93
首先执行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
Run Code Online (Sandbox Code Playgroud)
我的原始答案是将数据库转储重定向到许多压缩文件(没有双重压缩)的示例.(因为我扫描了这个问题并且严重错过了 - 抱歉)
这是重新压缩文件的示例:
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
Run Code Online (Sandbox Code Playgroud)
这是解释I/O重定向的好资源:http://www.codecoffee.com/tipsforlinux/articles2/042.html
Unm*_*esh 11
如果需要在备份文件名(Centos7)中添加日期时间,请使用以下命令:
/usr/bin/mysqldump -u USER -pPASSWD DBNAME | gzip > ~/backups/db.$(date +%F.%H%M%S).sql.gz
Run Code Online (Sandbox Code Playgroud)
这将创建文件:db.2017-11-17.231537.sql.gz
m79*_*lkm 10
您可以使用该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
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档
除了m79lkm的解决方案,我在这个主题上的 2 美分:
不要直接管道| 结果到 gzip 但首先将其转储为 .sql 文件,然后 gzip 它。
因此&& gzip,| gzip如果您有可用的磁盘空间,请选择。
转储本身的速度会加倍,但您将需要更多的可用磁盘空间。您的表将被锁定更短的时间,从而减少您的应用程序的停机时间/响应缓慢。最终结果将完全相同。
所以非常重要的是首先检查可用磁盘空间df -h
然后像这样执行你的转储:
mysqldump -u user-p [database_name] > dumpfilename.sql && gzip dumpfilename.sql
Run Code Online (Sandbox Code Playgroud)
另一个很好的技巧是使用选项--single-transaction。它可以防止表被锁定,但仍会产生可靠的备份。因此,您可能会考虑使用该选项。请参阅此处的文档。并且由于这不会为大多数查询锁定您的表,因此您实际上可以通过管道传输转储 | 直接在 gzip 中...(以防您没有可用磁盘空间)
mysqldump --single-transaction -u user -p [database_name] > dumpfilename.sql && gzip dumpfilename.sql
Run Code Online (Sandbox Code Playgroud)