Kapitel 3. PostGIS-administration

Innehållsförteckning

3.1. Prestandajustering

Inställning för PostGIS-prestanda är ungefär som att ställa in för någon PostgreSQL-arbetsbelastning. Det enda ytterligare övervägandet är att geometrier och raster vanligtvis är stora, så minnesrelaterade optimeringar har i allmänhet större inverkan på PostGIS än andra typer av PostgreSQL-frågor.

För allmänna detaljer om optimering av PostgreSQL, se Tuning your PostgreSQL Server.

PostgreSQL-konfiguration kan anges på servernivå utan att ändra postgresql.conf eller postgresql.auto.conf genom kommandot ALTER SYSTEM.

Ange work_mem, läs om konfigurationen så att nya anslutningar använder ändringen och visa det aktuella värdet. Använd SHOW ALL för att lista alla inställningar.

Kod
ALTER SYSTEM SET work_mem = '256MB';
SELECT pg_reload_conf();
SHOW work_mem;

Förutom Postgres-inställningarna har PostGIS några anpassade inställningar som listas i Avsnitt 7.22, ”Grand Unified Custom Variables (GUC)”.

3.1.1. Uppstart

Dessa inställningar konfigureras i postgresql.conf::

constraint_exclusion

  • Standard: partition

  • Detta används vanligen för tabellpartitionering. Standardvärdet ”partition” tvingar planeraren att bara analysera tabeller med avseende på begränsningar om de ingår i en ärvd hierarki och undviker annars planerarens prestandastraff.

shared_buffers

  • Standard: ~128 MB

  • Ställ in värdet på cirka 25 % till 40 % av tillgängligt RAM-minne. I Windows kanske du inte kan ställa in ett lika högt värde.

max_worker_processes styr det högsta antalet bakgrundsprocesser som är tillgängliga för servern och begränsar därmed även hur många arbetare som kan delta i parallella frågor.

  • Standard: 8

  • Ställer in det maximala antalet bakgrundsprocesser som systemet kan stödja. Denna parameter kan endast ställas in vid serverstart.

3.1.2. Körtid

work_mem - anger storleken på det minne som används för sorteringsoperationer och komplexa frågor

  • Standard: 1-4MB

  • Justera upp för stora databaser, komplexa frågor, mycket RAM

  • Justera ner för många samtidiga användare eller lågt RAM-minne.

  • Om du har mycket RAM-minne och få utvecklare:

    Kod
    SET work_mem TO '256MB';

maintenance_work_mem - den minnesstorlek som används för VACUUM, CREATE INDEX etc.

  • Standard: 16-64 MB

  • Generellt för låg - binder upp I/O, låser objekt medan minne byts ut

  • Rekommenderar 32 MB till 1 GB på produktionsservrar med mycket RAM, men det beror på antalet samtidiga användare. Om du har mycket RAM och få utvecklare:

    Kod
    SET maintenance_work_mem TO '1GB';

max_parallel_workers_per_gather

Stödet för parallella frågor i moderna PostgreSQL och PostGIS använder denna inställning för att avgöra hur många arbetare en plan får begära. Om den anges till ett värde högre än 0 kan vissa frågor, exempelvis de som använder relationsfunktioner som ST_Intersects, använda flera processer och köras mer än dubbelt så snabbt. Om du har många lediga processorer bör du ändra värdet till antalet processorer du har. Se också till att höja max_worker_processes till minst detta antal.

  • Standard: 0

  • Ställer in det maximala antalet arbetare som kan startas av en enda Gather-nod. Parallella arbetare hämtas från den pool av processer som fastställs av max_worker_processes. Observera att det begärda antalet arbetare kanske inte är tillgängligt vid körningstillfället. Om detta inträffar kommer planen att köras med färre arbetare än förväntat, vilket kan vara ineffektivt. Om detta värde sätts till 0, vilket är standard, inaktiveras parallell frågeexekvering.

3.2. Konfigurera stöd för raster

Om du har aktiverat rasterstöd kan du läsa nedan om hur du konfigurerar det på rätt sätt.

Rasterdata utanför databasen och alla rasterdrivrutiner är inaktiverade som standard. För att åter aktivera dem måste du ange miljövariablerna POSTGIS_GDAL_ENABLED_DRIVERS och POSTGIS_ENABLE_OUTDB_RASTERS i servermiljön. Du kan också använda den mer plattformsoberoende metoden att ange motsvarande Avsnitt 7.22, ”Grand Unified Custom Variables (GUC)”.

