«Удали временные файлы» — и я дропнул нафиг всю базу данных
Это был мой второй месяц на новом месте. Я ещё не до конца понимал архитектуру системы, но уже вполне уверенно держался — учился быстро, читал документацию запоем, задавал правильные вопросы. Тогда я считал, что всё идёт хорошо.
Было обычное утро вторника. Технический директор Андрей зашёл ко мне с просьбой, которая казалась абсолютно невинной:
— Макс, у нас заканчивается место на prod-db-01. Там где-то есть временные файлы от старых бэкапов, почисти, пожалуйста.
— Хорошо, посмотрю.
Я зашёл на сервер. Открыл df -h. Действительно — диск забит под 94%. Начал смотреть, где место. du -sh /* — ничего подозрительного. Тогда запустил find / -name "*.tmp" -type f — и вот оно, целая папка /var/backup/temp/ с файлами с расширением .tmp общим весом около 180 гигабайт.
Временные файлы. Именно то, о чём говорил Андрей.
Я выполнил rm -rf /var/backup/temp/. Получил ошибку прав. Повторил с sudo. Команда отработала молниеносно — что меня немного удивило: для 180 гигабайт это подозрительно быстро. Но я не придал этому значения.
Через двадцать минут ко мне подошёл бэкенд-разработчик Слава с характерным выражением лица человека, которому только что сообщили о смерти любимого питомца:
— Макс, у нас приложение упало. API не отвечает вообще. База говорит «connection refused».
Я зашёл на сервер. Попробовал сделать простейший SELECT — и тут у меня похолодело внутри:
ERROR: could not open file "base/16384/1259": No such file or directory
Через три минуты до меня дошло: папка /var/backup/temp/ — это была не папка с временными бэкапами. Это был симлинк. Симлинк на /var/lib/postgresql/14/main/base/. Кто-то, видимо в процессе миграции полгода назад, создал символическую ссылку с историческим названием, и она там тихо жила. А я, такой молодец, удалил через неё всю директорию с данными PostgreSQL. Всю. До последнего файла.
База данных была жива. Процесс работал. Но данных больше не существовало физически.
Следующие два часа я провёл в состоянии, которое сложно описать словами. Это не паника — паника это когда хаотично двигаешься. Я наоборот — сидел совершенно неподвижно и методично восстанавливал базу из последнего бэкапа. Бэкап был. Слава богу, бэкап был. Последний — в 03:00 ночи. Мы потеряли восемь часов транзакций.
Потом было долгое молчаливое совещание с Андреем. Он не кричал. Он вообще почти не говорил. Это было хуже крика.
Я написал подробный post-mortem. Ввёл правило: перед любым rm на проде обязательно проверять ls -la и file — убедиться, что это не симлинк. Добавил в онбординг пункт о том, как работают симлинки в Linux.
Восемь часов данных так и не восстановили. Клиенты получили извинения. Я остался работать — Андрей оказался человеком, который верит в то, что ошибки надо исправлять, а не наказывать за них. Но ту папку с симлинком я помню до сих пор.
Recommended Comments