Solaris говорит, что мой раздел использует более 100 ГБ, но раздел выглядит пустым. Где используется пространство?

631

Я telnetting в коробку Solaris 5.9, которая должна хранить нашу базу данных оракула. Я удалил старую версию базы данных, попытался перейти на новую версию (вся база данных составляет 90 ГБ), но я продолжал получать ошибки «диск заполнен». Я побежал

df -hk 

и обнаружил, что раздел (называемый "/ d02"), который я пытался переместить, имел общий объем 135 ГБ, использовалось 123 ГБ и доступно 10 ГБ. Тем не менее, когда я бегу

ls -lah /d02 

Я получаю 4 каталога: 3 из них 512B и 1 8KB.

Когда я удалил старую базу данных oracle, пространство как-то не освободилось? Как я могу освободить пространство или хотя бы увидеть, как мое пространство занято?

Спасибо за ваше время.

0

3 ответа на вопрос

3

Я понял. Мне пришлось убить все процессы, которые удерживали эти данные - в данном случае Oracle.

Также я думаю, что должен был опубликовать это на сервере. Сожалею!

В вашу защиту, спасибо за размещение ответа на ваш вопрос. Теперь вам просто нужно принять это! :) 14 лет назад 0
2

Да, вы обнаружили причину. В Unix удаление файла удаляет ссылку из списка доступа в каталоге. Тем не менее, он не может удалить содержимое, пока не будет закрыт дескриптор файла, который связан с файлом. Это довольно распространенная проблема, которую трудно отследить после свершившегося факта.

После того, как дескриптор файла закрыт, ссылки на данные могут быть выпущены в свободный список, как вы узнали. Скорее всего, файл журнала все еще был открыт. Возможно, вы обнаружили какое-то странное поведение после перезапуска базы данных, так как ее местоположение в журнале отсутствует, и она начинает регистрироваться на консоли или в других странных местах, таких как / tmp.

2
toddkaufmann

+1 за ответ @UnixGeek: удаление файла не освобождает дисковое пространство до тех пор, пока процесс (ы) с открытым файлом не исчезнут.

«Стандартный» инструмент для отображения открытых файлов lsof- я до сих пор не думаю, что он включен в Solaris (прошло несколько лет с тех пор, как я был администратором Solaris или даже использовал его), но доступен из sunfreeware.

Быстрый гугл находит, что утилита Solaris pfilesможет сделать что-то подобное (но я этим не пользовался).

Кроме того, fuserна имя файла, но вы должны проверить его, прежде чем удалить файл (ы). fuserтакже полезно для определения того, что порт открыт, когда процесс сообщает, что он уже используется.

Я подключу Unixersal Translator от A Sysadmin (ROSETTA STONE), очень полезное руководство для тех, кто использует несколько Unices и переводит между ними.

Бонусный трюк для восстановления удаленных файлов в /procсистемах, которые все еще открыты процессом:

cat /proc/<pid>/fd/<fd-of-delete-file> > recovered.data 

Я использовал это в Linux, где ls -l /proc/<pid>/fdпоказывает исходное имя файла (и [удалено]) в выводе.