PostgreSQL andmebaasi haldamine operatsioonisüsteem Debian keskkonnas

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

PostgreSQL tarkvara Debiani paketihaldusest kasutamisele on iseloomulik, et saab

  • samast binarist käivitada mitu komplekti andmebaasi protsesse, millest iga kasutab erinevat andmeklastrit (komplektile vastav failisüsteemi osa, kus hoitakse andmebaasi andmefaile, wal logisid jms)
  • kasutada samaaegselt mitut PostgreSQL versiooni (nt Debian Lenny puhul v. 8.3 ja 8.4; Debian Squeeze puhul v. 8.4 ja v. 9.0; lisaks saab backportsidest kasutada v. 9.1) kusjuures nendega ei maksa ka liiale minna

Käesolevas tekstis pööratakse peamiselt tähelepanu PostgreSQL andmebaasi tarkvara paigaldamisele ja kasutamisele Debiani nö tavalisest paketihaldusest, lisaks kirjeldatakse kolme alternatiivi

  • Debian backports
  • The PostgreSQL Global Development Group (PGDG) apt repositoorium
  • Enterprise DB

Keskkonna ettevalmistamine

Riistava ettavalmistamise osas üldiselt PostgreSQL andmebaasile meeldib palju mälu ja kiire IO. Lisaks peab olema kasutada vajaliku suurusega failisüsteemid, erinevate kataloogide alla monteerituna

  • /var/lib/postgresql - Debian/Ubuntu vaikekataloog andmefailide jms jaoks
  • /var/backup/postgresql - isetehtud kataloog wal archive logide jaoks
  • /var/lib/postgresql/9.4/main/pg_xlog - konkreetse baasi log failid, see peaks idee poolest olema väga hea io'ga kui ta panna eraldi

Failisüsteemide all võiks kasutada LVM'i, see teeb haldustegevused lihtsamaks

  • oluliste muudatuste eel teha snapshot
  • käivitada töötavast baasist tehtud snapshoti pealt teine eksemplar, et mida uurida
  • kui pg_xlog on eraldi failisüsteemis, siis ei saa töötavast baasist lvm snapshoti teha kuna ei õnnestu tekitada kahest failisüsteemist snapshotti samaaegselt (/var/lib/postgresql ja /var/lib/postgresql/9.4/main/pg_xlog)

Tarkvara ettavalmistamise osas ei ole vaja PostgreSQL osas midagi erilist jälgida, paketihaldus jälgib. Erandina tuleks pöörata tähelepanu lokaadi seadistamisele, nt

  • paigaldada pakett locales
  • seadistada vajalikud lokaadid, nt et_EE.UTF-8

Tarkvara paigaldamine

PostgreSQL paigaldamiseks sobib öelda

# apt-get install postgresql-9.4

mille tulemusena tekitatakse

  • kasutaja:grupp postgres:postgres
  • klastrite käivitamise skript /etc/init.d/postgresql või vastav systemd osa
  • /usr/lib/postgresql/9.4 - versioonile vastavad programmifailid
  • paigaldatakse ka andmebaasi käsurea klient pakett, kus on utiliidid psql, pg_dump jm
  • lähtestatakse andmebaasi klaster nimega 'main'

Lähtestamise tulemusena tekib

  • /etc/postgresql/9.4/main - seadistusfailid
  • /var/lib/postgresql/9.4/main - andmefailid
  • /var/log/postgresql/postgresql-9.4-main.log - logi

Tulemusena käivitakse ka andmebaasi protsess. Kui on kavatsus kasutada ainult ühte PostgreSQL protsesside komplekti, siis see ei ole niivõrd oluline, aga mitme erineva versiooni puhul on oluline tähele panna, et

  • konkreetse versiooni tarkvara asub versiooni nimelises kataloogis
  • utiliidid, nt /usr/bin/pg_dump on wrapper skripti abil ühendatud konkreetse versiooniga (mitte alternatives süsteemi abil)
# ls -ld /usr/bin/psql 
lrwxrwxrwx 1 root root 37 Dec 21 13:15 /usr/bin/psql -> ../share/postgresql-common/pg_wrapper

Selleks, et konkreetset versiooni välja kutsuda, tuleb kasutada pikka teed, nt

/usr/lib/postgresql/9.4/bin/pg_dump
/usr/lib/postgresql/9.5/bin/pg_dump

Lisaks põhiosale jagatakse lisasid (nn contrib moodulid) paketis postgresql-contrib-9.4, mille paigaldamiseks tuleb öelda

# apt-get install postgresql-contrib-9.4

contrib pakett sisaldab muuhulgas selliseid mooduleid

  • dblink
  • pgcrypto
  • adminpack
  • earthdistance
  • pgstattuple

contrib tarkvara paigaldatakse kataloogidesse

  • skriptid - /usr/share/postgresql/9.4/contrib
  • teegid - /usr/lib/postgresql/9.4/lib

