gzip、发送到服务器、ungzip

gzip、发送到服务器、ungzip

我正在编写一个脚本来备份和 gzip 一组 MySQL 表,将它们 scp/ssh 到不同的服务器,然后解压它们,当前脚本是:

#!/bin/bash

DATE=`date +"%d_%b_%Y_%H%M"`
BACKUP_DIR=/mnt/data/backups/saturday/

echo Creating new directory /mnt/data/backups/saturday/fathom_$DATE
sudo mkdir /mnt/data/backups/saturday/fathom_$DATE
sudo chmod 777 /mnt/data/backups/saturday/fathom_$DATE

mysqldump pacific_fathom user_types > /mnt/data/backups/saturday/fathom_$DATE/user_types.sql
echo Dumping users ...
mysqldump pacific_fathom users > /mnt/data/backups/saturday/fathom_$DATE/users.sql
echo Dumping users_roles ...
mysqldump pacific_fathom users_roles > /mnt/data/backups/saturday/fathom_$DATE/users_roles.sql

tar -zvcpf $BACKUP_DIR/PlatformDB-$DATE.tar.gz /mnt/data/backups/saturday/fathom_* | ssh [email protected] 'tar -xzf - -C /mnt/data/backups/saturday'

echo Finished!

备份有效,它将压缩文件,但它告诉我它有错误

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

它创建的输出文件是PlatformDB-22_Jul_2021_1553.tar.gz

它永远不会移动到 ssh 部分(最后在远程服务器中检查并且那里没有登录),所以我对为什么会收到此错误感到有点困惑。它创建的 tar.gz 文件可以使用tar -xzf - -C /mnt/data/backups/saturday脚本的一部分进行解压。我确实必须-用文件名替换。但我认为这不会对剧本产生影响。而且这在自动化环境中也行不通。任何帮助将不胜感激!

答案1

该命令tar -zvcpf ...$DATE.tar.gz /mnt/data/backups/saturday/fathom_*将 gzip 压缩的备份写入$DATE.tar.gz并输出已备份的文件列表。

然后将该文件列表通过管道传输到.显然,文件列表不是gzipped格式,这导致了错误。ssh [email protected] 'tar -xzf - ...

解决方案:将内容发送$DATE.tar.gz到ssh命令。例如首先创建本地备份文件,然后cat $DATE.tar.gz | ssh ....或者,如果您不需要本地备份文件,请在标准输出上创建备份:

tar -zvcpf - /mnt/data/backups/saturday/fathom_* | ssh ...

您还可以尝试该tee命令并将备份写入标准输出和本地文件:

tar -zvcpf - /mnt/data/backups/saturday/fathom_* | tee $DATE.tar.gz | ssh ...

作为与这个问题不太相关的旁注,我只是注意到当存档写入文件时 tar 将文件列表写入 stdout,而当存档写入 stdout 时 tar 将文件列表写入 stderr。聪明的!

相关内容