2016-06-14 3 views
-1

Я сумасшедший, что я не нашел это Q на SO. Тем не менее, поисковая система для него создает очень старые страницы. Вероятно, я не нашел правильные ключевые слова. Проводка этого Q для админов базы данных оставила его без ответа.Ограничить размер базы данных

Для самого Q:

Я уверен, что я прочитал о функции в Postgres, чтобы ограничить размер базы данных. Но я не могу найти его в руководствах сегодня.

Неужели я не ошибаюсь? Как я могу ограничить размер базы данных?

+0

ссылки на эти старые страницы .. очень любопытный –

+0

Это мой результат Google https://www.google.de/?client=safari#q=restrict+database+size + postgres 2005, 2008, ... Ответы подобны ответам @daniel ниже. Поскольку я был уверен в том, что я читал, я думал, что информация в Интернете устарела. Очевидно, это не так. –

+0

спасибо за ссылку - я думал, что вы имели в виду документацию о очень старых версиях. Фактически, ответ Дэниелса намного эффективнее, чем использование пределов пропускной способности FS :) –

ответ

1

В Postgres нет встроенной системы квот, поэтому, я думаю, вы не поняли это.

Однако, вы могли бы сделать это несколько способов:

  1. Создать табличные для каждого пользователя. Если у вас есть квоты в файловой системе, вы можете согласовать их. Однако вы, конечно, рискуете целостностью базы данных. Я бы не пробовал.

  2. Напишите сценарий, который отключает INSERT в учетной записи. Вы можете запросить использование диска в базе данных с помощью pg_database_size. Я бы написал сценарий оболочки, чтобы проверять и отзывать/предоставлять доступ и периодически запускать его с помощью cron.

Например:

evlaopt=# select pg_database_size('evlaopt'); 
pg_database_size 
------------------ 
     9240136352 
(1 row) 

evlaopt=# select pg_size_pretty(pg_database_size('evlaopt')); 
pg_size_pretty 
---------------- 
8812 MB 
(1 row) 

(evlaopt представляет собой базу данных на моей машине.)

Предположим, у вас есть пользователи и базы данных, имена которых совпадают, и все они имеют ту же квоту (скажем,) 100 МБ. Вы могли бы сделать что-то вроде этого:?

# grant access to databases below the limit 
for DB in $(psql -At -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND pg_database_size(datname) < 1024 * 1024 * 100'); do 
    psql -At -c "GRANT INSERT ON ALL TABLES IN SCHEMA public TO $DB" $DB 
done 

# revoke access to databases at or above the limit 
for DB in $(psql -At -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND pg_database_size(datname) >= 1024 * 1024 * 100'); do 
    psql -At -c "REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM $DB" $DB 
done 
+0

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

+0

Спасибо @VaoTsun и Daniel Lyons. Это для Objective-Cloud. Я размещаю приложения сторонних разработчиков, и их приложения имеют доступ к базе данных. Поскольку служба основана на модели req-resp, я просто запустим фоновый поток с низким приоритетом на каждые 1000 или около того требований. –

Смежные вопросы