Andmebaasiklastrite haldamine

Ühe töötava PostgreSQL protsessi kontrolli all olevad andmed moodustavad andmeklastri, mille moodustavad ja millega on seotud

  • üks andmefailide kataloog - nt /var/lib/postgresql/9.4/main
  • seadistusfailid pg_hba, postgresql.conf jt - nt kataloogis /etc/postgresql/8.9/main
  • logifail - nt /var/log/postgresql/postgresql-9.4-main.log

Selleks, et saaks samaaegselt kasutada mitut andmeklastrit on süsteemis Debianile spetsiifilised utiliidid

  • pg_createcluster - klastri moodustamine
  • pg_dropcluster - klastri eemaldamine
  • pg_lsclusters - klastrite nimekirja esitamine
  • pg_ctlcluster - klastri andmebaasi protsessi kontrollimine

Iga andmeklaster peab töötama erineval pordil, st ei saa töötada nt 127.0.0.1 port 5432 ja 127.0.0.2 port 5432 peal. Põhjusel, et shared memory segment on nimetatud pordi järgi.

Klastrit saab protsesside käivitamise jms mõttes juhtida kahel viisil

  • os käivitusskriptiga või vastavate systemd vahenditega
  • Debiani PostgreSQL paketi kooseisu kuuluvate pg_* utiliitidega

Käesolevas tekstis kasutatakse pigem pg_* utiliite.

Klastri moodustamine

Juurkasutajana tuleb öelda, näidates andmebaasi versiooni, klastri nime ja lisaks lokaadi, nt v. 9.4, main ja ee_EE.UTF-8 (/tmp kataloogi minek on vajalik sest juurkasutaja asub vahel oma kodukataloogis /root ning klastri tekitamisel minnakse tegutsema kasutajana postgres ja jäädakse samasse kataloogi ning saab ohutu veateate)

# cd /tmp
# pg_createcluster --locale et_EE.UTF-8 9.4 main

Klastrite tekitamisel tuleb kasutada unikaalseid nimesid kusjuures süsteem ise jälgib, et iga klaster kasutaks erinevat porti (5432, 5433 jne). Vaikimisi ei ole andmebaasile üle võrgu ligipääs lubatud ning postgres kasutaja parool on seadistamata. Kui PostgreSQL panna ka postgresql.conf failist võrgus kuulama porti ning pg_hba.conf failis lubada üle võrgu ligi, siis seadistamata parool tähendab, et keegi ei saa ligi (ja mitte, et kõik saavad ligi). Ligi saamiseks tuleb

  • lubadata pg_hba.conf failist korraks mingi host trust abil
  • logida baasi üle unix soketi ja seadistada postgres kasutajale parool

Peale moodustamist tuleb protsessid käivitada

# pg_ctlcluster version 9.4 start

Kuna tegu on tundliku teenusega, siis ei maksa käivitusskripte üleliia usaldada, nt maksab kontrollida peale protsesside töö lõpetamist, et protsesse tõesti enam ei ole

# ps U postgres

või ei ole avatud faile

# lsof -n | grep '/var/lib/postgresql/9.4/main'

Klastri eemaldamine

Klastri eemaldamisel kustutatakse vastavad andmefailid ja seadistusfailid, --stop tähendab, et esmalt lõpetatakse vastava protsessi töö

# pg_dropcluster version main --stop

Lisaks saab -- järel esitada pg_ctl programmi suvandeid, nt

# pg_ctlcluster 9.4 main stop -- -m immediate

Klastrite kontollimine

Klastri seiskamine toimub skriptga pg_cltcluster, nt

# pg_ctlcluster 9.4 tartu stop

Klastrite nimekirja estitamine toimub skriptiga pg_lsclusters

# pg_lsclusters
Version Cluster   Port Status Owner      Data directory                 Log file
9.4     main      5432 online postgres   /var/lib/postgresql/9.4/main   /var/log/postgresql/postgresql-9.4-main.log
9.4     tartu     5433 down   postgres   /var/lib/postgresql/9.4/tartu  /var/log/postgresql/postgresql-9.4-tartu.log
9.4     elva      5434 online postgres   /var/lib/postgresql/9.4/elva   /var/log/postgresql/postgresql-9.4-elva.log

Fail /etc/postgresql/9.4/klastrinimi/start.conf näitab, kas PostgreSQL klastrite käivitamise skript tegeleb vastava klastriga või mitte. Lisaks saab kasutada pg_ctl programmi suvandeid, nt

# pg_ctlcluster 9.4 tartu stop -- -m immediate

Erinevate PostgreSQL versioonide haldamine

Lisaks sama PostgreSQL andmebaasi versiooni binarist mitmete protsesside käivitamisele, millest iga kasutab erinevat andmeklastrit on võimalik kasutada kas mitmeid erinevaid PostgreSQL versioone. Nt kui arvutisse on paigaldatud Debian Lenny v. 5 keskkonnas paketid postgresql-8.3 ja postgresql-8.4.