Om du vill aktivera offline-raster:

Kod
POSTGIS_ENABLE_OUTDB_RASTERS=1

Alla andra inställningar eller ingen inställning alls inaktiverar raster utanför databasen.

För att aktivera alla GDAL-drivrutiner som finns tillgängliga i din GDAL-installation, ställ in denna miljövariabel enligt följande

Kod
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL

Om du endast vill aktivera specifika drivrutiner ställer du in din miljövariabel enligt följande:

Kod
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
[Notera]

Om du använder Windows, använd inte citattecken för drivrutinslistan

Hur miljövariabler anges beror på operativsystemet. För PostgreSQL som installerats på Ubuntu eller Debian via apt-postgresql är den rekommenderade metoden att redigera /etc/postgresql/MAJOR/CLUSTER/environment, där platshållarna avser PostgreSQL:s huvudversion och klustrets namn.

I Windows, om du kör som en tjänst, kan du ställa in via systemvariabler som du hittar i Windows 7 genom att högerklicka på Dator->Egenskaper Avancerade systeminställningar eller i utforskaren genom att navigera till Kontrollpanelen\Alla kontrollpanelsalternativ\System. Klicka sedan på Avancerade systeminställningar ->Avancerat->Miljövariabler och lägg till nya systemvariabler.

När du har ställt in miljövariablerna måste du starta om din PostgreSQL-tjänst för att ändringarna ska träda i kraft.

3.3. Skapa spatiala databaser

3.3.1. Spatial aktivering av databas med hjälp av EXTENSION

Om du har kompilerat och installerat tilläggen/modulerna för postgis kan du göra en databas rumslig med mekanismen EXTENSION.

Core postgis-tillägget inkluderar geometri, geografi, spatial_ref_sys och alla funktioner och kommentarer. Raster och topologi är paketerade som ett separat tillägg.

Kör följande SQL-snutt i den databas som du vill aktivera spatialt:

Kod
CREATE EXTENSION IF NOT EXISTS plpgsql;
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster; -- OPTIONAL
CREATE EXTENSION postgis_topology; -- OPTIONAL

3.3.2. Spatial aktivering av databas utan att använda EXTENSION (avrådes)

[Notera]

Detta behövs i allmänhet bara om du inte kan eller inte vill få PostGIS installerat i PostgreSQL-tilläggskatalogen (till exempel under testning, utveckling eller i en begränsad miljö).

Att lägga till PostGIS-objekt och funktionsdefinitioner i din databas görs genom att läsa in de olika sql-filerna som finns i [prefix]/share/contrib enligt specifikationerna under byggfasen.

De centrala PostGIS-objekten (geometri- och geograftyper och deras stödfunktioner) finns i skriptet postgis .sql. Rasterobjekt finns i skriptet rtpostgis.sql. Topologiobjekt finns i skriptet topology .sql.

För en fullständig uppsättning EPSG-koordinatsystemdefinitionsidentifierare kan du också läsa in definitionsfilen spatial_ref_sys.sql och fylla i tabellen spatial_ref_sys. Detta gör att du kan utföra ST_Transform()-operationer på geometrier.

Om du vill lägga till kommentarer till PostGIS-funktionerna kan du hitta dem i skriptet postgis_comments.sql. Kommentarer kan visas genom att helt enkelt skriva \dd [function_name] från ett psql-terminalfönster.

Kör följande Shell-kommandon i din terminal:

Kod
DB=[yourdatabase]
SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.6/

# Core objects
psql -d ${DB} -f ${SCRIPTSDIR}/postgis.sql
psql -d ${DB} -f ${SCRIPTSDIR}/spatial_ref_sys.sql
psql -d ${DB} -f ${SCRIPTSDIR}/postgis_comments.sql # OPTIONAL

# Raster support (OPTIONAL)
psql -d ${DB} -f ${SCRIPTSDIR}/rtpostgis.sql
psql -d ${DB} -f ${SCRIPTSDIR}/raster_comments.sql # OPTIONAL

# Topology support (OPTIONAL)
psql -d ${DB} -f ${SCRIPTSDIR}/topology.sql
psql -d ${DB} -f ${SCRIPTSDIR}/topology_comments.sql # OPTIONAL

3.4. Uppgradering av spatiala databaser

Att uppgradera befintliga spatiala databaser kan vara svårt eftersom det kräver ersättning eller införande av nya PostGIS-objektdefinitioner.

Tyvärr är det inte alla definitioner som enkelt kan ersättas i en levande databas, så ibland är det bästa alternativet en dump/reload-process.

