PostgreSQL nabízí pěkné BLOB rozhraní, které je široce používán. Nedávno jsme však narazili na problémy, kterým čelí různí zákazníci, a má smysl se trochu zamyslet a zjistit, jak PostgreSQL zpracovává bloby – a zejména BLOB cleanup.

pomocí rozhraní PostgreSQL BLOB

v PostgreSQL můžete použít různé prostředky pro ukládání binárních dat. Nejjednodušší formou je určitě využít datový typ „bytea“ (=byte array). V tomto případě je binární pole v podstatě považováno za součást řádku.
zde je návod, jak to funguje:

jak vidíte, jedná se o normální sloupec a lze jej použít stejně jako normální sloupec. Jediné, co stojí za zmínku, je kódování, které je třeba použít na úrovni SQL. PostgreSQL používá proměnnou ke konfiguraci tohoto chování:

test=# SHOW bytea_output;bytea_output--------------hex(1 row)

proměnná bytea_output přijímá dvě hodnoty: „hex“ říká PostgreSQL, aby odeslal data ve formátu hex. „escape“ znamená, že data musí být přiváděna jako osmičkový řetězec. Aplikace se zde nemusí starat, kromě maximální velikosti 1 GB na pole.
nicméně, PostgreSQL má druhé rozhraní pro zpracování binárních dat: rozhraní BLOB. Dovolte mi ukázat příklad tohoto mocného nástroje v akci:

test=# SELECT lo_import('/etc/hosts');lo_import-----------80343(1 row)

v tomto případě byl obsah/etc / hosts importován do databáze. Všimněte si, že PostgreSQL má kopii dat-nejedná se o odkaz na souborový systém. Zde je pozoruhodné, že databáze vrátí OID (ID objektu) nové položky. Chcete-li sledovat tyto OID, někteří vývojáři dělají následující:

INSERT 0 1

to je naprosto v pořádku, pokud neuděláte něco jako níže:

test=# DELETE FROM t_file WHERE id = 1;DELETE 1

problém je v tom, že ID objektu bylo zapomenuto. Objekt však stále existuje. pg_largeobject je systémová tabulka, která má na starosti ukládání binárních dat uvnitř PostgreSQL. Všechny lo_functions budou jednoduše mluvit s touto tabulkou systému, aby zvládly thesethings:

proč je to problém? Důvod je jednoduchý: vaše databáze poroste a počet“ mrtvých objektů “ se hromadí. Proto je správný způsob, jak zabít položku BLOB je následující:

pokud zapomenete objekt odpojit, budete dlouhodobě trpět – a to jsme často viděli. Je to hlavní problém, pokud používáte rozhraní BLOB.

vacuumlo: čištění mrtvých velkých objektů

jak však lze problém vyřešit, jakmile nashromáždíte tisíce nebo možná miliony mrtvých kuliček? Odpověď je nástroj příkazového řádku s názvem „vacuumlo“.
nejprve vytvoříme mrtvý záznam:

test=# SELECT lo_import('/etc/hosts');lo_import-----------80351(1 row)

pak můžeme spustit vacuumlo z libovolného klienta:

jak vidíte, Nástroj zabil dva mrtvé objekty. vacuumlo je nejjednodušší způsob, jak vyčistit osiřelé předměty.

další funkce

existuje však více než jen lo_import a lo_unlink. PostgreSQL nabízí celou řadu funkcí pro zpracování velkých objektů příjemným způsobem:

existují další dvě funkce, které z historických důvodů nenásledují konvenci pojmenování: loread a lowrite:

pg_catalog | loread | bytea | integer, integer | funcpg_catalog | lowrite | integer | integer, bytea | func

jsou to funkce, jejichž jména již nelze snadno změnit. Je však třeba poznamenat, že existují.

konečně …

rozhraní PostgreSQL BLOB je opravdu užitečné a může být použito pro mnoho věcí. Krása spočívá v tom, že je plně transakční, a proto binární obsah a metadata již nemohou být synchronizovány.

pokud se chcete dozvědět více o spouštěčích pro vynucení omezení v PostgreSQL, doporučujeme vám podívat se na náš blogový příspěvek napsaný Laurenzem albem. Bude to osvětlit toto důležité téma.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.