Lähtetekstist kompileeritud PostgreSQL kasutamine Debianiga

Allikas: Kuutõrvaja
Redaktsioon seisuga 5. aprill 2009, kell 16:17 kasutajalt Imre (arutelu | kaastöö) (Andmebaasi WAL logide kasutamine)

Sissejuhatus

PostgreSQL tarkvara kasutamiseks Debian Lenny'ga on kaks võimalust

  • paigaldada tarkvara paketihaldusest, 20090329 on seal versioon 8.3.6-1
  • kompileerida tarkvara aadressil http://www.postgresql.org/ jagatavast lähtetekstist

Käesolev tekst tegeleb juhtumiga, kus andmebaas ning olulised lisamoodulid on paigaldatud lähtetekstist, sellisel lähenemisel on sellised eelised

  • paindlikkus - kasutaja saab kontrollida, milliste omaduste PostgreSQL täpselt tekib
  • andmebaasi versioon - kasutaja saab valida, millist PostgreSQL versiooni kasutada

ja puudused

  • automaatsed veaparandused - kasutajal endal on kohustus veaparanduste ja versiooniuuenduste puhul kompileerida PostgreSQL mida muidu võiks saada uuendada paketihalduse vahenditega

Kasutaja peab ise otsustama, millisel viisil ta PostgreSQL tarkvara kasutab, paketihaldusest tuleva PostgreSQL kasutamist on kirjeldatud palas ..

Ettevalmistuste tegemine

Tekitada operatsioonisüsteemi kasutaja:grupp postgres:postgres kodukataloogiga /home/postgres

 # groupadd -g 110 postgres
 # useradd -u 110 -g postgres -m -d /home/postgres postgres

Valmistame ette LVM abil failisüsteemid binari installi ning andmekluster (ingl. k. data cluster) kataloogide jaoks

  • /usr/local - kuigi PostgreSQL ise hakkab asuma kataloogis /usr/local/postgresql, nagu allpool näeme paigutame lisamooduli Postgis kataloogi /usr/local/postgis ja mõnus on neid korraga käsitleda
  • /data/postgresql - andmekluster
  • /data/backup/postgresql/archive-logs - arhiveeritud wal logid

Tarkvara paigaldamine

Kasutame selleks GNU C kompilaatorit (gcc) ning muid abivahendeid, mida saab paigaldada öeldes

 # apt-get build-dep postgresql
 # apt-get install bison flex

Paigaldamiseks tuleb logida süsteemi sisse kasutajana postgres ning pakkida lahti PostgreSQLi lähtetekst

 bash$ mkdir 20090329 && cd 20090329
 bash$ wget ftp://ftp.eenet.ee/pub/postgresql/source/v8.3.7/postgresql-8.3.7.tar.bz2
 bash$ tar jxf postgresql-8.3.7.tar.bz2

Veendume, et protsessid ei käi ja failid ei ole kasutuses ning kui on asjakohane, liigutame vanad asjad eest ära

 bash# mv /usr/local/postgresql /usr/local/postgresql-20090329-ennem-837-paigaldust
 bash# mv /data/postgresql /data/postgresql-20090329-ennem-837-paigaldust

Konfigureerimine, kompileerime ning paigaldame

 bash$ ./configure --with-perl --with-libxml --with-libxslt --with-openssl --with-pam --prefix=/usr/local/postgresql 1> ../configure.1.log 2>../configure.2.log
 bash$ make 1> ../make.1.log 2> ../make.2.log
 bash$ make install 1> ../make-install.1.log 2> ../make-install.2.log

Initsialiseerime andmebaasi

 bash$ /usr/local/postgresql/bin/initdb -E UNICODE --locale et_EE.UTF-8 -D /data/postgresql
 The files belonging to this database system will be owned by user "postgres".
 This user must also own the server process.
 
 The database cluster will be initialized with locale et_EE.UTF-8.
 initdb: could not find suitable text search configuration for locale et_EE.UTF-8
 The default text search configuration will be set to "simple".
 
 fixing permissions on existing directory /data/postgresql ... ok
 creating subdirectories ... ok
 selecting default max_connections ... 100
 selecting default shared_buffers/max_fsm_pages ... 32MB/204800
 creating configuration files ... ok
 creating template1 database in /data/postgresql/base/1 ... ok
 initializing pg_authid ... ok
 initializing dependencies ... ok
 creating system views ... ok
 loading system objects' descriptions ... ok
 creating conversions ... ok
 creating dictionaries ... ok
 setting privileges on built-in objects ... ok
 creating information schema ... ok
 vacuuming database template1 ... ok
 copying template1 to template0 ... ok
 copying template1 to postgres ... ok
 
 WARNING: enabling "trust" authentication for local connections
 You can change this by editing pg_hba.conf or using the -A option the
 next time you run initdb.
 
 Success. You can now start the database server using:
 
     /usr/local/postgresql/bin/postgres -D /data/postgresql
 or
     /usr/local/postgresql/bin/pg_ctl -D /data/postgresql -l logfile start