PostGIS tillhandahåller en SOFT UPGRADE-procedur för mindre eller bugfix-utgåvor och en HARD UPGRADE-procedur för större utgåvor.

Innan du försöker uppgradera PostGIS är det alltid värt att säkerhetskopiera dina data. Om du använder flaggan -Fc till pg_dump kommer du alltid att kunna återställa dumpningen vid en hård uppgradering.

3.4.1. Mjuk uppgradering

Om du installerade din databas med hjälp av tillägg måste du också uppgradera med hjälp av tilläggsmodellen. Om du installerade med den gamla sql-skriptmetoden rekommenderas du att byta din installation till tillägg eftersom skriptmetoden inte längre stöds.

3.4.1.1. Mjuk uppgradering med tillägg

Om du ursprungligen installerade PostGIS med tillägg måste du också uppgradera med tillägg. En mindre uppgradering med tillägg är ganska enkel.

Använd funktionen PostGIS_Extensions_Upgrade för att uppgradera till den senaste version du har installerat.

Kod
SELECT postgis_extensions_upgrade();

Om du uppgraderar en databas som fortfarande kör PostGIS 2.5 ska du köra ALTER EXTENSION följt av postgis_extensions_upgrade() för att säkerställa att äldre objekt i postgis_raster förs tillbaka till huvudtillägget.

Kod
ALTER EXTENSION postgis UPDATE;
SELECT postgis_extensions_upgrade();

Det andra anropet behövs för att paketera om tillägget postgis_raster.

Kod
SELECT postgis_extensions_upgrade();

Om du har flera versioner av PostGIS installerade och inte vill uppgradera till den senaste, kan du uttryckligen ange versionen på följande sätt:

Kod
ALTER EXTENSION postgis UPDATE TO "3.7.0dev";
ALTER EXTENSION postgis_topology UPDATE TO "3.7.0dev";

Om du får ett felmeddelande något i stil med:

Utdata
No migration path defined for … to 3.7.0dev

Sedan måste du säkerhetskopiera din databas, skapa en ny enligt beskrivningen i Avsnitt 3.3.1, ”Spatial aktivering av databas med hjälp av EXTENSION” och sedan återställa din säkerhetskopia ovanpå den nya databasen.

Om du får ett meddelande som:

Utdata
Version "3.7.0dev" of extension "postgis" is already installed

Allt är redan uppdaterat och du kan tryggt ignorera detta. Om du försöker uppgradera från en utvecklingsversion till nästa (som inte får ett nytt versionsnummer) kan du lägga till "next" i versionssträngen. Nästa gång måste du ta bort suffixet "next" igen:

Kod
ALTER EXTENSION postgis UPDATE TO "3.7.0devnext";
        ALTER EXTENSION postgis_topology UPDATE TO "3.7.0devnext";
[Notera]

Om du installerade PostGIS ursprungligen utan en angiven version kan du ofta hoppa över ominstallationen av postgis-tillägget innan du återställer eftersom säkerhetskopian bara har CREATE EXTENSION postgis och därmed plockar upp den senaste versionen under återställningen.

[Notera]

Om du uppgraderar PostGIS-tillägget från en version före 3.0.0 får du ett nytt tillägg, postgis_raster, som du tryggt kan ta bort om du inte behöver rasterstöd.

Kod
DROP EXTENSION postgis_raster;

3.4.1.2. Mjuk uppgradering utan tillägg

Tillägg har varit den stödda installationsmetoden under många utgåvor. Om du fortfarande använder en opaketerad installation ska du utföra en HÅRD UPPGRADERING till en databas som skapats med tillägg och migrera dina data dit.

3.4.1.3. Hård uppgradering

Med HÅRD UPPGRADERING menar vi fullständig dumpning/omladdning av PostGIS-aktiverade databaser. Du behöver en HÅRD UPPGRADERING när PostGIS-objektens interna lagring ändras eller när MJUK UPPGRADERING inte är möjlig. Bilagan Release Notes rapporterar för varje version om du behöver en dumpning/omladdning (HARD UPGRADE) för att uppgradera.

Processen med dumpning och återinläsning underlättas av skriptet postgis_restore, som hoppar över alla definitioner som tillhör PostGIS (även äldre) i dumpen. Därmed kan du återställa dina scheman och data till en databas med PostGIS utan fel om duplicerade symboler eller föråldrade objekt.

Kompletterande instruktioner för Windows-användare finns i installationsguiden för PostGIS i Windows.

