이것을 디버깅하는 방법은 무엇입니까? 이 문제는 지난 이틀 동안 갑자기 나타났습니다. 웹사이트의 모든 백업이 손상되었습니다.
백업을 그대로 두면 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
? 이전에는 한 번도 수행된 적이 없습니다. 일부 파일에 심각한 문제가 있습니다.
디렉토리에는 약 15,000개의 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
물론, 두 시스템이 모두 데비안이 아닌 이상 호환되지 않는 버전 도 포함될 수 있습니다. 강제로 시도해볼 수 있습니다.POSIX- 양면 모드.
답변3
사용 중인 플래그 의 긴 형식 -i
은 입니다 --ignore-zeros
. 이것이 tar가 파일 손상에 대해 불평하지 않는 이유입니다. 따라서 tar 파일을 디버그하려면 해당 -i
옵션을 제거하면 손상된 파일 목록이 표시됩니다.
UNIX에서 (일반적으로) 손상된 파일을 찾는 다른 두 가지 방법이 있습니다. 나는 다른 질문에 주어진 대답을 인용합니다.
rsync를 사용하여 디렉터리를 복사할 수 있으며 오류로 인해 rsync가 종료되면 종료 지점에서 복제를 다시 시작할 수 있습니다.
rsync의
--dry-run
옵션을 사용하면 실제로 아무것도 복사하지 않고도 복사될 내용을 확인할 수 있습니다.--stats
옵션--progress
도 유용합니다. 또는 읽기가--human-readable
더-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의 답변에 대한 추론은 내가 체계적으로 따르는 것입니다.해결하다이 특별한 문제.
블록을 0으로 만드는 것은 EOF를 나타내지만 이는 블록 요소에 따라 다릅니다(기본값은 컴파일 상수, 일반적으로 20입니다). tar의 --compare
|는 ( )를 사용하여 암시적으로 수행 --diff
되는 것 같습니다 .--ignore-zeros
-i
문제를 일으키는 것으로 pv
의심되는 추가적인 복잡성을 고려하여 다음을 확인하십시오.tar -i
xz
차단 요인에 대한 Tar Man의 영향먼저 제거하는 것이 좋습니다-i
그런 다음 도움이 되지 않으면 다음으로 교체하세요.
--read-full-records --blocking-factor=300
구글링을 하다가 이 글을 보고 계시다면"tar: N에 단일 제로 블록", 배관을 하지 않고 시도하십시오 --ignore-zeros
.