Quotierung des Speicherplatzes

Kann man den Speicherplatz unter Postgres quotieren ?

  • ja
  • nein
  • kaum
  • schlecht

0 Teilnehmer

Hallo,

kann man unter Postgres den Speicherplatz für ein Schema oder einen User beschränken oder wenigstens abfragen ?
Habe bisher unter “pg_catalog.pg_settings” geschaut, aber keine entsprechende Option gefunden.

Jens Rommel

14:09:10 < ads> ??size
14:09:12 < pg_docbot_adz> For information about ‘size’ see:
14:09:12 < pg_docbot_adz> PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: System Administration Functions
14:09:12 < pg_docbot_adz> table size, database size - ads’ corner


Als erste Hinweise, wo man sich da einlesen kann.

Nein, ja. Siehe Antwort von ads.

Nein, weil der Speicherplatz vom User belegt wird, dem der postmaster-Prozess gehört, also postgres. Du kannst allerdings reguläre Filesystemquotas nutzen, und Du kannst tablespaces nutzen.

Andreas

Hallo,
vielen Dank.

Das Auslesen der Tabellengrößen hilft mir schon weiter.
Unklar ist mir noch das Modell des tablespace.
Kann ich da selbst eine Vorlage erstellen, die den Speicherplatz für einen User beschränkt ?

Jens

Nein. Der Speicherplatz gehört immer dem User ‘postgres’, mit Quota kommst du da also nicht direkt ran. Einziger Weg: du könntest jedem User Schreibrechte in einem anderen Tablespace geben - dann ist nur Platz für das zugewiesene Quota.

Du erstellst einzelne Partitionen, mountest diese und verwendest die dann als einzelne tablespaces für die Datenbanken.

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Tablespaces
PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: CREATE DATABASE

Andreas

Wozu benötigst Du das einklich? Und was genau? Soll nur eine Tabelle begrenzt werden oder hast Du N User und jeder darf nur M GByte Platte belegen oder was möchtest Du erreichen?

Andreas

Eigentlich möchte ich die Größe eines Schemas beschränken.
Jens

Das beantwortet die Frage von Andreas nicht wirklich.

Einige User haben ein eigenes Schema und ich möchte den Speicherplatz für dieses Schema auf eine bestimmte Größe beschränken.
Jens

Wird schwer zu realisieren sein. Wenn es nicht so zeitkritisch ist, vielleicht via Cron die Größen überwachen und handeln (Mail, fernzünden einer Bombe, …), aber vielleicht hat ads ja noch eine Idee.

Andreas

Vielen Dank für Eure Hilfe.
Wahrscheinlich werde ich in die Richtung der tablespaces gehen.
Tschüss Jens

wenn es doch möglich ist, den Speicherplatz einer Table zu erfragen, dann sollte es auch möglich sein, mit dieser Funktion (what ever) eine Constraint auf der Table zu basteln. Das schöne an dieser Idee ist auch, dass man vernünftige Fehler beim Schreiben in die Table erwarten darf.

CREATE TABLE foo (
    bar integer,
    CONSTRAINT valid_size CHECK (pg_tablespace_size('foo') < 100)
)

gruss
Steffen

– richtiger waehre also —

CREATE TABLE foo (
    bar integer,
    CONSTRAINT valid_size CHECK (pg_total_relation_size('foo') < 100)
)

gruss

Das noch schönere an deiner Idee ist, das jemand sich selbst Tabellen erstellen und in diese Schreiben kann, ohne das dieser Constraint geprüft wird.

Das klappt also nur, wenn du das DDL fest vorgeben kannst - das war in dem Fall aber nicht gefragt.

muss der fkt pg_tablespace_size(‘foo’) natuerlich der Name des Tablespace und nicht der Table uebergeben werden - glaube ich zumindest - aber im Prinzip sollte es so gehen … das ‘foo’ ist dort also falsch

ich kann deinen ausfuehrungen gerade nicht ganz folgen … was klappt genau wann warum bzw. warum nicht …

Wenn du den von dir vorgeschlagenen Constraint erzeugst, wird der nur bei Datenänderungen in der betroffenen Tabelle ausgeführt.

Wenn ein $böser User sich selbst eine Tabelle erzeugt und da Daten reinschreibt, ist von deinem Constraint nichts zu sehen.

Da der OP den Platzverbrauch im Schema begrenzen will und nicht jede Tabelle (samt Constraint) vorgeben möchte, wird deine Idee also so nicht funktionieren.

ob der user natuerlich selbst die betroffenen Tables erzeugen darf … hab ich entweder uebersehen oder ist nicht der fall …

wie dem auch sei … da existieren ja noch eine reihe anderer funktionen … er koennte z.B. eine trigger-funktion fuer den tablespace bauen, der (geht das ?) alle inserts auf allen tables des schemas triggert und bei bedarf eben in einen fehler laeuft …

– Nachtrag –
sehe gerade … man kann auch eine C-Library durch einen trigger aufrufen … die koennte dann sehr effizient tun was gewuenscht ist … den speicherplatz berechnen … und boesse exceptions werfen - dazu muesste man sich aber mal anschauen wie die auf

vielleicht reicht aber auch schon plsql code.

leider wird man aber keine trigger auf ein schema setzen koennen …

Sage mal, hatten wir das Thema nicht schon mal?
Tu bitte dir und uns den Gefallen und erkundige dich vorher, ob deine Vorschläge funktionieren würden.

PostgreSQL erlaubt keine Trigger auf Systemtabellen (und genau das würdest du brauchen, um deine Idee umzusetzen).

Davon abgesehen, was ads schon schrieb:

die Größe einer Tabelle als Datei hängt von einigen Faktoren ab. Ich werfe hier mal schnell als Stichwort ‘dead tuple’ und ‘MVCC’ sowie ‘TOAST’ ein. Nicht jede Lösung, die allzu offensichtlich ist, ist auch gut. Hint: je nach Gusto kannst Du mal N und mal M Datensätze in die DB einfügen. Das zumindest wäre so aus Sicht des Anwenders der Fall. Und an die Adresse des Fragestellers einer meiner Sprüche:

Man kann soziale Probleme nicht technisch lösen.

Andreas