Erinevate klientprogrammide versioonide kasutamine

Olgu süsteemi paigaldatud sellised PostgreSQL versioonid ja töötagu nad nt selliselt

# pg_lsclusters 
Version Cluster   Port Status Owner    Data directory                     Log file
8.4     main      5434 online postgres /var/lib/postgresql/8.4/main       /var/log/postgresql/postgresql-8.4-main.log
8.4     main_utf8 5435 online postgres /var/lib/postgresql/8.4/main_utf8  /var/log/postgresql/postgresql-8.4-main_utf8.log
9.0     main      5432 online postgres /var/lib/postgresql/9.0/main       /var/log/postgresql/postgresql-9.0-main.log
9.1     main      5433 online postgres /var/lib/postgresql/9.1/main       /var/log/postgresql/postgresql-9.1-main.log
9.1     main_utf8 5436 online postgres /var/lib/postgresql/9.1/main_utf8  /var/log/postgresql/postgresql-9.1-main_utf8.log

Erinevaid psql kliendi versiooni saab kasutada nt --cluster võtme abil (tundub, et see ei tööta siiski)

$ psql -V --cluster 8.4/main
psql (PostgreSQL) 8.4.9
contains support for command-line editing
$ psql -V --cluster 9.0/main
psql (PostgreSQL) 9.0.5
contains support for command-line editing

Parem on kasutada pikka teed

$ /usr/lib/postgresql/9.5/bin/pg_dump ...

Kõige olulisem on tõenäoliselt kasutada õiget programmide pg_dump ja pg_restore versiooni.

Andmebaasi seadistamine

Andmebaasi moodustamiseks on kaks viisi

  • SQL käsuga
  • Debiani paketihalduses sisalduva shell skriptiga

Andmebaasi moodustamine shell skriptiga

# createdb -h 127.0.0.1 -p 5432 -U postgres -O omanikunimi -E UTF8 -l en_US.UTF-8 -e baasinimi
CREATE DATABASE baasinimi OWNER omanikunimi ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';

kus

  • -h, -p ja -U - millised andmebaasi protsessi poole pöördudakse create database andmebaasi moodustamiseks
  • -E - encoding
  • -l - collate ja ctype
  • -e esitab käsud, mis andmebaasile öeldi
  • baasinimi on moodustatava create database andmebaasi nimi

Andmebaasi kustutamiseks sobib öelda

# dropdb -h 127.0.0.1 -p 5432 -U postgres -e baasinimi
DROP DATABASE baasinimi

kus

  • -h, -p ja -U - millised andmebaasi protsessi poole pöördudakse create database andmebaasi kustutamiseks
  • -e - esitab käsud, mis andmebaasile öeldi
  • baasinimi on kustutatava create database andmebaasi nimi

Andmebaasi moodustamine SQL käsuga

TODO

core failide salvestamine

core failide salvestamiseks tuleb kasutada seadistusfailis /etc/postgresql/9.0/main/pg_ctl.conf rida

# cat /etc/postgresql/9.0/main/pg_ctl.conf 
...
pg_ctl_options = '-c'

ning selguse mõttes võiks lisaks kasutada sellist sysctl väärtust

# sysctl -w kernel.core_pattern=core.%e.%p

Tulemusena ...

contrib moodulite paigaldamine

contrib moodulite kasutamiseks tuleb reeglina laadida soovitud skeemi mooduliga kaasas olevad funktsioonid ja muud objektid.

dblink

dblink http://www.postgresql.org/docs/current/static/dblink.html võimaldab kasutada ühe andmebaasi päringutes teise andmebaasi andmeid.

Vajadusel näidata dblink.sql skriptis skeemirada

-- Adjust this setting to control where the objects get created.
SET search_path = dblink;

Paigaldamiseks tuleb laadida funktsioonid soovitud skeemi

$ psql -h 127.0.0.1 -U postgres test < /usr/share/postgresql/8.4/contrib/dblink.sql

Uuemal ajal, st nt PostgreSQL v. 9.2 puhul sobib öelda

SQL> create extension dblink;

pgcrypto

pgcrypto http://www.postgresql.org/docs/current/static/pgcrypto.html võimaldab kasutada andmebaasis krüptimise funktsioone.

Vajadusel näidata pgcrypto.sql skriptis skeemirada

-- Adjust this setting to control where the objects get created.
SET search_path = pgcrypto;

Paigaldamiseks tuleb laadida funktsioonid soovitad skeemi

$ psql -h 127.0.0.1 -U postgres test < /usr/share/postgresql/8.4/contrib/pgcrypto.sql

Uuemal ajal, st nt PostgreSQL v. 9.2 puhul sobib öelda

SQL> \c baasinimi
SQL> create extension pgcrypto;

Tulemusena tekitatakse baasinimi nimelisse create database andmebaasi public skeemi paarkümmend funktsiooni.