contrib moodulid

 bash$ cd contrib/fuzzystrmatch
 bash$ gmake
 bash$ gmake install

Kompileerimise õnnestumiseks tuleb PostgreSQL kompileerida võtmega --with-libxslt

 bash$ cd contrib/xml2
 bash$ gmake
 bash$ gmake install

Kui andmebaas juba töötab, tuleb laadida skript

 postgresql-8.3.7/contrib/xml2/pgxml.sql

pgcrypto mooduli paigaldamiseks tuleb öelda

 bash$ cd contrib/pgcrypto
 bash$ gmake
 bash$ gmake install

pljava paigaldamine

pljava võimaldab kasutada java't andmebaasist, tarkvara kodulehekülge asub aadressil http://wiki.tada.se/display/pljava/Home

 bash$ star zxf pljava-src-1.4.0.tar.gz 
 bash$ export JAVA_HOME=/usr/java
 bash$ gmake 1>../pljava-gmake.1.log 2>../pljava-gmake.2.log
 bash$ gmake install 1>../pljava-gmake-install.1.log 2>../pljava-gmake-install.2.log

Kui andmebaas juba töötab, tuleb laadida skript

 pljava/pljava-1.4.0/src/sql/install.sql

Postgis

Postgis http://geos.refractions.net/ on PostgreSQL andmebaasi laiendus, mis võimaldab kasutada andmebaasi GIS (Geographic Information Systems) objektide jaoks. Tavaliselt paigaldatakse lisaks ka Proj4 ja GEOS teegid.

Proj4 teekide paigaldamine

Proj4 teekide lähtetekstid saab kopeerida aadressilt http://trac.osgeo.org/proj/ või paigaldada Debian Lenny paketihaldusest, paigaldame paketihaldusest (versioon 4.6.0-2)

 # apt-get install proj

GEOS teekide paigaldamine

GEOS teekide lähtetekstid saab kopeerida aadressilt http://geos.refractions.net/ ja paigaldada Debian Lenny paketihaldusest, paigaldame paketihaldusest (versioon 3.0.0)

 # apt-get install libgeos-3.0.0 libgeos-dev

Postgis laienduse paigaldamine

Postgis tuleb paigaldada peale seda kui on paigadatud Proj4 ja GEOS teegid ning PostgreSQL andmebaas.

 $ wget http://postgis.refractions.net/download/postgis-1.3.5.tar.gz
 $ cd postgis-1.3.5
 $ ./configure --with-geos --with-proj --prefix=/usr/local/postgis 1>../postgis-configure-1.log 2>../postgis-configure-2.log

kusjuures postgis-configure-1.log peab ütleme midagi sellist lõpus

  HOST_OS: linux-gnu

  PGSQL: /usr/local/postgresql/bin/pg_config
   GEOS: /usr/bin/geos-config (with C-API)
         (ldflags: -L/usr/lib)
   PROJ: prefix=/usr libdir=/usr/lib
  ICONV: 1 

PORTNAME: linux
  PREFIX: /usr/local/postgis
 EPREFIX: ${prefix}
     DOC: ${prefix}/share/doc
    DATA: ${datarootdir}
     MAN: ${datarootdir}/man
     BIN: ${exec_prefix}/bin
     EXT: ${exec_prefix}/lib (${exec_prefix}/lib)
 $ make 1> ../postgis-make-1.log 2>../postgis-make-2.log
 $ make install 1> ../postgis-make-install-1.log 2>../postgis-make-install-2.log

