Я понял. Мне пришлось убить все процессы, которые удерживали эти данные - в данном случае Oracle.
Также я думаю, что должен был опубликовать это на сервере. Сожалею!
Я telnetting в коробку Solaris 5.9, которая должна хранить нашу базу данных оракула. Я удалил старую версию базы данных, попытался перейти на новую версию (вся база данных составляет 90 ГБ), но я продолжал получать ошибки «диск заполнен». Я побежал
df -hk
и обнаружил, что раздел (называемый "/ d02"), который я пытался переместить, имел общий объем 135 ГБ, использовалось 123 ГБ и доступно 10 ГБ. Тем не менее, когда я бегу
ls -lah /d02
Я получаю 4 каталога: 3 из них 512B и 1 8KB.
Когда я удалил старую базу данных oracle, пространство как-то не освободилось? Как я могу освободить пространство или хотя бы увидеть, как мое пространство занято?
Спасибо за ваше время.
Я понял. Мне пришлось убить все процессы, которые удерживали эти данные - в данном случае Oracle.
Также я думаю, что должен был опубликовать это на сервере. Сожалею!
Да, вы обнаружили причину. В Unix удаление файла удаляет ссылку из списка доступа в каталоге. Тем не менее, он не может удалить содержимое, пока не будет закрыт дескриптор файла, который связан с файлом. Это довольно распространенная проблема, которую трудно отследить после свершившегося факта.
После того, как дескриптор файла закрыт, ссылки на данные могут быть выпущены в свободный список, как вы узнали. Скорее всего, файл журнала все еще был открыт. Возможно, вы обнаружили какое-то странное поведение после перезапуска базы данных, так как ее местоположение в журнале отсутствует, и она начинает регистрироваться на консоли или в других странных местах, таких как / tmp.
+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
показывает исходное имя файла (и [удалено]) в выводе.