tsearch2

tsearch2 http://www.postgresql.org/docs/8.4/static/textsearch.html on täisteksti otsingu moodul.

Vajadusel näidata tsearch2.sql skriptis skeemirada

-- Adjust this setting to control where the objects get created.
SET search_path = tsearch2;

Paigaldamiseks tuleb laadida funktsioonid soovitad skeemi

$ psql -h 127.0.0.1 -U postgres test < /usr/share/postgresql/8.4/contrib/tsearch2.sql

PL-keeled

TODO

plpgsql

PL/pgSQL on üks PostgreSQL andmebaasi protseduuriline keel. Keele lisamiseks sobib öelda kas

$ createlang -h 127.0.0.1 -U postgres plpgsql movies

Ja tulemuse kontrollimiseks

movies=# select * from pg_language ;
 lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl 
----------+----------+---------+--------------+---------------+--------------+--------
 internal |       10 | f       | f            |             0 |         2246 | 
 c        |       10 | f       | f            |             0 |         2247 | 
 sql      |       10 | f       | t            |             0 |         2248 | 
 plpgsql  |       10 | t       | t            |         16446 |        16447 | 
(4 rows)

ehk otsekohesemalt

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
 HANDLER plpgsql_call_handler
 VALIDATOR plpgsql_validator;

plpython

# apt-get install postgresql-plpython-8.4

plperl

# apt-get install postgresql-plperl-8.4

Ja keele kirjeldamiseks andmebaasis tuleb öelda

 CREATE PROCEDURAL LANGUAGE 'plperlu'
   HANDLER plperl_call_handler
   VALIDATOR plperl_validator;

plproxy

PL/Proxy https://developer.skype.com/SkypeGarage/DbProjects/PlProxy tarkvara võimaldab esitada andmebaasist päringuid teise andmebaasi. Tarkvara paigaldamiseks sobib öelda

# apt-get install postgresql-8.4-plproxy

Keele lisamiseks tuleb öelda

$ psql -h 127.0.0.1 ... < /usr/share/postgresql-8.4-plproxy/plproxy.sql

ehk

CREATE FUNCTION plproxy_call_handler ()
 RETURNS language_handler AS '$libdir/plproxy' LANGUAGE C;
 
-- language
CREATE LANGUAGE plproxy HANDLER plproxy_call_handler;

pgpool-II

pgpool-II http://pgpool.projects.postgresql.org/ tarkvara ...

# apt-get install pgpool2

Andmebaasi ettevalmistamine SSL kasutamiseks

TODO

Serveri sertifikaadi juurutamine

Selleks, et PostgreSQL andmebaasi klient saaks andmebaasiga ühenduda kasutades seejuurel SSL'i peab olema vastav toetus nii andmebaasi serveri kui kliendi poolel olemas. Serveri poolel tuleb SSL sisselülitamiseks

  • seadisusfailis kasutada nt ridu
ssl=on
ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'
  • pg_hba failis kasutada nt rida
hostssl    all         all         192.168.10.10/32          md5

ning lisaks andmeklastri kataloogi paigutada sertifikaat ning vastav salajane võti

$ find /var/lib/postgresql/8.4/main/server.*
/var/lib/postgresql/8.4/main/server.crt
/var/lib/postgresql/8.4/main/server.key

Tulemusena on kliendi ja serveri vaheline ühendus turvaline kusjuures server ei kontrolli kliendi sertifikaati. Muudatuste kehtestamiseks tuleb teha andmebaasi protsessile stop ja start.

Vaikimisi on genereeritud serverile selline sertifikaat

$ openssl x509 -in server.crt -noout -text
...
Issuer: CN=localhost.localdomain
Validity
  Not Before: Jan 14 14:55:05 2010 GMT
  Not After : Jan 12 14:55:05 2020 GMT
Subject: CN=localhost.localdomain
...

Kasutaja sertifikaadi kontrollimise juurutamine

Selleks, et server kontrolliks kasutaja sertifikaati tuleb serveri andmeklastri kataloogi lisada fail

/var/lib/postgresql/8.4/main/root.crt

milles sisaldub ahel, mille vastu on kliendi sertifikaat väljastatud.

Andmebaasi käivitamine

# /etc/init.d/postgresql stop|start

kusjuures

  • /etc/postgresql/8.4/main/environment faili abil saab kirjeldada baasi protsessi jaoks keskkonnamuutujaid, nt nihutada /usr/local/geos/lib teeki ettepoole
LD_LIBRARY_PATH = '/usr/local/geos/lib'

Andmebaasiga ühendumine

TODO

Connection parameters abil

Ühendusparameetrite (ingl. k. connection parameters) abil andmebaasiga ühendumist kirjeldatakse aadressil http://www.postgresql.org/docs/8.4/interactive/libpq-connect.html, tavaliselt moodustab kasutaja tavaliselt oma kodukataloogi nt sarnase sisuga faili

