获取巨大的gziped文件的最后一行

tda*_*get 8 mysql bash shell

在数据库备份过程中,我生成一个文本转储文件.由于数据库非常庞大,转储文件也很庞大,所以我用gzip压缩它.生成转储时压缩是内联完成的(感谢Unix管道!).

在进程结束时,我通过观察最后一行来检查转储文件的有效性,并检查"转储完成"字符串的存在.在我的脚本中,我通过将最后一行提取到变量中来实现:

str=`zcat ${PATHSAVE}/dumpFull.sql.gz | tail -n1`
Run Code Online (Sandbox Code Playgroud)

由于数据库转储文件很大(目前超过200Gb),因此最终进程检查需要花费大量时间(目前超过180分钟).

我正在寻找一种方法来快速提取我的.gz文件的最后一行...任何人都有想法?

注1:对于解释上下文,我们可以说数据库是MySql社区,备份工具是mysqldump,生成的dumpfile是一个全文文件.操作系统是CentOs.备份脚本是Bash shell脚本.

注意2:我知道Percona xtraBackup,但在我的情况下,我想使用mysqldump进行这个特定的备份工作.恢复所需的时间不是问题.

O. *_*nes 4

这是 fifo(管道)和命令的工作tee。进行备份时使用此功能。

mkfifo mypipe
tail mypipe -1 > lastline.txt & mysqldump whatever | tee mypipe | gzip >dump.gz
rm mypipe
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

mkfifo mypipe将 fifo 对象放入当前工作目录中。它看起来像是一个可以同时写入和读取的文件。

tail mypipe -1 >lastline.txt 用于tail读取您写入的任何内容mypipe并将最后一行保存在文件中。

mysqldump whatever | tee mypipe | gzip >dump.gz执行转储操作,并将输出通过管道传输到tee命令。Tee 将输出写入mypipe 通过管道传送到gzip.

命令的两个部分之间&的 导致两个部分同时运行。

rm mypipe摆脱 fifo 对象。

Charles Duffy 指出,某些 shell(包括bash)具有进程替换,因此如果您使用这些 shell 之一,您的命令会更简单。

 mysqldump whatever | tee >(tail -1 > lastline.txt ) | gzip >dump.gz
Run Code Online (Sandbox Code Playgroud)

在这种情况下,shell 会为您创建自己的管道。

信用:通过管道输出到两个不同的命令