我正在编写一个脚本来备份和 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。聪明的!