Работа с полным дисковым пространством в postgresql


14

У меня есть веб-приложение Django с бэкэндом postgresql 9.3.10 (в операционной системе Linux). Я столкнулся с ошибкой переполнения диска, так что даже если я пытаюсь обрезать таблицу, я получаю ошибки такого рода:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

Я не могу легко добавить больше дискового пространства на сервер и не могу удалить вещи на этой виртуальной машине. Тем не менее, есть несколько таблиц, которые являются кандидатами для усечения, но, похоже, я не могу усечь их и сейчас.

Кто-нибудь может дать мне совет, что я могу сделать здесь? Это сильно бьет по моему производственному серверу, и я здесь немного случайный администратор баз данных, так что я в полном замешательстве.


Вы можете освободить некоторое пространство, если можете (временно) удалить индекс ...
обрезать

Ответы:


9

Поскольку PostgreSQL должен записать WAL, прежде чем вносить какие-либо изменения в таблицы, ему необходимо свободное дисковое пространство, чтобы удалить объекты и освободить больше дискового пространства.

Если вы позволите заполнить диск, вы не сможете восстановить его из PostgreSQL. ЧетныйTRUNCATE еще нужно написать в WAL.

Таким образом, вы должны освободить место на томе или расширить его. Если ваши файлы журналов PostgreSQL находятся pg_logв каталоге данных, вы можете безопасно удалить некоторые из них и перезапустить Pg.

Вы не удалять pg_xlogили pg_clog. Это не журналы ошибок сервера, а критически важные части базы данных, журнала транзакций и журнала фиксации.


Почему TRUNCATEнужно писать в wal, и как выглядит эта запись в WAL?
Эван Кэрролл

«truncate не регистрирует полные данные, а только тот факт, что произошло усечение. Чтобы иметь возможность откатить его, базовый файл сохраняется до фиксации транзакции». [источник] ( postgresql.org/message-id/… Таким образом, запись truncate в стене очень мала. Всего байт. Если бы это была полная необходимая загрузка пространства, вы, вероятно, могли бы получить ее rm -rf /tmp/*или удалить свой vimrc.
Эван Кэрролл

@EvanCarroll rm -rf /tmp/*... который может удалять и те вещи, которые вам могут понадобиться, например, сокеты приложений и т. Д. Лучше быть более избирательным. Что касается необходимого места, вы правы, оно минимально - 8k пустая таблица + несколько килобайт записей WAL для усечения, распределения xid, записи коммита и т. Д.
Крейг Рингер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.