Jag har en dator med PostGIS, där databasen ligger på en disk där utrymmet börjar ta slut. Nu har jag lagt till några diskar i en ny RAID partition och tänkte flytta databasen dit.
Jag har monterat min raid på /raid, naturligtvis!
På denna plats skapar jag en katalog ”postgis” där jag vill skapa den nya databasen. Denna katalog måste ”ägas” av användaren postgres.
sudo chown postgres /raid/postgis sudo chgrp postgres /raid/postgis
Sedan är det dags att skapa en ny databas på denna sökväg.
sudo -u postgres psql postgres=# create tablespace ts location '/raid/postgis'; postgres=# create database geodata with tablespace = ts; postgres=# \q
Initiera databasen som vanligt.
sudo -u postgres psql -d geodata geodata=# create extension postgis; geodata=# select PostGIS_version();
Det finns säkert flera sätt att flytta data från en databas till en annan, men jag kör ”universalmetoden” att ”dumpa” hela databasen till en fil och sedan läsa in den i den nya databasen.
sudo -u postgres pg_dump old_database > /raid/old_database.sql sudo -u postgres psql -d geodata -f /raid/old_database.sql
När jag tänker efter så borde jag kunna köra båda kommandon samtidigt med ett ”|” kommando, eftersom jag dumpar och importerar på samma maskin… Ovanstående fungerar dock bra även om man har databaserna på olika maskiner och skall flytta data mellan dessa, eller om man vill ta en backup…
Det brukar bli en massa felmeddelanden när man kör skriptet, men det brukar vara i sin ordning då en del som skriptet försöker skapa i den nya databasen redan finns. Ha tålamod och vänta bara på resultatet. Radera sedan inte något gammalt vare sig i databasen eller den genererade filen förrän allt i den nya databasen är testat.
För mig gick det betydligt snabbare att dumpa den 36 Gb stora sql-filen än att läsa in den.
Ett problem dock! De QGIS stilar som var lagrade i databasen och direkt kopplade till varje lager fungerar inte. Tabellerna med stilarna finns i den nya databasen, men tabellen är tom. Jag kan inte heller dumpa tabellen separat och läsa in den då det verkar som att sql skriptet inte riktigt är kompatibelt med koden för stilerna som de lagras…
Projektfiler som är lagrade i databasen överförs dock, men då dessa har data som pekar på den gamla databasen så är de inte speciellt användbara heller. Projektfilerna sparas i ett binärformat och inte som xml, vilket kan vara anledningen till att dessa överförs korrekt. Lösningen är att dels se till att dumpningen görs i ”plain” format och att man lägger till en rad överst i det genererade skriptet:
SET XML OPTION DOCUMENT;
Med detta så importeras stilarna till den nya databasen, men de är inte längre kopplade till lagerna, så den inläsningen får ändå göras manuellt. Jag kan tänka mig att det vore bättre att göra om hela skiten, men med texten ovan i dump-filen.
echo "SET XML OPTION DOCUMENT;" > /raid/backup.sql sudo -u postgres pg_dump gammal_databas >> /raid/backup.sql sudo -u postgres psql -d ny_databas -f /raid/backup.sql
Så det provade jag också… Men nix! Stilarna följde med men de applicerades inte på lagren. Det blir till att göra detta manuellt för varje lager. Om det skulle se annorlunda ut om man flyttade data mellan två databaser med samma namn har jag inte provat, men jag kan tänka mig att det kan fungera bättre då man inte ändrar några grundläggande förutsättningar.
Som sista kommentar kring PostGIS vill jag trycka på att om ni är beroende av PostGIS databasen så är nog inte ”pg_dump” den bästa metoden för att hantera backup… Det finns andra alternativ som är bättre, exempelvis ”pgbackrest”.
Kommentar av mig själv. Här dumpar jag hela databasen till en fil, vilket egentligen är onödigt. Det hade räckt att dumpa endast de schema som jag lagrar data i. Vilka jag sedan återskapar i den nya databasen. Då hade jag undvikit många felmeddelanden vid återläsning, som beror på att skriptet försöker göra saker som inte går, eller skapa sådant som redan finns. I samband med detta är det även viktigt att trycka på att man ALDRIG skall spara data i schemat Public, även om det är enkelt och det som är förvalt. Skapa ALLTID ett dedikerat schema för att lagra data. I public lagras systemfunktioner, och dessa är inte alltid kompatibla med den databas man migrerar till. Att migrera endast data i egna scheman fungerar dock alltid även om man byter version av Postgresql eller PostGIS. Detta kompliceras dock av att QGIS lagrar stilar i public…
Tips. Man kan ändra båda användare och grupp i samma chmod(1), om man vill.
chmod postgress:postgress /raid/postgis
När det gäller att kopiera över hela databasen, så kan man ju använda pipe som du nämner, dvs ”|”, om man inte vill mellanlagra på en fil. Vilket kan vara bra som en säkerhetsuppdatering. Men vill man kopiera mellan olika maskiner, så är ju ssh(1) lämpligt kommando. Detta fungerar från machine2, med den nya databasen.
ssh login@machine1 -Tq -f ”sudo -u postgres pg_dump old_database” | sudo -u postgres psql -d geodata
Det går tom att köra ssh mot två andra maskiner än den man använder själv. 🙂
ssh login1@machine1 … | ssh login2@machine2 …
Då tar data omvägen över den lokala maskinen på väg från machine1 till machine2.
Samma om man vill kopiera filer med scp(1). Här kopieras fil.txt på login1:s hemmakatalog till login2:s hemmakatalog.
scp login1@machine1:fil.txt login1@machine2:
Eventuellt så behöver man ange filnamnet ”-” (med växeln -f) för att mata in från föregående program via stdin för psgl(1). Samt göra de ändringar som du nämner i din kommentar.
Att detta fungerar behöver man kontrollera, exempelvis i manualsidan för psql(1). Detta eftersom jag gör det här från det du skrev och hur program brukar fungerar. Dvs jag har inte testat själv. 🙂