Postgraduate Large Objects

introduktion

i postgraduate findes der flere måder at styre binære Large Objects(LOB, BLOB):

  1. grundlæggende binær datatype BYTEA
  2. grundlæggende tegn datatype tekst
  3. stort objekt (LO) facilitet ‘pg_largeobject’
  4. datatype DATALINK (det er bare spec., ingen implementering)

Postgraduate understøtter også et lagersystem kaldet “TOAST” (Den Store Attributlagringsteknik), der automatisk gemmer værdier, der er større end en enkelt databaseside (typisk 8 KB) i et sekundært lagerområde pr. Dette definerer størrelsesgrænsen for enhver kolonne / felt til 1 GB.

her er nogle design og implementering spørgsmål vedrørende store objekter:

  • er LO (konceptuelt) en del af objektet/enheden – eller bare forbundet med det?
  • Hvordan er LO adgang til: som kodet streng, som fil eller stream-baseret?
  • hvis ikke gemt i tabellen, hvem opretholder integriteten af LO?

Import/eksport af eksterne binære filer

ved brug af BYTEA og tekst er den almindelige måde at importere/eksportere eksterne filer på inde i klienten (f.eks. Det er svært at håndtere eksterne filer.

Se Stackudveksling: .

BYTEA

BYTEA-datatypen tillader lagring af binære strenge.

  • det gemmer en LOB i tabellen, henholdsvis ved hjælp af TOAST.
  • det er således begrænset til 1 GB
  • lageret er oktalt og tillader tegn, der ikke kan udskrives (i modsætning til tegnstrenge, der ikke gør det).
  • input/output-formatet er sekskantet (pr. Postgreskl 9.0).

noter:

  • BYTEA kommer tæt på standard binær strengtype ‘BLOB’. De funktioner og operatorer, der leveres af BYTEA, er for det meste de samme, mens BYTEA ‘ s sekskantede inputformat er anderledes.
  • BYTEA er langsommere i længder > 20 MB end LO-anlægget (det har ingen tilfældige tilbehør).

se doc binære datatyper.

tekst

grundlæggende datatype tekst det er bare her for fuldstændighed. Dette er en variabel tegntype med ubegrænset længde (op til 1 GB). tegntyper tillader lokale indstillinger.

det er ikke en byte-streng, men man kan stadig bruge den, når den binære streng er forbehandlet og kodet til udskrivbar form (f.eks.

stor objekt (LO) facilitet

store objekter (LO) kan også placeres i en enkelt systemtabel kaldet ‘pg_largeobject’, som skal tilgås via identifikatorer af datatype OID.

  • der er en læse/skrive API, der tilbyder klient (= moduler skrevet i C) og server-side (= kvm) funktioner.
  • de vigtigste relaterede funktioner er: lo_creat(), lo_create(), lo_unlink(), lo_import () og lo_eksport (). lo_import() og lo_eksport () har brug for tilladelser til databasens ejerbruger (dvs.superbruger).
  • LO er opdelt i “bidder” og gemt i BTREE-indekserede rækker.
  • LO tillader værdier op til 2 GB i størrelse, mens ristede felter (som BYTEA) højst kan være 1 GB.
  • LO-poster kan ændres tilfældigt ved hjælp af en læse/skrive API, der er mere effektiv end at udføre sådanne operationer ved hjælp af TOAST (og f.eks BYTEA).

Bemærk:

  • når postgraduate doc. nævner ‘ lo ‘ (LO = stort objekt) det henviser typisk til denne facilitet.
  • i modsætning til f.eks. er BYTEA – LO ikke en datatype alene, men en tabel, en ‘facilitet’.

vigtig NOTE ved brug af JDBC BLOB (eller @Lob annotation i dvale):

  • da en LO-post betragtes som et objekt på egen hånd, sletter eller opdaterer rækker i brugertabellen ikke eller sletter poster i pg_largeobjects. pg_largeobjects vokser derfor uendeligt, medmindre der foretages en separat rengøring (se denne fejlrapport i dvaletilstand).
  • for at forhindre dette skal der typisk tilføjes en trigger, der sletter poster i pg_largeobject som beskriebd i modul ‘lo’.
  • se yderligere moduler ‘lo’ og ‘vaccumlo’ i dokumenterne.

se doc ‘store objekter’ og jdbc datatype BLOB: .

eksempel: typisk brug i KVL (baseret på Postgres docs):

 CREATE TABLE image ( id integer, name text, picture oid ); SELECT lo_creat(-1); -- returns OID of new, empty large object. SELECT lo_create(43213); -- attempts to create large object with OID 43213. SELECT lo_unlink(173454); -- deletes large object with OID 173454. INSERT INTO image (id, name, picture) VALUES (1, 'beautiful image', lo_import('/etc/motd')); INSERT INTO image (id, name, picture) -- same as above, but specify OID to use. VALUES (1, 'beautiful image', lo_import('/etc/motd', 68583)); SELECT lo_export(image.raster, '/tmp/motd') FROM image -- need superuser permission. WHERE name = 'beautiful image';

DATALINK

Bemærk: Der er i øjeblikket ingen implementering i postgraduate for det. Det er bare en specifikation, der er defineret i standard.

DATALINK-typen gemmer fil-URL ‘ er i databasekolonner og anvender begrænsninger på den.

  • opretholder et link til en bestemt fil i eksternt lager.
  • databasesystemet overtager kontrollen over eksterne filer (Omdøb, Slet, tilladelser er udført med SDR), hvis det er defineret.
  • Filstørrelsen er ubegrænset, henholdsvis begrænset af ekstern lagring. Ingen grund til at gemme filindhold i databasesystemet.

DATALINK parametre:

  • ingen LINK kontrol Datalink værdi behøver ikke henvise til en eksisterende fil / URL.
  • FILE LINK CONTROL Datalink-værdi skal referere til en eksisterende fil/URL.
  • integritet alle refererede filer kan kun omdøbes eller slettes.
  • integritet selektive refererede filer kan omdøbes eller slettes direkte.
  • integritet Ingen (underforstået for ingen LINK kontrol)
  • på Fjern link Slet fil slettes fra filsystemet, når slettet fra databasen.
  • på Fjern link Gendan filens oprindelige tilladelser gendannes, når de slettes fra databasen.
  • på Fjern link ingen ingen ændring i filtilladelser, når filreference slettes fra databasen.
  • gendannelse Ja PITR gælder for refererede filer.
  • gendannelse ingen PITR gælder ikke for refererede filer.

Status og Installation:

  • uklart.

eksempel:

 CREATE TABLE image ( id integer, name text, picture DATALINK ); INSERT INTO persons VALUES ( 1, 'Jon Doe', DLVALUE('file://some/where/1.jpg') );

links:

  • DATALINK-Side
  • præsentation af Peter Eisentraut, PGCon 2009:
  • MSE-Seminarafhandling (2011) fra Florian Schvendener om “KVL/MED og mere – styring af eksterne Data i postgraduate og Microsoft KVL-Server”:

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.