Відновлення пошкодженого tgz архіву, після передачі по ftp

Відновлення пошкодженого tgz архіву, після передачі по ftp

Налаштовуючи бекап чергового сайту, зауважив що частина архівів бита. Дуже сильно здивувався такому сюрпризу. Вивчивши ситуацію, знайшов в чому справа.

Перш за все потрібно коротко розповісти як працюють бекапи у мене:







  • На сервері з сайтами, за визначеним розкладом запускається bash скрипт
  • В скрипті робиться дамп бази, архівується папка сайту і при необхідності різні доп. файли (наприклад крони).
  • До іменам отриманих файлів додається мітка часу і все це складається в бекап-папку відповідного сайту
  • Далі, файли копіюються на віддалений сервер за допомогою утиліти ftp
  • І наостанок чистимо папку з резервних копій, щоб на вихідному сервері зберігати тільки кілька останніх версій бекапа

Як і написано, система бекапа робить кілька архівів (мінімум 2-а: база + папка сайту). Так ось на сервері бекапов, я виявив що деякі архіви відкривається нормально (видно лістинг файлів), а частина пошкоджена. Саме те, що частина архівів була в нормі мене і ввело в ступор. Пошкоджений файл мав приблизно той же розмір що і на вихідному сервері, при цьому на вихідному сервері файл не був пошкоджений. Саме тому я запідозрив в некоректній роботі безпосередньо ftp передачу між серверами.







Проблема виявилася досить проста: кілька місяців тому, я перенаправив все бекапи на сервер з ОС Windows Server. Відповідно, і FTP сервер був піднятий рідний для Windows Server. Трохи погуглити, я дізнався наступне: при ASCII передачі з Linux сервера на Windows, по-різному обробляється переклад каретки (переклад рядка). Linux передає "\ n", Windows використовує "\ r \ n". Відповідно файл ламається.

Тепер давайте розберемося, чому частина файлів билася, а частина немає. В архівах, де всередині був один єдиний файл (наприклад дамп бази), архіватор міг прочитати ім'я файлу і показати його мені. В архівах де було кілька файлів, архіватор не можу прочитати другий файл і тому відразу повідомляв про помилку. Ну, а по суті при спробі розпакувати архів помилка була в обох випадках. Тобто враховуйте те, що якщо архіватор (WinRar, 7Zip) відкрив архів і ви бачите ім'я файлу, це ще не означає що архів цілий.

Гаразд, думаю ви вже зрозуміли, що я отримав багато битих архівів. Пошукавши рішення, я натрапив на цей пост: Repair corrupted binary files transfered via ftp in ASCII mode. У ньому описується ситуація схожа на мою, але найголовніше там описується як відновити такі файли. Зробити це досить просто:

Тепер треба розібратися як же поправити bash скрипт, щоб файліки відправлятися не биті? У цьому нам допоможе мануал на утиліту ftp, який можна знайти тут: man ftp. нас цікавить ось ця частина, де описуються команди, доступні після установки з'єднання:

binary - Встановлює режим передачі файлів для підтримки передачі двійкових образів.

Додаємо цю команду перед командою put, вийде щось типу:







Схожі статті