$ cat .pg_service.conf
[auul-pg]
host=192.168.1.245
dbname=baasinimi
user=priit
sslmode=require

kus

  • sslmode=require - ühendumiseks kasutatakse tingimata ssl režiimi

Andmebaasiga ühendumiseks piisab seejärel öelda

$ psql "service=auul-pg"
Password for user postgres: 
Welcome to psql 8.3.12, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
baasinimi=>

Kliendi sertifikaadi kasutamine

http://www.postgresql.org/docs/8.3/interactive/libpq-ssl.html

PL/Java

2011 kevadel tuleb kompileerida JVM v. 1.5 abil ning kasutada saab ka JVM .v 1.6 tarkvaraga

# export JAVA_HOME=/usr/local/java-1.5
# export PATH=/usr/local/java-1.5/bin:$PATH
# ...
# make
# make install

Tulemusena on lisatud kaks teeki

# find /usr/lib/postgresql/9.0 -mmin -1 -ls
328250    4 drwxr-xr-x   3 root     root         4096 May 17 10:08 /usr/lib/postgresql/9.0/lib
329513 1224 -rwxr-xr-x   1 root     root      1246388 May 17 10:08 /usr/lib/postgresql/9.0/lib/pljava.so
329514  160 -rw-r--r--   1 root     root       156108 May 17 10:08 /usr/lib/postgresql/9.0/lib/pljava.jar

Käivitamiseks sobib /etc/postgresql/9.0/main/environment failis kirjeldada JAVA_HOME ja PATH koos javaga.

binary in-place upgrade 9.0 -> 9.1

Tööpõhimõte

  • serverid käivitatakse kuulama unixi soketitel

Ettevalmistused

  • Lähtepunktiks olev andmebaas peaks olema viimasele stabiilsele oma major versiooni sub-versioonile uuendatud, nt 9.2.4 -> 9.2.6 eeldusel, et .6 on parasjagu viimane.
  • Olulised pikalt töötavad käsud võiks öelda screen programmi abil.
  • Tagada, et baasi poole migratsiooni käigus miski kõrvaline ei saaks pöörduda, nt seisata cron protsess.

Tegevused

http://www.postgresql.org/docs/9.1/static/pgupgrade.html tehnika võimaldab uuendada PostgreSQL andmebaasi ilma andmete dumpimiseta, st ilma vajaduseta kasutada nt pg_dump ja pg_restore utiliite.

  • Initsialiseerida uue versiooni klaster samade omadustega nagu uuendatav on olnud, nt (ebaselge on, kas seejärel võib või ei tohi korraks uut klastrit käivitada, pigem mitte, juhend ütleb 'There is no need to start the new cluster.')
# pg_createcluster --locale et_EE.UTF-8 9.1 main 
  • Paigaldada custom shared object teegid, nt contrib ning muud teegid, nt pljava, vajadusel kasutada LD_LIBRARY_PATH vms keskkonnamuutajaid
  • Paigaldada serverite dev paketid, milles sisaldub vajalik pg_config utiliit
 # apt-get install postgresql-server-dev-9.0 postgresql-server-dev-9.1
  • Kohendada autentimist, et kui protseduuri käigus vahepeal käivitatakse serveri protsesse, siis saaks vajalik osaline ligi ja mittevajalikud mitte
  • Kohendada postgresql.conf faile, et server ei salvestaks wal logi, st kasutada rida
archive_mode = off
  • Veenduda, et serverite protsessid ei tööta
  • Näidata -o ja -O suvanditega seadistusfailide asukohad või kopeerida pg_hba.cf ja postgresql.conf vastavatesse andmeklastri kataloogidesse
  • Käivitada kasutajana postgres /usr/lib/postgresql/9.1/bin/pg_upgrade kataloogis, kuhu on kasutajal postgres kirjutamise õigus uuendamise võimalikkuse kontrollimiseks
$ /usr/lib/postgresql/9.1/bin/pg_upgrade -b /usr/lib/postgresql/9.0/bin -B /usr/lib/postgresql/9.1/bin \
  -d /var/lib/postgresql/9.0/main -D /var/lib/postgresql/9.1/main -p 5434 -P 5433
  -o '-D /etc/postgresql/9.0/main' -O '-D /etc/postgresql/9.1/main' -c
Performing Consistency Checks
-----------------------------
Checking current, bin, and data directories                 ok
Checking cluster versions                                   ok
Checking database user is a superuser                       ok
Checking for prepared transactions                          ok
Checking for reg* system oid user data types                ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for prepared transactions                          ok
Checking for presence of required libraries                 ok

Clusters are compatible

kus

  • kasutatakse uue versiooni pg_upgrade programmi
  • -b - vana binary
  • -B - uus binary
  • -d - vana andmeklastri kataloog
  • -D - uue andmeklastri kataloog
  • -p - vana port
  • -P - uue port
  • -o - vana seadistusfailide kataloog
  • -O - uue seadistusfailide kataloog
  • -j - mitut paralleelset lõime kasutada (loogiline oleks näidata arvuks protsessori tuumade arv, st mis top CPU arvuks ütleb)
  • -c - check režiim

