Размер базы данных Postgres намного больше, чем табличных пространств в файловой системе

У меня есть экземпляр Postgres 8.3 с табличными пространствами около 74G. Это отлично.

Но если я спрашиваю postgres, насколько велика моя база данных, я получаю (неожиданный) большой ответ: 595 ГБ.

Это кажется очень странным. Тесты дискового ввода-вывода в системе находятся в "нормальном" диапазоне, но запросы выполняются медленнее, чем раньше.

Это повреждение базы данных? Или есть способы "исправить" эту странность?

[Редактировать] Я проверяю размер табличного пространства по ОС:

/usr/local/pgsql/data/tblspaces/du -c -h
74G total 

Все табличные пространства есть

Я проверяю размер базы данных следующим образом:

select pg_size_pretty(pg_database_size('database')) 

[Edit2]

Я также проверил весь каталог /usr/local/pgsql/ dir. Это 76 г

И я запустил этот запрос:

select
  tablename
, pg_relation_size(tablename)
, pg_size_pretty(pg_relation_size(tablename) ) as relsize
, pg_size_pretty(pg_total_relation_size(tablename) ) as disksize
, pg_total_relation_size(tablename)
from pg_tables where schemaname <> 'information_schema'
order by 2 desc

Который возвратил "нормальные" размеры отношений, ни один из которых не превысил размер диска.

4 ответа

Решение

Оказалось, проблема коррупции. Полное восстановление резервной копии решило проблему

Размер табличного пространства можно проверить с помощью:

SELECT pg_size_pretty(pg_tablespace_size('name of tablespace'));

Похоже, ваша база данных хранит не все свои объекты (таблицы, индексы и т. Д.) В определенном табличном пространстве, но также и другое (по умолчанию?) Табличное пространство. Проверьте pg_class и pg_tablespace, что-то вроде этого:

SELECT 
    *
FROM pg_class 
    JOIN pg_tablespace ON reltablespace = pg_tablespace.oid
WHERE
    spcname <> 'name of tablespace';

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

- чтобы получить размер базы данных mydb=> выберите pg_size_pretty (pg_database_size ('mydb'));

pg_size_pretty

214 МБ (1 строка)

- чтобы показать все табличное пространство, связывающее вашу базу данных, и введите следующую команду \db

Вы недавно пылесосили БД? Это может иметь драматические последствия, особенно если на больших столах много оттока.

Кроме того, насколько велик результат pg_dump?

Другие вопросы по тегам