====== 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 **[[postgis_in_a_separate_schema|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