Check käigus moodustatakse käesolevasse kataloogi neli faili

-rw------- 1 postgres postgres  896 Feb 24 21:21 pg_upgrade_internal.log
-rw------- 1 postgres postgres  179 Feb 24 21:21 pg_upgrade_restore.log
-rw------- 1 postgres postgres 1211 Feb 24 21:21 pg_upgrade_server.log
-rw------- 1 postgres postgres  179 Feb 24 21:21 pg_upgrade_utility.log
  • Probleemide korral jälgida väljundit ja kui serveri ei taha käivituda, käivitada korra käsitsi, nt selliselt ning vaadata /tmp/9.0.log failist logi
$ /usr/lib/postgresql/9.0/bin/pg_ctl -w -l "/tmp/9.0.log" -D "/var/lib/postgresql/9.0/main" -o "-p 5432 \
  -c autovacuum=off -c autovacuum_freeze_max_age=2000000000" start'
  • Käivitada kasutajana postgres /usr/lib/postgresql/9.1/bin/pg_upgrade uuendamiseks
$ /usr/lib/postgresql/9.1/bin/pg_upgrade -b /usr/lib/postgresql/9.0/bin -B /usr/lib/postgresql/9.1/bin \
  -d /var/lib/postgresql/9.0/main -D /var/lib/postgresql/9.1/main -p 5434 -P 5433
Performing Consistency Checks
-----------------------------
Checking current, bin, and data directories                 ok
Checking cluster versions                                   ok
Checking database user is a superuser                       ok
Checking for prepared transactions                          ok
Checking for reg* system oid user data types                ok
Checking for contrib/isn with bigint-passing mismatch       ok
Creating catalog dump                                       ok
Checking for prepared transactions                          ok 
Checking for presence of required libraries                 ok 

| If pg_upgrade fails after this point, you must
| re-initdb the new cluster before continuing.
| You will also need to remove the ".old" suffix
| from /var/lib/postgresql/9.0/main/global/pg_control.old. 

Performing Upgrade
------------------
Adding ".old" suffix to old global/pg_control               ok
Analyzing all rows in the new cluster                       ok
Freezing all rows on the new cluster                        ok
Deleting new commit clogs                                   ok
Copying old commit clogs to new server                      ok
Setting next transaction id for new cluster                 ok
Resetting WAL archives                                      ok
Setting frozenxid counters in new cluster                   ok
Creating databases in the new cluster                       ok
Adding support functions to new cluster                     ok
Restoring database schema to new cluster                    ok
Removing support functions from new cluster                 ok
Copying user relation files
 /var/lib/postgresql/9.0/main/base/16427/204423 
...
Restoring user relation files
                                                            ok
Setting next oid for new cluster                            ok
Creating script to delete old cluster                       ok

Upgrade complete
----------------
| Optimizer statistics are not transferred by pg_upgrade
| so consider running:
|       vacuumdb --all --analyze-only
| on the newly-upgraded cluster.

| Running this script will delete the old cluster's data files:
|       /opt/postgres/delete_old_cluster.sh

Uuendamise käigus moodustatakse käesolevasse kataloogi sellised failid

postgres@eap:/opt/postgres/20130302/tmp$ ls -l
total 6624
-rw------- 1 postgres postgres 2326237 Mar  2 17:26 pg_upgrade_dump_all.sql
-rw------- 1 postgres postgres 2316285 Mar  2 17:26 pg_upgrade_dump_db.sql
-rw------- 1 postgres postgres    9930 Mar  2 17:26 pg_upgrade_dump_globals.sql
-rw------- 1 postgres postgres   13817 Mar  2 17:28 pg_upgrade_internal.log
-rw------- 1 postgres postgres 2085221 Mar  2 17:26 pg_upgrade_restore.log
-rw------- 1 postgres postgres    1772 Mar  2 17:26 pg_upgrade_server.log
-rw------- 1 postgres postgres    1330 Mar  2 17:26 pg_upgrade_utility.log
  • Teha vacuum analyze, eelnevalt on vaja uue andmebaasi protsessid käivitada
$ vacuumdb --all --analyze-only 1>/tmp/9.1-vacuum-1.log 2>/tmp/9.1-vacuum-2.log
  • Kustutada andmeklastri kataloogist sinna kopeeritud pg_hba.conf ja postgresql.conf
  • Kohendada ligipääsud normaalseteks ning lülitada wal arhiveerimine sisse (kui seda kasutatakse)

in-place upgrade tegemisel kopeerimise teel tuleb arvestada, et vana andmeklastri pg_control fail nimetatakse ümber

