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

mrzz3bfm  于 2023-02-28  发布在  Mysql
关注(0)|答案(5)|浏览(167)

我在使用crontab时遇到问题。我想自动备份MySQL数据库。
设置:

  • Debian GNU/Linux 7.3(中文版)
  • MySQL服务器版本:5.5.33 - 0+喘息1(Debian)
  • 目录user,backup和backup2具有755权限
  • MySQL数据库和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

我非常希望你能解释一下。
谢谢

of1yzvn4

of1yzvn41#

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

lbsnaicq

lbsnaicq2#

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

zzoitvuj

zzoitvuj3#

除了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
toe95027

toe950274#

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

k10s72fa

k10s72fa5#

就我个人而言,我已经创建了一个www.example.com(右755)在根目录,文件谁做这项工作,在crontab的顺序。file.sh (right 755) in the root directory, file who do this job, on order of the crontab.
Crontab代码:
10 2***根目录/根目录/backupautomatique.sh
File.sh code:
rm-f/home/mordb-148 - 251 - 89 - 66. sql.gz #(用于删除旧版本)
迈斯克敦莫尔|gzip〉/home/mordb-148 - 251 - 89 - 66. sql.gz(您所做的工作)
服务器-P2222/home/修改数据库-148 -251 -89 -66.sql.gz root@otherip:/home/修改数据库外部/修改数据库-148 -251 - 89 -66.sql.gz
(to如果发送服务器崩溃,发送副本到其他地方,因为太老了,像我一样;-))

相关问题