Повреждённый чанк почти всегда ограничен одним файлом региона, и исправление почти всегда сводится к замене этого одного файла - или повреждённых чанков внутри него, - а не всего мира. Найдите координаты в логе сервера, вычислите, в каком файле r.X.Z.mca они лежат, остановите сервер и либо восстановите этот файл из резервной копии, либо удалите плохие чанки, чтобы они сгенерировались заново. Для второго варианта есть инструмент MCA Selector. Всё остальное в этой статье - о том, как сделать это точно, как распознать ошибки, которые похожи на повреждение, но им не являются, и как сделать так, чтобы это вряд ли повторилось.
Как хранится мир Minecraft#
Мир Java Edition - это папка с маленькими файлами, а не один большой файл. Именно поэтому повреждение обычно локально.
| Путь | Что в нём |
|---|---|
level.dat | Настройки мира, сид, время, игровые правила, версия данных |
level.dat_old | Предыдущая копия level.dat |
region/r.X.Z.mca | Блоки и блочные сущности для 32 x 32 чанков |
entities/r.X.Z.mca | Мобы, предметы, стойки для брони (1.17 и новее) |
poi/r.X.Z.mca | Точки интереса: кровати, рабочие места, порталы |
playerdata/<uuid>.dat | Инвентарь, позиция и статистика каждого игрока |
data/ | Карты, рейды, скорборды, данные структур |
Каждый файл региона покрывает 32 на 32 чанка, то есть 512 на 512 блоков. Файл начинается с заголовка размером 8 КиБ - таблицы, где указано, где хранится каждый из 1024 чанков, и таблицы временных меток, - за которым идут сами чанки, каждый сжатый и записанный в секторы по 4 КиБ.
В Paper и Spigot незер и энд - отдельные папки миров: world_nether/DIM-1/region/ и world_the_end/DIM1/region/. В ванильном сервере они лежат внутри основной папки мира, в world/DIM-1/ и world/DIM1/. Прежде чем искать файл, проверьте, какая раскладка у вас.
От координат блока к файлу региона
Арифметика короткая:
chunk X = floor(block X / 16)chunk Z = floor(block Z / 16)region X = floor(chunk X / 32)region Z = floor(chunk Z / 32)Значит, блок с X -1200, Z 3400 находится в чанке -75, 212, а тот - в регионе -3, 6: это файл r.-3.6.mca. Обратите внимание на округление вниз: отрицательные координаты округляются вниз, поэтому блок -1 находится в чанке -1 и регионе -1, а не 0. Экран F3 в игре прямо показывает чанк и имя файла региона для того места, где вы стоите, - это самый быстрый способ проверить расчёт.
Что на самом деле значат ошибки в логе#
Повреждение проявляется в логе сервера, часто в виде такой длинной трассировки стека, что полезная строка в ней теряется. Вот распространённые сообщения и на что они указывают.
`Chunk file at [x, z] is in the wrong location; relocating. (Expected [a, b], got [c, d])` - сохранённые координаты чанка не совпадают с его позицией в файле региона. Обычно это результат того, что кто-то копировал или переименовывал файлы регионов, или работы старого внешнего инструмента. Сервер перемещает чанк и продолжает работу. Не срочно, но выясните, кто двигал файлы.
`Couldn't load chunk [x, z]` с исключением следом - данные чанка не удалось прочитать. Исключение ниже объясняет почему: ошибка распаковки (ZipException, «incorrect header check», «unexpected end of ZLIB input stream») означает, что сохранённые байты повреждены; ошибка чтения NBT означает, что данные распаковались, но некорректны. Обычно сервер генерирует чанк заново, а значит, рельеф или постройки там заменяются свежей генерацией - проверьте это место в игре.
Ошибки файла региона, где упоминается обрезанный файл или неверный сектор, - заголовок файла региона указывает за конец файла, как правило, потому что процесс остановился во время записи. Paper пытается восстановить повреждённый заголовок, сканируя файл, и пишет об этом в лог; уцелеют ли чанки, зависит от того, сколько успело записаться.
Ошибки с названием сущности или блочной сущности - один плохой моб, рамка, сундук или табличка в остальном нормальном чанке. Часто плагин или мод записал данные, которые сервер не может разобрать. Раздел «Entity being ticked» или «Block entity being ticked» в краш-репорте даёт координаты. Как читать этот раздел, показано в статье краш-репорты Minecraft.
Мир полностью новый, или при запуске ошибки `level.dat` - level.dat отсутствует или не читается. Это единственный файл, потеря которого затрагивает весь мир; о нём ниже.
Отчего возникают повреждения#
Файлы регионов перезаписываются постоянно, и опасен именно момент записи. Почти каждый случай сводится к одному из этих:
- Процесс остановился посреди записи. Убийство процесса вместо чистой остановки, завершение из-за нехватки памяти, падение хоста. Всё, что записывалось в этот момент, может оказаться записанным наполовину.
- Заполнился диск. Запись, которая не может завершиться, оставляет обрезанный файл. Обычные виновники - резервные копии и логи, заполнившие диск; что съедает место, разобрано в статье о месте на диске.
- Файлы правили, пока сервер работал. Загрузка файла региона, запуск MCA Selector или редактора на живом мире, восстановление бэкапа на работающий сервер. Следующее сохранение сервера перезапишет ваше изменение или перемешается с ним.
- Несовпадение версий. Открытие мира в более старой версии Minecraft, чем та, в которой он сохранён, или внешний инструмент, который не понимает текущий формат. Данные могут потеряться или прочитаться неверно.
- Плагины и моды, пишущие плохие данные. Плагин сохраняет некорректные данные в блочной сущности или сущности, и потом сервер не может их загрузить.
- Настоящие сбои хранилища. Редкость на современном оборудовании с файловыми системами с контрольными суммами, но на дешёвых машинах не исключены.
Большинство этих причин можно предотвратить - этому посвящён последний раздел статьи.
Как найти повреждение#
Начните с лога. Найдите в нём координаты из ошибки и переведите их в файл региона, как описано выше. Если ошибка даёт координаты чанка (большинство так и делают), нужен только второй шаг.
$ grep -n "Couldn't load chunk\|wrong location\|region" logs/latest.log | tail -20В панели ту же работу делает поиск в консоли или скачанный logs/latest.log; более старые логи лежат в той же папке сжатыми в gzip как YYYY-MM-DD-N.log.gz.
Затем осторожно сходите посмотреть. Телепортируйтесь рядом с координатами - а не прямо в них - в режиме наблюдателя и посмотрите, как выглядит чанк: пропавшие постройки, свежесгенерированный рельеф, прорезающий базу, ровная дыра в пустоту. У чанка, который сгенерировался заново посреди постройки, резкая граница в 16 блоков, и её трудно с чем-то спутать.
Если затронуто несколько чанков в разных регионах, прежде чем что-то чинить, поищите общую причину. Повреждения во многих регионах одновременно указывают на заполнение диска или падение, и их может быть больше, чем вы нашли.
Восстановление в MCA Selector#
MCA Selector - бесплатное настольное приложение с открытым кодом для просмотра и редактирования файлов регионов. Он показывает мир в виде карты, позволяет выбирать чанки вручную или по запросу и умеет удалять, экспортировать и импортировать их. Это стандартный инструмент для хирургии на уровне чанков.
Работайте с копией, никогда - с живым сервером:
- Остановите сервер и скачайте папку мира по SFTP или хотя бы папки
region,entitiesиpoiпострадавшего измерения. Реквизиты подключения - в статье SFTP и файловый менеджер. - Откройте папку мира в MCA Selector. Повреждённые чанки часто выглядят пустыми или вызывают сообщение об ошибке, когда инструмент пытается их прочитать.
- Выделите повреждённые чанки.
- Удалите их или импортируйте замену из резервной копии (оба варианта объяснены ниже).
- Сохраните, загрузите изменённые файлы обратно на остановленный сервер, запустите его и проверьте место в игре.
Выбор на шаге 4 определяет, как будет выглядеть это место потом:
- Удаление - чанки сгенерируются из сида при следующей загрузке. Правильно для дикой местности, неправильно для построек.
- Импорт из резервной копии - MCA Selector умеет импортировать чанки из другой копии мира, так что можно взять только эти чанки из вчерашнего бэкапа, оставив всё остальное в сегодняшнем состоянии.
Фильтр запросов MCA Selector - ещё и правильный инструмент для другой, похожей задачи: обрезки мира. Выбор чанков по InhabitedTime (сколько времени в них провели игроки) находит чанки, которые сгенерировались, но по-настоящему никем не посещались, и их удаление уменьшает раздутый мир, не трогая базы. Почему миры вообще раздуваются, разобрано в статье граница мира и прегенерация.
Обновляйте MCA Selector. Формат регионов меняется между версиями Minecraft, и старая копия любого внешнего инструмента скорее станет причиной повреждения, чем средством его исправить.
Восстановление одного файла региона из резервной копии#
Если повреждённое место - постройка и у вас есть резервная копия, восстановить файл региона быстрее, чем оперировать чанки, и теряется только то, что изменилось в этом квадрате 512 на 512 с момента бэкапа.
- Остановите сервер.
- Возьмите из резервной копии
region/r.X.Z.mcaпострадавшего региона. Возьмите такжеentities/r.X.Z.mcaиpoi/r.X.Z.mcaс тем же именем, чтобы мобы, рамки, рабочие места жителей и кровати соответствовали блокам. - Скопируйте их поверх текущих файлов на сервере.
- Запустите сервер и проверьте место.
Что вы теряете: всё построенное в этом квадрате после бэкапа. Что сохраняете: всё остальное в мире и инвентарь каждого игрока, потому что инвентари лежат в playerdata, а не в регионе. Если игрок после создания бэкапа положил предметы в сундуки внутри восстановленного региона, они пропали; предупредите его.
В RE:NODE резервные копии можно скачать из панели, так что можно распаковать копию у себя, вытащить три файла и загрузить через файловый менеджер только их - вместо того чтобы восстанавливать весь бэкап и откатывать прогресс всех остальных игроков. Полное восстановление - одна кнопка, когда оно действительно нужно. В любом случае в статье резервные копии, которые действительно восстанавливаются объясняется, почему это стоит проверить до того дня, когда понадобится.
Повреждение level.dat и playerdata#
`level.dat` хранит сид, точку спавна, игровые правила и настройки мира. Если он повреждён, сервер может создать новый мир или отказаться запускаться. Minecraft держит предыдущую версию как level.dat_old: остановите сервер, отложите повреждённый файл в сторону, переименовав его, скопируйте level.dat_old в level.dat и запустите снова. Если повреждены оба, возьмите level.dat из любой резервной копии - изо дня в день он почти не меняется, и старый сбросит только время мира и несколько счётчиков.
Файлы игроков лежат в playerdata/<uuid>.dat, и рядом с каждым есть копия .dat_old. У игрока, у которого после падения пропал инвентарь или который появляется на спавне мира ни с чем, может быть повреждён файл; копия _old обычно отстаёт на одно сохранение. Восстанавливайте её при остановленном сервере или как минимум когда игрок не в сети, потому что сервер записывает файл при выходе игрока.
playerdata/ 4c2a9b1e-....dat 4c2a9b1e-....dat_oldПрофилактика повреждений#
Ничего сложного тут нет, и большинство серверов, потерявших чанки, пропустили один из этих пунктов:
- Останавливайте сервер чисто.
stopв консоли сохраняет все миры и завершает работу. Убийство процесса - нет. В RE:NODE кнопки Stop и Restart отправляют чистую остановку; Kill - нет, она для сервера, который перестал отвечать. - Не выходите за лимит памяти. Сервер, убитый из-за нехватки памяти, не был остановлен чисто. Если сервер раз за разом упирается в лимит, это риск повреждения, а не только проблема стабильности, - признаки объяснены в статьях сколько RAM нужно серверу Minecraft и почему игровой сервер постоянно перезапускается.
- Оставляйте свободное место на диске. Никогда не позволяйте диску сервера заполниться. Обычно место съедают старые логи, старые бэкапы, хранящиеся в папке сервера, и заброшенные миры.
- Никогда не правьте живой мир. Останавливайте сервер, прежде чем загружать, восстанавливать или редактировать что-либо в папках мира.
- Делайте согласованные резервные копии. Бэкап, снятый в момент записи чанков, может захватить наполовину записанный файл. Используйте
save-off,save-all flush, сделайте бэкап, затемsave-on- или останавливайте сервер на время бэкапа, - чтобы копия была согласованной. Это подробно разобрано в руководстве по резервному копированию мира. - Обновляйтесь только в одну сторону. Никогда не открывайте мир в более старой версии, чем та, в которой он сохранялся последним. Перед обновлением сделайте бэкап; после обновления без этого бэкапа пути назад нет. Безопасный порядок описан в статье обновление версии Minecraft.
save-offsave-all flush# take the backup heresave-onFAQ#
Может ли повреждённый чанк распространиться на остальной мир?
Нет. Каждый чанк хранится независимо, и плохой чанк не портит соседей. Распространяется причина: если заполнился диск или сервер убили, другие файлы, записывавшиеся в то же время, тоже могут быть повреждены, поэтому проверьте лог на наличие других ошибок.
Удалит ли удаление повреждённого чанка мою постройку?
Да, если постройка была в нём. Удалённый чанк генерируется из сида заново как свежий рельеф. Удаляйте чанки в дикой местности, а всё, что построили игроки, восстанавливайте из резервной копии.
Есть ли в Minecraft встроенная команда восстановления?
Для повреждённых данных нет. Параметр сервера --forceUpgrade перезаписывает каждый чанк в текущем формате, что может помочь с чанками старого формата после обновления, но повреждённые байты он не чинит. Регионы восстанавливают внешними инструментами или из резервных копий.
После падения мой мир сбросился на новую карту. Всё пропало?
Скорее всего, нет. Проверьте, совпадает ли level-name в server.properties с папкой мира и существует ли level.dat. Если level.dat повреждён, восстановите его из level.dat_old. Файлы регионов со всеми вашими постройками обычно не тронуты.
Безопасно ли запускать MCA Selector на работающем сервере?
Нет. Всегда сначала останавливайте сервер и работайте с копией. Сервер держит чанки в памяти и при следующем сохранении перезапишет ваши изменения или перемешает свои записи с вашими.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.