在数据库备份过程中,我生成一个文本转储文件.由于数据库非常庞大,转储文件也很庞大,所以我用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进行这个特定的备份工作.恢复所需的时间不是问题.
这是 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 会为您创建自己的管道。
| 归档时间: |
|
| 查看次数: |
280 次 |
| 最近记录: |