2016-06-14 18 views
-1

Ich bin überrascht, dass ich dieses Q auf SO nicht gefunden habe. Googeln bringt jedoch sehr alte Seiten. Wahrscheinlich habe ich die richtigen Schlüsselwörter nicht gefunden. Wenn dieses Q an die Datenbankadministratoren gesendet wurde, blieb es unbeantwortet.Datenbankgröße einschränken

Zum Q selbst:

Ich bin mir ziemlich sicher, dass ich über eine Funktion in Postgres gelesen haben die Datenbankgröße zu begrenzen. Aber ich kann es heute nicht in den Handbüchern finden.

Habe ich es falsch im Kopf behalten? Wie kann ich die Größe der Datenbank begrenzen?

+0

Links zu den alten Seiten .. sehr neugierig –

+0

Das ist mein Google-Ergebnis ist https://www.google.de/?client=safari#q=restrict+database+size + postgres 2005, 2008, ... Die Antworten sind wie folgt von @daniel. Da ich mir ziemlich sicher war, was ich gelesen habe, dachte ich, dass die Informationen im Web veraltet sind. Offensichtlich ist es nicht. –

+0

danke für den Link - ich dachte, du meintest Dokumentation von sehr alten Releases obwohl. In der Tat, Daniels Antwort ist viel effizienter als FS-Kapazität Grenzen verwenden :) –

Antwort

1

Es gibt kein integriertes Quotensystem in Postgres, also haben Sie das vermutlich falsch verstanden.

Allerdings könnte man es ein paar Möglichkeiten:

  1. erstellen Tablespaces für jeden Benutzer. Wenn Sie im Dateisystem Quotas haben, können Sie dafür sorgen, dass sie übereinstimmen. Sie riskieren natürlich die Integrität der Datenbank. Ich würde es nicht versuchen.

  2. Schreiben Sie ein Skript, das INSERT auf einem Konto deaktiviert. Sie können die Datenträgerauslastung in der Datenbank mit pg_database_size abfragen. Ich würde ein Shell-Skript schreiben, um den Zugriff zu überprüfen und zu widerrufen/gewähren und ihn regelmäßig mit Cron auszuführen.

ZB:

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 ist eine Datenbank, auf meinem Rechner.)

Angenommen, Sie haben Benutzer und Datenbanken, deren Namen, und sie alle haben die gleiche Quote von (sagen wir) 100 MB. Man könnte so etwas tun:

# 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

Ich glaube, das ist was Heroku tut - Anzahl der Zeilen in den größten Tabellen zählen und Rechte entziehen –

+0

Danke @VaoTsun und Daniel Lyons. Es ist für Objective-Cloud. Ich host Apps von Drittanbietern und ihre Apps haben Zugriff auf eine Datenbank. Da der Dienst auf einem req-resp-Modell basiert, starte ich einfach einen Hintergrund-Thread mit niedriger Priorität für jeweils etwa 1000 Anforderungen. –