如何调试:tar:一个单独的零块

cla*_*rkk 8 tar debian corruption

如何调试这个?最近几天突然出现这个问题。网站的所有备份都已损坏。

如果备份只是保留为tar,则没有问题,但是一旦 tar 被压缩为 ,gz或者xz我无法解压缩它们。

有很多空闲磁盘

Local disk space    2.68 TB total / 2.26 TB free / 432.46 GB used
Run Code Online (Sandbox Code Playgroud)

错误

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%
Run Code Online (Sandbox Code Playgroud)

为什么这么说Skipping to next header?它以前从未这样做过。某些文件出现了严重错误。

目录中有大约 15k pdf、jpg 或 png 文件。

命令

pv $backup_file | tar -izxf - -C $import_dir
Run Code Online (Sandbox Code Playgroud)

必须有一些数据破坏了压缩。

我还尝试通过执行以下操作来检查硬盘健康状况:

# getting the drives
lsblk -dpno name

smartctl -H /dev/sda
smartctl -H /dev/sdb
Run Code Online (Sandbox Code Playgroud)

在两个驱动器上我都得到了这个:

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Run Code Online (Sandbox Code Playgroud)

如何找出损坏 tar.gz 的文件?我只想删除它们。

更新

现在已将所有文件复制到另一台服务器,我遇到了完全相同的问题。我可以解压缩所有内容并毫无问题地提取它,但是一旦我想压缩文件,我就无法解压缩它们 (gz/xz)。

Gil*_*il' 7

您的文件被截断或损坏,因此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
Run Code Online (Sandbox Code Playgroud)

如果出现cat抱怨,则该文件在磁盘上已损坏并且操作系统检测到损坏。检查内核日志以获取更多信息;通常此时需要更换磁盘。如果只是xz抱怨,那么操作系统没有检测到任何损坏,但文件仍然无效(损坏或截断)。无论哪种方式,您都无法恢复此文件。您需要从离线备份中取回它。