Scripting

gzip, 發送到伺服器, ungzip

  • July 23, 2021

我正在編寫一個腳本來備份和 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 root@xx.xx.xx.xx '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腳本的一部分進行解包。我必須-用文件名替換。我不認為這會對腳本產生影響。這在自動化環境中也行不通。任何幫助將不勝感激!!!

該命令tar -zvcpf ...$DATE.tar.gz /mnt/data/backups/saturday/fathom_*將 gzip 後的備份寫入$DATE.tar.gz並輸出備份的文件列表。

然後將此文件列表通過管道傳輸到ssh root@xx.xx.xx.xx 'tar -xzf - .... 顯然,文件列表不是 gzip 格式的,這會導致錯誤。

解決方案:將內容髮送$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時將文件列表寫入stderr。聰明的!

引用自:https://unix.stackexchange.com/questions/659551