Förfarandet är som följer:

  1. Skapa en dump i "anpassat format" av den databas du vill uppgradera (låt oss kalla den olddb) inklusive binära blobs (-b) och verbose (-v) utdata. Användaren kan vara ägaren av db, behöver inte vara postgres superkonto.

    Kod
    pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
  2. Gör en nyinstallation av PostGIS i en ny databas - vi kallar denna databas för newdb. Se Avsnitt 3.3.2, ”Spatial aktivering av databas utan att använda EXTENSION (avrådes)” och Avsnitt 3.3.1, ”Spatial aktivering av databas med hjälp av EXTENSION” för instruktioner om hur du gör detta.

    De spatial_ref_sys-poster som finns i din dump kommer att återställas, men de kommer inte att åsidosätta befintliga poster i spatial_ref_sys. Detta är för att säkerställa att korrigeringar i den officiella uppsättningen kommer att spridas korrekt till återställda databaser. Om du av någon anledning verkligen vill ha dina egna åsidosättningar av standardposter, ladda bara inte spatial_ref_sys.sql-filen när du skapar den nya db.

    Om din databas är riktigt gammal eller om du vet att du har använt funktioner som inte längre används i dina vyer och funktioner, kan du behöva läsa in legacy.sql för att alla dina funktioner och vyer etc. ska komma tillbaka på rätt sätt. Gör detta endast om det _verkligen_ behövs. Överväg att uppgradera dina vyer och funktioner innan du dumpar dem, om möjligt. De föråldrade funktionerna kan senare tas bort genom att läsa in uninstall_legacy.sql.

  3. Återställ din säkerhetskopia till din nya newdb-databas med postgis_restore. Oväntade fel, om några, kommer att skrivas ut till standardfelströmmen av psql. Förvara en logg över dessa.

    Kod
    postgis_restore "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2> errors.txt

Fel kan uppstå i följande fall:

  1. Några av dina vyer eller funktioner använder sig av föråldrade PostGIS-objekt. För att åtgärda detta kan du försöka läsa in legacy.sql-skriptet före återställningen eller så måste du återställa till en version av PostGIS som fortfarande innehåller dessa objekt och försöka migrera igen efter att ha portat din kod. Om legacy.sql fungerar för dig, glöm inte att fixa din kod så att den slutar använda föråldrade funktioner och ta bort dem genom att läsa in uninstall_legacy.sql.

  2. Vissa anpassade poster i spatial_ref_sys i dumpfilen har ett ogiltigt SRID-värde. Giltiga SRID-värden är större än 0 och mindre än 999000. Värden i intervallet 999000.999999 är reserverade för internt bruk medan värden över 999999 inte kan användas alls. Alla dina anpassade poster med ogiltiga SRID kommer att behållas, med de > 999999 flyttade till det reserverade intervallet, men tabellen spatial_ref_sys skulle förlora en kontrollbegränsning som skyddar för att invariant ska hålla och eventuellt också dess primära nyckel (när flera ogiltiga SRIDS konverteras till samma reserverade SRID-värde).

    För att åtgärda detta bör du kopiera din anpassade SRS till en SRID med ett giltigt värde (kanske i intervallet 910000..910999), konvertera alla dina tabeller till den nya srid (se UpdateGeometrySRID), ta bort den ogiltiga posten från spatial_ref_sys och konstruera om kontrollen (erna) med:

    Kod
    ALTER TABLE spatial_ref_sys ADD CONSTRAINT spatial_ref_sys_srid_check check (srid 
    > 0 AND srid < 999000 );
    
    Kod
    ALTER TABLE spatial_ref_sys ADD PRIMARY KEY(srid));
        

    Om du uppgraderar en gammal databas som innehåller fransk IGN-kartografi får du troligen SRID:er utanför intervallet och kan vid import av databasen se problem som detta:

    Kod
    WARNING: SRID 310642222 converted to 999175 (in reserved zone)

    I detta fall kan du prova följande steg: ta först bort IGN helt från den SQL-kod som genereras av postgis_restore. Efter att ha kört:

    Kod
    postgis_restore "/somepath/olddb.backup" > olddb.sql

    kör detta kommando:

    Kod
    grep -v IGNF olddb.sql > olddb-without-IGN.sql

    Skapa newdb, aktivera de PostGIS-tillägg som krävs och infoga franska IGN-definitioner av rumsliga referenser med detta skript. Importera sedan dina data:

    Kod
    psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql  2> errors.txt