User Tools

Site Tools


tecnica:gps_cartografia_gis:postgis_dump_restore

Dump e restore di un database PostGIS

Sul tema dump/restore di un database PostGIS si è espresso anche Paul Ramsey (uno dei padri di PostGIS) in questo interessante articolo. Si sostiene che l'unico modo di garantire facili upgrade è mantenere i propri dati in uno schema differente da public.

Introduzione

Dentro un database PostGIS oltre alle tabelle create dall'utente ci sono alcuni oggetti che hanno bisogno di essere trattati in modo particolare durante un dump/restore, soprattutto se il restore viene effettuato su una versione diversa di PostgreSQL/PostGIS.

Linguaggio PL/pgSQL

Deve essere creato dentro il database, per fare questa operazione sono necessari i privilegi di superutente Postgres. In caso di restore su una versione diversa di PostgreSQL non conviene recuperare il linguaggio dal vecchio dump, ma ripetere la procedura di creazione linguaggio.

Funzioni PostGIS

Le funzioni PostGIS devono essere create all'interno del database, anche in questo caso sono necessari i privilegi di superutente Postgres. In caso di restore su una versione diversa di PostGIS non conviene recuperare le funzioni dal dump, ma ricrearle dal file lwpostgis.sql fornito con PostGIS stesso.

Tabella spatial_ref_sys

Contiene la descrizione dei sistemi di riferimento utilizzabili in PostGIS, viene creata vuota durante l'esecuzione di lwpostgis.sql e poi popolata eseguendo spatial_ref_sys.sql (entrambi gli script vengono forniti con PostGIS). In caso di upgrade di PostGIS conviene creare questa tabella ex-novo.

Tabella geometry_columns

Questa tabella viene creata vuota durante l'esecuzione di lwpostgis.sql, pertanto dal dump conviene recuperare solo il contenuto della tabella e non la sua struttura.

Quindi, in sintesi, questi sono gli oggetti che vanno ricreati e/o recuperati dal dump:

Linguaggio plpgsql CREATE LANGUAGE plpgsql;
Funzioni PostGIS \i lwpostgis.sql
Tabella spatial_ref_sys \i spatial_ref_sys.sql
Tabella geometry_columns schema da lwpostgis.sql, dati dal dump
Dati utente dump

Procedura

La procedura di dump deve interessare solo i dati utente e deve essere effettuata nell'ordine giusto, in modo che l'integrità referenziale venga rispettata durante il restore, dalla shell di sistema:

pg_dump -U strade -W -h localhost -t users                        strade >  strade.dump
pg_dump -U strade -W -h localhost -t gpxfiles                     strade >> strade.dump
pg_dump -U strade -W -h localhost -t tracks                       strade >> strade.dump
pg_dump -U strade -W -h localhost -t tracksegments                strade >> strade.dump
pg_dump -U strade -W -h localhost -t trackpoints                  strade >> strade.dump
...
pg_dump -U strade -W -h localhost -t geometry_columns --data-only strade >> strade.dump

Per il restore collegarsi al DB come utente privilegiato per ricreare il database, l'utente e le strutture PostGIS:

CREATE USER "strade";
ALTER USER "strade" PASSWORD '*****';
CREATE DATABASE strade;
SELECT usename, usesysid FROM pg_user WHERE usename = 'strade';
--  usename | usesysid
--  ---------+----------
--  strade  |    12345
UPDATE pg_database SET datdba=12345 WHERE datname='strade';
\CONNECT strade
CREATE LANGUAGE plpgsql;
\i /usr/share/postgresql-8.1-postgis/lwpostgis.sql
\i /usr/share/postgresql-8.1-postgis/spatial_ref_sys.sql
ALTER TABLE geometry_columns OWNER TO strade;
ALTER TABLE spatial_ref_sys OWNER TO strade;

Quindi come utente non privilegiato effettuare il restore dalla shell di sistema:

psql -U strade -W strade < strade.dump
tecnica/gps_cartografia_gis/postgis_dump_restore.txt · Last modified: 2017/11/14 18:34 by niccolo