/var/lib/postgresql/9.0/main/global/pg_control -> /var/lib/postgresql/9.0/main/global/pg_control.old

Kui mingil põhjusel on tarvis vana klaster käivitada, tuleb see fail tagasi nimetada.

binary in-place upgrade 9.1 -> 9.2

Tundub, et väga sarnane 9.0 -> 9.1 uuendusega

  • pg_upgrade tulemusena tekitatakse käesolevasse kataloogi mõned skriptid, mida soovitatakse käivitada, nt
analyze_new_cluster.sh

binary in-place upgrade 9.2 -> 9.3

Tundub, et väga sarnane 9.0 -> 9.1 uuendusega

binary in-place upgrade 9.3 -> 9.4

Tundub, et väga sarnane 9.3 -> 9.4 uuendusega

Katse näitab, et ka v. 8.4.22 -> 9.4.0 toimib.

binary in-place upgrade 9.4 -> 9.5

Tundub, et väga sarnane 9.4 -> 9.5 uuendusega

binary in-place upgrade 9.5 -> 9.6

Tundub, et väga sarnane 9.5 -> 9.6 uuendusega

Debian backports repositoorium

PostgreSQL v. 9.0 andmebaasi kasutamine

Debian Squeeze backports repositooriumist saab kasutada PostgreSQL v. 9.0 andmebaasi tarkvara, paigaldamiseks tuleb

  • näidata /etc/apt/sources.list failis backports asukoht
# cat /etc/apt/sources.list
...
deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free
  • uuendada apt-get update abil kirjeldused ning paigaldada tarkvara
# apt-get update
# apt-get -t squeeze-backports install postgresql-9.0

PostgreSQL v. 9.1 andmebaasi kasutamine

Debian Squeeze backports repositooriumist saab kasutada PostgreSQL v. 9.1 andmebaasi tarkvara, paigaldamiseks tuleb

  • näidata /etc/apt/sources.list failis backports asukoht
# cat /etc/apt/sources.list
...
deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free
  • uuendada apt-get update abil kirjeldused ning paigaldada tarkvara
# apt-get update
# apt-get -t squeeze-backports install postgresql-9.1

PGDG repositoorium

The PostgreSQL Global Development Group (PGDG) repositooriumi kasutamist kirjeldatakse aadressil https://wiki.postgresql.org/wiki/Apt. Esmalt tuleb lisada /etc/apt/sources.list faili nt rida (wheezy asemel kasutada sobivat, nt jessie)

deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main

seejärel öelda

# apt-get update
...
W: GPG error: http://apt.postgresql.org wheezy-pgdg Release: The following signatures were invalid: KEYEXPIRED 1381654177

ning paigaldada pakett pgdg-keyring vastates 'y'

# apt-get install pgdg-keyring

ning uuesti

# apt-get update

Seejärel saab PostgreSQL tarkvara erinevaid pakette paigaldada nö tavalisel viisil, 2013 oktoobris paistavad olema kasutada sellised paketid

# apt-cache search postgresql | grep 9.3
libpgtypes3 - shared library libpgtypes for PostgreSQL 9.3
postgresql-9.3 - object-relational SQL database, version 9.3 server
postgresql-9.3-dbg - debug symbols for postgresql-9.3
postgresql-9.3-ip4r - IPv4 and IPv6 types for PostgreSQL 9.3
postgresql-9.3-pgmemcache - PostgreSQL interface to memcached
postgresql-9.3-pgmp - arbitrary precision integers and rationals for PostgreSQL 9.3
postgresql-9.3-pgpool2 - connection pool server and replication proxy for PostgreSQL - modules
postgresql-9.3-pllua - Lua procedural language for PostgreSQL 9.3
postgresql-9.3-plproxy - database partitioning system for PostgreSQL 9.3
postgresql-9.3-plr - Procedural language interface between PostgreSQL and R
postgresql-9.3-plsh - PL/sh procedural language for PostgreSQL 9.3
postgresql-9.3-plv8 - Procedural language interface between PostgreSQL and JavaScript
postgresql-9.3-postgis-2.1 - Geographic objects support for PostgreSQL 9.3
postgresql-9.3-postgis-2.1-scripts - PostGIS for PostgreSQL 9.3 -- scripts -- dummy package
postgresql-9.3-postgis-scripts - Geographic objects support for PostgreSQL 9.3 -- scripts
postgresql-9.3-slony1-2 - replication system for PostgreSQL: PostgreSQL 9.3 server plug-in
postgresql-client-9.3 - front-end programs for PostgreSQL 9.3
postgresql-contrib-9.3 - additional facilities for PostgreSQL
postgresql-doc-9.3 - documentation for the PostgreSQL database management system
postgresql-plperl-9.3 - PL/Perl procedural language for PostgreSQL 9.3
postgresql-plpython-9.3 - PL/Python procedural language for PostgreSQL 9.3
postgresql-plpython3-9.3 - PL/Python 3 procedural language for PostgreSQL 9.3
postgresql-pltcl-9.3 - PL/Tcl procedural language for PostgreSQL 9.3
postgresql-server-dev-9.3 - development files for PostgreSQL 9.3 server-side programming
skytools-modules-9.3 - PostgreSQL 9.3 modules for skytools

