PostgreSQL-Binary Large Objects

Innledning

I PostgreSQL finnes det flere måter å håndtere Binære Store Objekter (LOB, BLOB):

  1. grunnleggende binær datatype BYTEA
  2. datatype for grunnleggende tegn TEKST
  3. stort objekt (LO) – anlegg ‘Pg_largeobject’
  4. DATATYPE DATALINK (det er bare spec., ingen implementering)

PostgreSQL støtter også et lagringssystem kalt «TOAST» (Lagringsteknikken For Overdimensjonert Attributt) som automatisk lagrer verdier som er større enn en enkelt databaseside (vanligvis 8 KB) i et sekundært lagringsområde per tabell. Dette definerer størrelsesgrensen for hvilken som helst kolonne / felt til 1 GB.

her er noen design-og implementeringsspørsmål angående store objekter:

  • ER LO (konseptuelt)en del av objektet/enheten – eller bare knyttet til det?
  • HVORDAN åpnes LO: som kodet streng,som fil eller strømbasert?
  • hvis ikke lagret i tabellen, hvem opprettholder integriteten TIL LO?

Importere / Eksportere Eksterne Binære Filer

når DU bruker BYTEA OG TEKST (OG XML) den vanlige måten å importere / eksportere eksterne filer er inne klient (F. Eks Java / Python)eller serverside programms (f.eks Pl/Python). Det er vanskelig å håndtere eksterne filer med psql.

Se Stackexchange: .

BYTEA

BYTEA-datatypen tillater lagring av binære strenger.

  • den lagrer EN LOB i bordet, henholdsvis VED HJELP AV TOAST.
  • det er dermed begrenset til 1 GB
  • lagringen er oktal og tillater ikke-skrivbare tegn (i motsetning til tegnstrenger som ikke gjør det).
  • input/output-formatet er HEX (Som Av PostgreSQL 9.0).

Notater:

  • BYTEA kommer nær SQL standard binær streng typen ‘BLOB’. FUNKSJONENE og operatørene levert AV BYTEA er stort sett de samme, MENS HEX input format AV BYTEA er forskjellig.
  • BYTEA er langsommere for lengder > 20 MB ENN LO-anlegget(det har ingen tilfeldig tilgang).

Se postgresql doc Binære Datatyper.

TEKST

Grunnleggende datatype tekst det er bare her for fullstendighet. Dette er en variabel tegntype med ubegrenset lengde (opptil 1 GB). tegntyper tillater nasjonale innstillinger.

det er ikke en byte-streng, men man kan fortsatt bruke den når binærstrengen er forhåndsbehandlet og kodet til utskrivbar form (f.eks. base64 eller hex).

Stort objekt (LO) anlegg

Store objekter (LO) kan også plasseres i et enkelt systemtabell kalt ‘pg_largeobject’ som må nås via identifikatorer av datatype OID.

  • Det er en lese/skrive API som tilbyr klient (= moduler skrevet I C) og server-side (= SQL) funksjoner.
  • DE viktigste RELATERTE SQL-funksjonene er: lo_creat(), lo_create(), lo_unlink(), lo_import () og lo_export(). lo_import() og lo_export () trenger tillatelser av databasens eie bruker (dvs.
  • LO brytes opp i «biter» og lagres i btree-indekserte rader.
  • LO tillater verdier opptil 2 GB i størrelse, Mens Ristede felt (som BYTEA) kan være maksimalt 1 GB.
  • LO oppføringer kan tilfeldig endres ved hjelp av en lese / skrive API som er mer effektiv enn å utføre slike operasjoner ved HJELP AV TOAST (og F.eks BYTEA).

Notat:

  • Når PostgreSQL doc. nevner ‘ lo ‘ (LO = Stort Objekt) det refererer vanligvis til dette anlegget.
  • I motsetning TIL F. eks BYTEA – LO er ikke en datatype i seg selv, men en tabell, en ‘facility’.

VIKTIG MERKNAD når DU bruker JDBC BLOB (eller @Lob merknad I Dvalemodus):

  • Siden PostgreSQL vurderer EN LO-oppføring som et objekt på egen hånd, sletter eller sletter rader i brukertabellen ikke eller sletter oppføringer i pg_largeobjects. pg_largeobjects vokser derfor uendelig med mindre en separat rengjøring er gjort(se denne feilrapporten i Hibernate forum).
  • for å forhindre dette, må det vanligvis legges til en utløser som sletter oppføringer i pg_largeobject som descriebd i modulen ‘lo’.
  • Se flere PostgreSQL-moduler ‘ lo ‘og’ vaccumlo ‘ i PostgreSQL-dokumentene.

Se PostgreSQL doc ‘Store Objekter’ og jdbc datatype BLOB: .

Eksempel: Typisk bruk I SQL (basert 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

MERK: Det er for øyeblikket ingen implementering I PostgreSQL for det. Det er bare en spesifikasjon definert I Standard SQL ‘SQL/MED’.

DATALINK-typen lagrer Filadresser i databasekolonner og bruker begrensninger på den.

  • Opprettholder en kobling til en bestemt fil i ekstern lagring.
  • Databasesystem tar over kontroll over eksterne filer (endre navn, slette, tillatelser er gjort MED SQL) hvis definert så.
  • Filstørrelsen er ubegrenset, henholdsvis begrenset av ekstern lagring. Du trenger ikke å lagre filinnholdet i databasesystemet.

DATALINKPARAMETERE:

  • Ingen KOBLING KONTROLL Datalink verdi trenger ikke referere til en eksisterende fil / URL.
  • FILKOBLINGSKONTROLL Datalink-verdien må referere til en eksisterende fil / URL.
  • INTEGRITET ALLE Refererte filer kan bare omdøpes eller slettes VIA SQL.
  • INTEGRITY SELEKTIVE Refererte filer kan bli omdøpt eller slettet VIA SQL eller direkte.
  • INTEGRITET INGEN (underforstått FOR INGEN KOBLINGSKONTROLL)
  • PÅ FJERN KOBLING SLETT Fil slettes fra filsystemet når det slettes fra databasen.
  • PÅ UNLINK GJENOPPRETT Filens opprinnelige tillatelser gjenopprettes når slettet fra databasen.
  • PÅ KOBLE FRA INGEN Ingen endring i filtillatelser når filreferansen slettes fra databasen.
  • GJENOPPRETTING JA PITR gjelder refererte filer.
  • GJENOPPRETTING INGEN PITR gjelder ikke for refererte filer.

Status Og Installasjon:

  • uklart.

Eksempel:

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

Lenker:

  • DATALINK wiki-side
  • Presentasjon Av Peter Eisentraut, PGCon 2009:
  • Mse-Seminaroppgave (2011) Fra Florian Schwendener om «SQL/Med og Mer – Styring Av Eksterne Data I PostgreSQL og Microsoft SQL Server»:

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.