如何调试这个?这个问题是这两天突然出现的。网站的所有备份均已损坏。
如果备份只是保留为tar
,则没有问题,但是一旦 tar 被压缩为 ,gz
否则xz
我无法解压缩它们。
有大量可用磁盘
Local disk space 2.68 TB total / 2.26 TB free / 432.46 GB used
错误
tar: Skipping to next header[===============================> ] 39% ETA 0:01:14
tar: A lone zero block at 2291466===============================> ] 44% ETA 0:01:13
tar: Exiting with failure status due to previous errors
878MiB 0:00:58 [15.1MiB/s] [===================================> ] 44%
为什么这么说Skipping to next header
?它以前从未这样做过。有些文件出了严重的问题。
目录中有大约 15k 个 pdf、jpg 或 png 文件。
命令
pv $backup_file | tar -izxf - -C $import_dir
一定有一些数据破坏了压缩。
我还尝试通过执行以下操作来检查硬盘的运行状况:
# getting the drives
lsblk -dpno name
smartctl -H /dev/sda
smartctl -H /dev/sdb
在两个驱动器上我都得到这个:
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
如何找出哪些文件损坏了 tar.gz?我只想删除它们。
更新
现在已将所有文件复制到另一台服务器,我遇到了完全相同的问题。我可以压缩所有内容并毫无问题地提取它,但是一旦我想压缩文件,我就无法解压缩它们(gz/xz)。
答案1
您的文件已被截断或损坏,因此xz
无法到达数据末尾。tar
抱怨是因为存档停在中间,这是合乎逻辑的,因为xz
无法读取整个数据。
执行以下命令查看问题出在哪里:
cat /var/www/bak/db/2017-05-20-1200_mysql.tar.xz >/dev/null
xzcat /var/www/bak/db/2017-05-20-1200_mysql.tar.xz >/dev/null
如果cat
出现抱怨,则磁盘上的文件已损坏,并且操作系统检测到损坏。检查内核日志以获取更多信息;通常此时需要更换磁盘。如果只是xz
抱怨,那么操作系统没有检测到任何损坏,但文件仍然无效(损坏或截断)。无论哪种方式,您都将无法恢复该文件。您需要从离线备份中恢复它。
答案2
我没有看到任何关于如何创建损坏的 tar 文件的内容?
您说它是来自网站的备份,但您显示的问题都是在恢复/解压时出现的,因此(源)是您需要进行故障排除的地方。
如果将备份移动到另一台计算机/位置后无法解压缩文件,则它们必须是创建错误或在传输过程中损坏。
要定位错误的来源:
- 在网络服务器上手动创建备份(不带
pv
和不带-i
) - 手动测试网络服务器上的备份(不带
pv
和不带-i
)
如果到目前为止没有发现问题:
- 从网络服务器复制备份
- 在目标机器上测试复制的备份(不带
pv
和不带-i
)
如果到目前为止没有发现问题,则备份脚本不会像手动创建存档时那样创建存档(并且可能应该修改为手动执行的操作)。
另外,请确保使用所有相关命令的绝对路径。如果系统中有坏的$PATH
和/或$LD_LIBRARY_PATH
变量以及入侵者,则您可能正在使用特洛伊木马二进制文件,这可能会导致意外的副作用。
当然也可能tar
涉及不兼容的版本,除非两个系统都是 debian。你可以尝试强制POSIX- 两侧模式。
答案3
您使用的标志-i
的长形式是--ignore-zeros
。这就是为什么 tar 不会抱怨文件损坏的原因。因此,如果您想调试 tar 文件,只需删除该-i
选项,您就会得到损坏文件的列表。
还有另外 2 种方法可以在 UNIX 上查找损坏的文件(一般来说)。我引用另一个问题中给出的答案。
rsync 可用于复制目录,并且如果任何错误导致 rsync 终止,则能够从终止点重新启动复制。
使用 rsync 的
--dry-run
选项,您可以查看将复制的内容,而无需实际复制任何内容。--stats
和选项--progress
也很有用。 and--human-readable
or-h
更容易阅读。例如
rsync --dry-run -avh --stats --progress /path/to/src/ /path/to/destination/
我不确定 Mac OS X 上是否默认安装了 rsync,但我在 Mac 上使用过它,所以我知道它肯定可用。
要快速检查子目录中的文件是否可以读取,您可以使用
grep -r XXX /path/to/directory/ > /dev/null
.搜索正则表达式并不重要,因为输出无论如何都会被丢弃。STDOUT 被重定向到 /dev/null,因此您只会看到错误。
我在这里选择 grep 的唯一原因是它的
-R
递归选项。这里还有许多其他命令可以用来代替 grep,如果与 find 一起使用,甚至更多。
作为参考:查找损坏的文件
答案4
@MattBianco 回答的推理路线是我将有条不紊地遵循的解决这个特殊问题。
归零块表示 EOF,但这取决于块因子(默认值是编译常量,通常为 20)。焦油的--compare
|--diff
似乎是用--ignore-zeros
( -i
) 隐式执行的。
鉴于 的额外复杂性pv
,我怀疑tar -i
正在引起问题xz
,查看焦油人对阻塞因子的影响我建议首先删除-i
然后,如果这没有帮助,请替换为:
--read-full-records --blocking-factor=300
如果你只是在谷歌搜索后阅读这篇文章“tar:N 处的一个单独的零块”,并且不进行任何管道操作,然后尝试--ignore-zeros
。