Использование 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
Поскольку мои фактические данные находятся в табличных пространствах, хранящихся в разных томах, я предполагаю, что это накопившиеся временные транзакции.
В Интернете есть несколько сообщений о подобных проблемах, но я не нашел канонического решения. В общем, совет: "запускайте ПОЛНЫЙ ВАКУУМ", и иногда накопившийся хлам уходит. Это то, что я сейчас делаю, но на это нужно время, и я боюсь, что заполню оставшееся дисковое пространство (3 ГБ) и все рухну.
У кого-нибудь был опыт с этим? Что здесь хранится? Есть ли безопасный способ быстро освободить это место? Или, по крайней мере, переместите его в другое место (у меня много места на дисках с табличным пространством).
Я понял. Это моя ошибка. Это новая база данных, которую коллега создал в табличном пространстве по умолчанию вместо одной из наших пользовательских.
Для тех, кто сталкивается с подобными проблемами, вот несколько вещей, которые я узнал во время исследования. base/22053373
в моем случае это база данных. Вы можете увидеть, что это такое:
SELECT oid, * FROM pg_database
Каждый файл внутри назван в честь oid типа pg (table или иначе). Самые большие файлы, вероятно, из ваших самых больших таблиц. Подключитесь к базе данных и выберите из pg_class
коллекция, чтобы узнать, какие.
Прямо сейчас я перемещаю db в настраиваемое табличное пространство, используя
ALTER DATABASE mydb SET TABLESPACE mytablespace;
Я уверен, что это решит мою проблему.