
Использую PostgreSQL 9.3. У меня был долго выполняющийся запрос, обновляющий около 8 млн строк. Что-то явно пошло не так. Через 2 дня я получил предупреждение о малом количестве места на диске. Я остановил запрос и вот что увидел.
root@server:/var/lib/postgresql/9.3/main# du -BM * | sort -n
1M global
1M pg_notify
1M pg_serial
1M pg_snapshots
1M pg_stat
1M pg_stat_tmp
1M pg_tblspc
1M pg_twophase
1M PG_VERSION
1M pg_xlog/archive_status
1M mydb.opts
1M mydb.pid
3M pg_subtrans
7M base/1
7M base/12030
7M base/12035
11M base/22029472
21M pg_clog
72M pg_multixact/offsets
315M pg_log
444M pg_multixact/members
516M pg_multixact
625M pg_xlog
3493M base/pgsql_tmp
61851M base/22053373
65372M base
Обратите внимание на это:61851M base/22053373
Поскольку мои реальные данные находятся в табличных пространствах, хранящихся в разных томах, я предполагаю, что это какие-то временные транзакционные данные, которые накопились.
В сети есть несколько сообщений о похожих проблемах, но канонического решения я не нашел. В общем, совет такой: "запустите VACUUM FULL", и иногда накопившийся хлам уходит. Это то, что я делаю сейчас, но это занимает время, и я боюсь, что могу заполнить оставшееся дисковое пространство (3 ГБ) и все рухнет.
У кого-нибудь был опыт с этим? Что здесь хранится? Есть ли безопасный способ быстро освободить это место? Или хотя бы переместить его в другое место (у меня на дисках табличного пространства достаточно места).
решение1
Я разобрался. Это моя ошибка. Это новая база данных, которую коллега создал в табличном пространстве по умолчанию вместо одной из наших пользовательских.
Для тех, кто испытывает подобные проблемы, вот несколько вещей, которые я узнал во время расследования. base/22053373
В моем случае это oid базы данных. Вы можете увидеть, какая это база данных, вот так:
SELECT oid, * FROM pg_database
Каждый файл внутри назван по oid типа pg (таблица или что-то еще). Самые большие файлы, вероятно, из ваших самых больших таблиц. Подключитесь к базе данных и выберите из pg_class
коллекции, чтобы узнать, какие.
Прямо сейчас я перемещаю базу данных в пользовательское табличное пространство, используя
ALTER DATABASE mydb SET TABLESPACE mytablespace;
Я почти уверен, что это решит мою проблему.