Tundub, et nii paidaldatud tarkvara sobib kasutada koos varem süsteemi paigaldatud debiani enda või backports repost paigaldatud PostgreSQL'iga, wrapperid töötavad

# pg_lsclusters 
Version Cluster   Port Status Owner    Data directory                     Log file
9.0     main      5433 down   <unknown> /var/lib/postgresql/9.0/main       custom
9.1     main      5434 down   postgres /var/lib/postgresql/9.1/main       custom
9.2     main      5432 online postgres /var/lib/postgresql/9.2/main       custom

ühe erinevusega, psql käsu --cluster võti ei toimi, ilmselt kuna pg-wrapperis on read

$ diff /usr/share/postgresql-common/pg_wrapper /tmp/pg_wrapper 
100c100,108
< my $cmd = get_program_path ($cmdname, $version);
---
> my $cmd;
> 
> # for psql we always want the latest version, as this is backwards compatible
> # to every major version that that we support
> if ($cmdname eq 'psql') {
>     $cmd = get_program_path ('psql', get_newest_version);
> } else {
>     $cmd = get_program_path ($cmdname, $version);
> }

libpq5 teegi versioon

PostgreSQL paigaldamisel, nt

# apt-get install postgresql-9.2

paigaldatakse muu hulgas viimane stabiilne libpq5 pakett, st igal juhul viimase 9.x versiooni oma. PGDG FAQ kõneleb, et libpq5 on tagasi ühilduv ja nii sobibki üldiselt kasutada. Vajadusel saab kasutada sama libpq5 versiooni täpsustades versioon sources.list failis

deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main 9.2

ning öeldes nt

# apt-get install postgresql-9.2=9.2.17-1.pgdg80+1 libpq5=9.2.17-1.pgdg80+1

Märkused

  • /root kataloog peab olema postgres kasutaja jaoks sisenetav või peab pg_createcluster käsu ütlemise ajal olema mõnes sellises kataloogis, nt /tmp
  • Kui PostgreSQL käivitamise väga varases faasis on probleeme, siis need ei pruugi jõuda logisse, aitab käivitada käsurealt foregroundis, nt normaalsel puhul
postgres@moraal:~$ /usr/lib/postgresql/9.5/bin/postgres -D /etc/postgresql/9.5/test
2016-02-04 16:59:11 EET [16820-1] LOG:  database system was shut down at 2016-02-04 16:57:50 EET
2016-02-04 16:59:11 EET [16820-2] LOG:  MultiXact member wraparound protections are now enabled
2016-02-04 16:59:11 EET [16824-1] LOG:  autovacuum launcher started
2016-02-04 16:59:11 EET [16819-1] LOG:  database system is ready to accept connections

ja ebanormaalsel

postgres@piia-pg5a:~$ /usr/lib/postgresql/8.4/bin/postgres -D /etc/postgresql/8.4/main 
FATAL:  invalid value for parameter "lc_messages": "et_EE.UTF-8"

Versiooni uuendmine, lc_collate muutmine ja data-checksums sisselülitamine

# pg_createcluster --locale et_EE.UTF-8 10 test -- --data-checksums
$ time /usr/lib/postgresql/10/bin/pg_dump -p 5432 -j 4 -Fd -f for-pg-10-from-pg-10-baasinimi-2021215.dir baasinimi
$ time /usr/lib/postgresql/10/bin/pg_restore -p 5435 -j 4 -d baasinimi for-pg-10-from-pg-10-baasinimi-2021215.dir \
  1>pg_restore-log.1-from-10-to-10 2>pg_restore-log.2-from-10-to-10
$ time /usr/lib/postgresql/11/bin/pg_upgrade -j 4 -b /usr/lib/postgresql/10/bin -B /usr/lib/postgresql/11/bin -d /var/lib/postgresql/10/main -D /var/lib/postgresql/11/tmp -p 5441 -P 5442 -o '-D /etc/postgresql/10/main' -O '-D /etc/postgresql/11/tmp'

pg_upgradecluster utiliidi kasutamine

TODO

postgres@baas:~/202301012$ pg_upgradecluster -m upgrade -v 14 9.4 pgclustername

kus

  • -m upgrade tähistab asjaolu, et uuendamisel kasutatakse pg_upgrade (mitte nt pg_dump)
  • -v 14 - uus versioon
  • 9.4 positsioonil on vana versioon
  • pgclustername positsioonil on vana versiooni cluster name (nagu nt pg_lsclusters väljundis paistab)
  • tulemusena matkitakse isegi seadistusi (konstrueeritakse vanale sarnane postgresql.conf)


Kasulikud lisamaterjalid