Tarkvara uuendamine

  • Kui muutub PostgreSQLi nn minoorne versiooninumber, st tagant poolt kolmas, nt 8.3.6 -> 8.3.7, siis võib sama andmeklustri kataloogi kasutada.
  • Kui muutub PostgreSQLi nn mažoorsem versioonumber, nt tagant poolt teine, nt 8.2.x -> 8.3.y, siis tuleb andmed esmalt kopeerida pg_dumpall käsu abil töötavast vanast baasist ära, samal ajal peaks pg_hba.conf failist kasutajate ja programmide ligipääs baasile olema keelatud
 $ /usr/local/postgresql/bin/pg_dumpall -h 127.0.0.1 -U postgres > pg_dumpall-20090329-8.2.sql

ning seejärel uude initsialiseeritud baasi sisse lugeda, öeldes nt

 $ /usr/local/postgresql/bin/psql -h 127.0.0.1 -U postgres template1 < pg_dumpall-20090329-8.2.sql \
 1>pg_dumpall-20090329-8.3-in-1.log 2>pg_dumpall-20090329-8.3-in-2.log

Andmebaasi WAL logide kasutamine

Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nt WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline

 $ find /data/postgresql/pg_xlog/ -ls
 7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/
 7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081
 7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E
 7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D
 7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C
 7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status
 7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done
 7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done
 7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A
 7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup
 7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history
 7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080
 7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F
 7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B

Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.

Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.

Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused

  • andmebaas käivitatakse WAL logisid arhiveerivas režiimis
  • andmebaasist salvestatakse nn täiskoopia

WAL logide abil andmebaasi taastamine toimub sellise järgnevusena

  • andmebaasi protsesside töö on lõpetatud
  • varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia
  • andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i
  • andmebaasi käivitatakse WAL logisid peale lugevas režiimis

Ülidselt saab PostgreSQL andmebaasi tööle seada 'archive logs' režiimis, mis tähendab,. Seda logifaili nimetatakse WAL (ingl. k. write ahead log) logiks.

wal logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt

 archive_mode = on               # allows archiving to be done
 archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f && cp %p /data/backup/postgresql/archive-logs/%f'
  • arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise
  • archive_command - näitab kuhu wal logid kopeerida

Taastamiseks sobiv andmete komplekt tekib sellise järgnevuse tulemusel

  • Öelda töötava baasi tingimustes
 $ psql -U postgres postgres -c "select pg_start_backup('backup');"
  • Seejärel kopeerida baasile vastav failisüsteem
  • Öelda
 $ psql -U postgres postgres -c "select pg_stop_backup();"
  • Kopeerida tekkivad wal logid

Andmebaasi taaste WAL logide abil

Lähtepunktiks on tarvis kolme asja

  • Samal arhitektuuril ja versiooniga andmebaasi kui see, millest tehti eelmises punktis toodud järgnevuse abil andmetest koopia
  • andmeklustri kataloogi sisu nii nagu see eelmises punktis kopeeriti
  • wal logid nii nagu nad eelmises punktis kopeeriti

Andmebaasi saab taastada sellise tegevuste järgnevuse abil

  • Andmebaasi mootor ei käi.
  • Kopeerida andmebaasi andmeklustri failisüsteemi, nt /srv/postgresql, pg_start_backup('string') käigus varundatud andmed.
  • Kustutada fail /srv/postgresql/backup_label
  • Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega
 restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'
 recovery_target_time = '2004-07-14 22:39:00 EST'

Esimene parameeter näitab, kus wal logid asuvad ja teine, kui palju logisid sisse lugeda.

  • Paigutada wal logid kataloogi /srv/backup/postgresql/archive-logs
  • Käivitada andmebaas tavapäraselt viisil, kusjuures soovitavalt on archive_logs välja lülitatud.

Käivitamisel tekivad sellised sissekanded andmebaasi logisse

 2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST
 2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery
 2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'
 cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei õnnestu: No such file or directory
 2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "000000010000004600000059" from archive
 2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress
 2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0
 2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "00000001000000460000005A" from archive
 2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "00000001000000460000005B" from archive
 2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "00000001000000460000005C" from archive
 2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "00000001000000460000005D" from archive
 cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei õnnestu: No such file or directory
 2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0
 2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358
 2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03
 cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei õnnestu: No such file or directory
 2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file "00000002.history" from archive
 cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei õnnestu: No such file or directory
 2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3
 cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei õnnestu: No such file or directory
 2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete
 2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections

Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks.

Märkused

  • Selleks, et psql, pg_dump jm käsud ei küsiks parooli sobib seadistada keskkonnamuutuja, kuid kasutaja peab ise otsustama, kas selline lahendus on talle sobiv
 $ export PGPASSWORD=parool