Con questo post volevo tenere traccia della procedura di aggiornamento e migrazione dati da Postgresql 8.3 e Postgis 1.3.3 a Posgresql 8.4.11 e Postgis1.5.1.
Ho seguito questa utilissima pagina wiki
Sul nostro server “girano” attualmente Postgresql 8.3 e Postgis 1.3.3.
1- Facciamo dapprima il backup dei database presenti (il comando va lanciato per ogni db presente nel cluster).
$ PGUSER=postgres pg_dump -Fc nome_db > /percorso/alla/dir/di/dump/nome_db.dmp
NB: pg_dump con l’opzione -Fc crea un archivio compresso (un tar compresso con gzip, ovvero un tar.gz).
Nel caso si trattasse di db non spaziale e’ sufficiente dare:
$ PGUSER=postgres pg_dump -c nome_db > /percorso/alla/dir/di/dump/nome_db.sql
2- Stoppiamo Postgresql-8.3 (come root):
# /etc/init.d/postgresql stop 8.3
3- Installiamo Postgresql-8.4 e Postgis-1.5
# aptitude install postgresql-8.4 postgresql-8.4-postgis
A questo punto (non ricordo purtroppo tutte le fasi che ho percorso) al comando di stop de nuovo postgresql-8-4 compariva un errore. Ho provato a reinstallarlo ma a questo punto ottengo:
# Error: move_conffile: required configuration file /var/lib/postgresql/8.4/main/postgresql.conf does not exists.
Decido allora di reinstallare tutto ma succede il fattaccio. Non si riesce piu’ a lanciare postgresql-8-3. Il messaggio d’errore diceva che non esiste piu’ la directory “/var/lib/postgresql/8.3/main” panic…..praticamente mi e’ sparito tutto il cluster di postgresql-8.3, fumato!
Ok, pero’ i backup li ho e decido di fare un purge profondo prima di ripartire. Cerco tutti i pacchetti relativi a Postgresql.
# dpkg -l | grep postg
e rimuovo tutto con:
# aptitude purge postgresql-8.3 postgresq-8.4 postgresql-client-8.3 postgresql-client-8.4 postgresql-client-common postgresql-common postgresql
Rimuovo anche tutte le directory di sistema:
# rm -r /etc/postgresql/
# rm -r /etc/postgresql-common/
# rm -r /var/lib/postgresql/
poi togliamo manualmente l’utente “postgres” dal file “/etc/passwd” (mediante “# nano /etc/passwd” e modificando il file eliminado la riga di interesse).
Quindi reinstallo tutto con:
# aptitude install postgresql-8.4 postgresql-8.4-postgis (che si tira dietro anche tutte le dipendenze del caso)
A questo punto possiamo recuperare i dump fatti. Per fare questo ci viene in aiuto uno script in perl che si installa con postgis-1.5 (new_postgis_restore.pl).
Prima si devono ricreare i database vuoti (con lo stesso nome di quello di partenza). Essendo tutti db spaziali creiamo dapprima un template spaziale che chiamiamo “template_gis” e lo useremo poi per creare ogni db.
Come utente postgres creiamo anche gli utenti dei db stessi:
$ su
# su postgres
(come utente postgres) # psql template1; (si entra in un db qualsiasi per creare gli utenti)
=# CREATE USER nome_utente WITH PASSWORD ‘secret’ CREATEDB CREATEUSER;
Creo il nuovo database che diventaera’ il template (sempre come utente postgres):
=# CREATE DATABASE template_gis template=template0;
Usciamo dal db (<CTRL>d) e (sempre come utente postgres) importiamo in esso le funzioni spaziali:
# psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql -d template_gis
poi
# psql -d template_gis -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
A questo punto rientriamo in template1:
# psql template1;
e facciamo in modo che il nuovo db sia un template usabile in futuro:
# UPDATE pg_database SET datistemplate=’t’ WHERE datname=’template_gis’;
ok, ora possiamo creare tutti i nostri db in base a questo template.
# CREATE DATABASE nome_db template=template_gis OWNER nome_utente; (questo va fattoper ogni db)
Quindi popoliamo i db con lo script perl citato prima (come utente normale):
$ /usr/share/postgresql/8.4/utils/new_postgis_restore.pl /percorso/alla/dir/di/dump/nome_db.dmp | psql nome_db
Vedremo scorrere sul terminale una serie di istruzioni (il db si sta popolando). Fatto.
Alla fine (nel mio caso) ricordarsi di modificare i file “/etc/postgresql/8.4/main/postgresql.conf” e “/etc/postgresql/8.4/main/pg_hba.conf”.
Per il primo decommentare la riga relativa a “listen_addresses” e inserire l’asterisco al posto di “localhost” come riportato:
#——————————————————————————
# CONNECTIONS AND AUTHENTICATION
#——————————————————————————
# – Connection Settings –
listen_addresses = ‘*’ # what IP address(es) to listen on;
………………
Per il secondo (nella parte finale del file):
# Database administrative login by UNIX sockets
local all postgres ident
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# “local” is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::1/128 trust
altrimenti non sono consentiti connessioni da altri client (nel primo file) e l’esecuzione di pg_dumpall (nel secondo file)