Назад | Перейти на главную страницу

Уменьшите размер основного / базового таинственного наращивания

Использование 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;

Я уверен, что это решит мою проблему.