SlideShare a Scribd company logo
1 of 114
Download to read offline
Bli kjent med



Bergen Linux User Group, 24. februar 2005
     Oddbjørn Steffensen,    IT Drift
Bakgrunn for presentasjonen
  Dette er ikke...
     en introduksjon til relasjonsdatabaser eller SQL
     en uttømmende tutorial rundt PostgreSQL, mer en appetittvekker
     PostgreSQL vs. mySQL vs. Oracle vs. ...


  Jeg er...
     ingen PostgreSQL-ekspert
     ingen (god) DBA
     ganske patetisk mhp. SQL


  Presenterer som en fornøyd bruker
     samme ”wow”-følelsen som da jeg konverterte
     til FreeBSD i 1996 etter 3-4 år med Linux-bruk...


  Hvorfor nå? Versjon 8.0 er akkurat lansert!
Agenda
1.   Bakgrunn                                       3+6      slides
2.   Praktisk bruk av PostgreSQL                    22       slides
3.   Egenskaper                                     24       slides
4.   PostgreSQL bak kulissene                       22       slides
5.   Replikeringsløsninger                          4        slides
6.   Bruk av PostgreSQL fra ulike språk             15       slides
7.   Tredjepartsverktøy                             6        slides
8.   Hvordan komme i gang!                          11 + 3   slides

     ~45 minutter
        10 minutter pause
     ~45 minutter
        nn minutter med spørsmål og muligens svar
PostgreSQL: Bakgrunn
Hva er PostgreSQL?
  PostgreSQL er en:
     avansert
     fritt tilgjengelig open source
     relasjonsdatabaseserver


  Støtter mye av SQL-standarden + avanserte egenskaper:
     Komplekse spørringer (bla. subselects)
     Fremmednøkler
     Triggere
     Views
     Transaksjonsintegritet (ACID)
     Multiversion concurrency control (MVCC)


  BSD-lisens (”gjør hva du vil, men ikke skyld på oss”)
Bakgrunn for PostgreSQL

Fra INGRES til POSTGRES: 1977-1994
   Michael Stonebraker, professor ved UC @ Berkeley fra 1971

   Utviklet INGRES fra 1977
       Proof-of-concept databasemotor for relasjonsdatabaser
                                                                         Michael Stonebraker
       Selskapet Ingres etbl. i 1980 for å kommersialisere forskningen
       Oppkjøpt av CA i 1994, som opensourcet CA Ingres høsten 2004

   Jobbet videre med POSTGRES fra 1986
       En videreføring av INGRES med fokus på objektorientering / Quel
       Kodebasen fra INGRES ble ikke videreført
       Kommersialisert som Illustra (kjøpt av Informix, kjøpt av IBM)


Fra POSTGRES til PostgreSQL: 1994-1996
   SQL-støtte lagt til i 1994, lansert som Postgres95 i 1995             1977-1985 INGRES
                                                                         1977-1985 INGRES
   Relansert som PostgreSQL 6.0 i 1996                                   1986-1994 POSTGRES
                                                                         1986-1994 POSTGRES
                                                                         1994-1995 Postgres95
                                                                         1994-1995 Postgres95
   Etablering av PostgreSQL Global Development Team
                                                                         1996-     PostgreSQL
                                                                         1996-     PostgreSQL
PostgreSQL Global Developments Team
  Thomas Lockhart
  Jolly Chen
  Vadim Mikheev
  Jan Wieck
  Andrew Yu
  Tom Lane
  Bruce Momjian
  Marc Fournier
PostgreSQL utviklingsmetodikk
  Kjerneteam               (a la FreeBSD)

  Kildekoden i CVS         (a la FreeBSD)

  http://developer.postgresql.org/
     Egne mailingliste for utviklerne
     Todo-liste
     Developer's FAQ
     Beta-versjoner av PostgreSQL + dokumentasjon
     Presentasjoner
     Web-grensesnitt mot CVS
     Patcher som venter på å legges inn
     Oversikt over innrapporterte bugs
Releasehistorikk
                                                   Forbedret ytelse
                                                 Forenklet vedlikehold
                                                  og administrasjon
                               Etterlevelse
                                                     24/7-bruk
           ”Crash”               av SQL

   1.09    6.1       6.3                             7.2
   6.0                               7.0                                     8.0
                              6.5             7.1             7.4
           6.2       6.4                             7.3
   1996    1997      1998     1999   2000     2001   2002     2003   2004    2005
LoC 178’                              383’                    508’



                                                                         7.4.0   2003-11-17
                                                                         7.4.1   2003-12-22
                                                                         7.4.2   2004-03-08
                            Punktrevisjoner krever normalt               7.4.3   2004-06-14
                                   ikke relast av databaser              7.4.4   2004-08-16
                                                                         7.4.5   2004-08-18
                                                                         7.4.6   2004-10-22
Praktisk bruk av
  PostgreSQL
Installasjon av PostgreSQL
  FreeBSD:
   #    cd /usr/ports/databases/postgresql80-server
   #    sudo make install distclean
   #    cd /usr/ports/databases/postgresql80-client
   #    sudo make install distclean
   #    cd /usr/ports/databases/postgresql-docs
   #    sudo make install distclean

   ======================================================================

   To initialize the database, you should run initdb as the quot;pgsqlquot; user.
   Example:

       su -l pgsql -c initdb

   You can then start PostgreSQL by running:

       /usr/local/etc/rc.d/010.pgsql.sh start

   For postmaster settings, see ~pgsql/data/postgresql.conf
   For more tips, read ~pgsql/post-install-notes
   ======================================================================
Initialisering av PostgreSQL
pgsql@home> initdb
The files belonging to this database system will be owned by user quot;pgsqlquot;
This user must also own the server process.
The database cluster will be initialized with locale C.
creating directory /usr/local/pgsql/data... ok
creating directory /usr/local/pgsql/data/base... ok
creating directory /usr/local/pgsql/data/global... ok
creating directory /usr/local/pgsql/data/pg_xlog... ok
creating directory /usr/local/pgsql/data/pg_clog... ok
creating template1 database in /usr/local/pgsql/data/base/1... ok
creating configuration files... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
creating information schema... ok
vacuuming database template1... ok
copying template1 to template0... ok
Success. You can now start the database server using:
/usr/local/pgsql//bin/postmaster -D /usr/local/pgsql/data
or
/usr/local/pgsql//bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
Etablering av database
oddbjorn@home ~> createdb demo
createdb: database creation failed: ERROR: permission denied to create database
oddbjorn@home ~> su - pgsql

pgsql@home ~> createdb demo
CREATE DATABASE

pgsql@home ~> psql demo
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

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

demo=# grant all on database demo to oddbjorn;
GRANT

oddbjorn@home ~> psql demo
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

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

demo=>
psql: Den primære kommandolinjeklienten
Usage:
  psql [OPTIONS]... [DBNAME [USERNAME]]

General options:
  -d DBNAME        specify database name to connect to (default: quot;oddbjornquot;)
  -c COMMAND       run only single command (SQL or internal) and exit
  -f FILENAME      execute commands from file, then exit
  -l               list available databases, then exit
  -v NAME=VALUE    set psql variable NAME to VALUE
  -X               do not read startup file (~/.psqlrc)
  --help           show this help, then exit
  --version        output version information, then exit

Input and output options:
  -a              echo all input from script
  -e              echo commands sent to server
  -E              display queries that internal commands generate
  -q              run quietly (no messages, only query output)
  -o FILENAME     send query results to file (or |pipe)
  -n              disable enhanced command line editing (readline)
  -s              single-step mode (confirm each query)
  -S              single-line mode (end of line terminates SQL command)

Output format options:
  -A              unaligned table output mode (-P format=unaligned)
  -H              HTML table output mode (-P format=html)
  -t              print rows only (-P tuples_only)
  -T TEXT         set HTML table tag attributes (width, border) (-P tableattr=)
  -x              turn on expanded table output (-P expanded)
  -P VAR[=ARG]    set printing option VAR to ARG (see pset command)
  -F STRING       set field separator (default: quot;|quot;) (-P fieldsep=)
  -R STRING       set record separator (default: newline) (-P recordsep=)

Connection options:
  -h HOSTNAME     database server host or socket directory (default: quot;local socketquot;)
  -p PORT         database server port (default: quot;5432quot;)
  -U NAME         database user name (default: quot;oddbjornquot;)
  -W              prompt for password (should happen automatically)
psql: ? lister psqls interne kommandoer

General
                                                                        Informational
  c[onnect] [DBNAME|- [USER]]
                                                                          d [NAME]      describe table, index, sequence, or view
                 connect to new database
                                                                          d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail)
  cd [DIR]      change the current working directory
                                                                                         list tables/indexes/sequences/views/system tables
  copyright     show PostgreSQL usage and distribution terms
                                                                          da [PATTERN] list aggregate functions
  encoding [ENCODING]
                                                                          dc [PATTERN] list conversions
                 show or set client encoding
                                                                          dC            list casts
  h [NAME]      help on syntax of SQL commands, * for all commands
                                                                          dd [PATTERN] show comment for object
  q             quit psql
                                                                          dD [PATTERN] list domains
  set [NAME [VALUE]]
                                                                          df [PATTERN] list functions (add quot;+quot; for more detail)
                 set internal variable, or list all if no parameters
                                                                          dn [PATTERN] list schemas
  timing        toggle timing of commands (currently off)
                                                                          do [NAME]     list operators
  unset NAME    unset (delete) internal variable
                                                                          dl            list large objects, same as lo_list
  ! [COMMAND]   execute command in shell or start interactive shell
                                                                          dp [PATTERN] list table access privileges
                                                                          dT [PATTERN] list data types (add quot;+quot; for more detail)
Query Buffer
                                                                          du [PATTERN] list users
  e [FILE]      edit the query buffer (or file) with external editor
                                                                          l             list all databases (add quot;+quot; for more detail)
  g [FILE]      send query buffer to server (and results to file or
                                                                          z [PATTERN]   list table access privileges (same as dp)
      |pipe)
  p             show the contents of the query buffer
                                                                        Formatting
  r             reset (clear) the query buffer
                                                                          a             toggle between unaligned and aligned output mode
  s [FILE]      display history or save it to file
                                                                          C [STRING]    set table title, or unset if none
  w [FILE]      write query buffer to file
                                                                          f [STRING]    show or set field separator for unaligned query output
                                                                          H             toggle HTML output mode (currently off)
Input/Output
                                                                          pset NAME [VALUE]
  echo [STRING] write string to standard output
                                                                                         set table output option
  i FILE         execute commands from file
                                                                                         (NAME := {format|border|expanded|fieldsep|footer|null|
  o [FILE]       send all query results to file or |pipe
                                                                                         recordsep|tuples_only|title|tableattr|pager})
  qecho [STRING]
                                                                          t             show only rows (currently off)
                  write string to query output stream (see o)
                                                                          T [STRING]    set HTML <table> tag attributes, or unset if none
                                                                          x             toggle expanded output (currently off)

                                                                        Copy, Large Object
                                                                          copy ...      perform SQL COPY with data stream to the client host
                                                                          lo_export
                                                                          lo_import
                                                                          lo_list
                                                                          lo_unlink     large object operations
psql: d: Describe
 d [NAME]       describe table, index, sequence, or view

 d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail)
           list tables/indexes/sequences/views/system tables

 da [PATTERN]   list   aggregate functions
 dc [PATTERN]   list   conversions
 dC             list   casts
 dd [PATTERN]   show   comment for object
 dD [PATTERN]   list   domains
 df [PATTERN]   list   functions (add quot;+quot; for more detail)
 dn [PATTERN]   list   schemas
 do [NAME]      list   operators
 dl             list   large objects, same as lo_list
 dp [PATTERN]   list   table access privileges
 dT [PATTERN]   list   data types (add quot;+quot; for more detail)
 du [PATTERN]   list   users
 l              list   all databases (add quot;+quot; for more detail)
 z [PATTERN]    list   table access privileges (same as dp)
psql: d-eksempel
 testdb=> CREATE TABLE my_table (
 testdb(> first integer not null default 0,
 testdb(> second text
 testdb-> );
 CREATE TABLE

 testdb=> d my_table
              Table quot;my_tablequot;
  Attribute | Type    |      Modifier
 -----------+---------+--------------------
  first     | integer | not null default 0
  second    | text    |
psql: h: SQL-hjelp
 ABORT                       CREATE LANGUAGE         DROP TYPE
 ALTER AGGREGATE             CREATE OPERATOR CLASS   DROP USER
 ALTER CONVERSION            CREATE OPERATOR         DROP VIEW
 ALTER DATABASE              CREATE RULE             END
 ALTER DOMAIN                CREATE SCHEMA           EXECUTE
 ALTER FUNCTION              CREATE SEQUENCE         EXPLAIN
 ALTER GROUP                 CREATE TABLE            FETCH
 ALTER LANGUAGE              CREATE TABLE AS         GRANT
 ALTER OPERATOR CLASS        CREATE TRIGGER          INSERT
 ALTER SCHEMA                CREATE TYPE             LISTEN
 ALTER SEQUENCE              CREATE USER             LOAD
 ALTER TABLE                 CREATE VIEW             LOCK
 ALTER TRIGGER               DEALLOCATE              MOVE
 ALTER USER                  DECLARE                 NOTIFY
 ANALYZE                     DELETE                  PREPARE
 BEGIN                       DROP AGGREGATE          REINDEX
 CHECKPOINT                  DROP CAST               RESET
 CLOSE                       DROP CONVERSION         REVOKE
 CLUSTER                     DROP DATABASE           ROLLBACK
 COMMENT                     DROP DOMAIN             SELECT
 COMMIT                      DROP FUNCTION           SELECT INTO
 COPY                        DROP GROUP              SET
 CREATE AGGREGATE            DROP INDEX              SET CONSTRAINTS
 CREATE CAST                 DROP LANGUAGE           SET SESSION AUTHORIZATION
 CREATE CONSTRAINT TRIGGER   DROP OPERATOR CLASS     SET TRANSACTION
 CREATE CONVERSION           DROP OPERATOR           SHOW
 CREATE DATABASE             DROP RULE               START TRANSACTION
 CREATE DOMAIN               DROP SCHEMA             TRUNCATE
 CREATE FUNCTION             DROP SEQUENCE           UNLISTEN
 CREATE GROUP                DROP TABLE              UPDATE
 CREATE INDEX                DROP TRIGGER            VACUUM
CREATE / ALTER / DROP av objekter
  AGGREGATE          OPERATOR
  CAST               RULE
  CONSTRAINT         SCHEMA
  CONVERSION         SEQUENCE
  DATABASE           TABLE
  DOMAIN             TYPE
  FUNCTION           TRIGGER
  GROUP              USER
  LANGUAGE           VIEW
SQL-transaksjoner + vedlikehold
  Oppdatering av data
     INSERT / UPDATE / DELETE
     COPY
     TRUNCATE

  Spørringer
     SELECT
     SELECT INTO

  Rettigheter
     GRANT / REVOKE

  Vedlikehold
     EXPLAIN
     ANALYZE
     VACUUM
SQL: Annet
  Transaksjoner
      BEGIN / ABORT / ROLLBACK / CHECKPOINT / COMMIT
      SET TRANSACTION / START TRANSACTION / SET CONSTRAINTS

  Cursorer
      DECLARE / FETCH / MOVE / CLOSE

  Triggere
      LISTEN / NOTIFY / UNLISTEN

  Parametere
      SHOW / SET / RESET

  Annet
      PREPARE / EXECUTE / DEALLOCATE
      LOAD
      LOCK
      COMMENT
      REINDEX
      CLUSTER
      SET SESSION AUTHORIZATION
psql: h select: Informasjon om kommando
testdb=> h select
Command:     SELECT
Description: retrieve rows from a table or view
Syntax:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ AS output_name ] [, ...]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]
    [ FOR UPDATE [ OF table_name [, ...] ] ]

where from_item can be one of:

    [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...]
   )]]
    ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
    function_name ( [ argument [, ...] ] ) [ AS ] alias [ (
   column_alias [, ...] | column_definition [, ...] ) ]
    function_name ( [ argument [, ...] ] ) AS ( column_definition [,
   ...] )
    from_item [ NATURAL ] join_type from_item [ ON join_condition |
   USING ( join_column [, ...] ) ]
psql: Ymse egenskaper
  Bruk av psql i batch:
    psql –f fil.sql dbnavn
    program | psql –f - dbnavn

  Readline-støtte (!)

  Innebygget tidtaking på operasjoner:
     db=> timing
     Timing is on.
     net=> select count(*) from tabellnavn;
      count
     -------
      25523
     (1 row)
     Time: 52.729 ms


  Valg av format på output
    HTML|format|border|expanded|fieldsep|footer|null
    recordsep|tuples_only|title|tableattr|pager
psql: Kopiering av data i bulk: COPY
  Laster inn rå tabseparerte datafiler i èn transaksjon

  Fordel:    går raskt
  Ulempe:    dersom èn rad ikke blir akseptert,
             forkastes alle radene

  copy tabellnavn from ’filename’

  psql støtter også last av store objekter (lo_*)
pgAdmin III
  Fritt tilgjengelig grafisk
  administrasjonsverktøy for
  PostgreSQL

  Kjører på:
     Linux,
     FreeBSD &
     Windows


  Versjon 1.2 støtter 8.0
pgAdmin III: Screenshots
phpPgAdmin
Pgbash
home ~> pgbash
Welcome to Pgbash version 7.3 ( bash-2.05a.0(1)-release )

 Type   '?' for HELP.
 Type   'connect to DB;' before executing SQL.
 Type   'SQL;' to execute SQL.
 Type   'exit' or 'Ctrl+D' to terminate Pgbash.

home ~> CONNECT TO testdb;

home ~> SELECT * FROM iso3166 LIMIT 10;
 cc | country
----+---------------------
 AF | Afghanistan
 AL | Albania
 DZ | Algeria
 AS | American Samoa
 AD | Andorra
 AO | Angola
 AI | Anguilla
 AQ | Antarctica
 AG | Antigua and Barbuda
 AR | Argentina
(10 rows)
Andre kommandoer
  Administrative verktøy
    pg_ctl             – start, stop eller restart av server
    pg_config          – dumper config-informasjon


  Dump & restore
    pg_dump og pg_dumpall
       Førstnevnte dumper én database, sistnevnte alle
       Valg mellom alt/schema/data på tabell/databasenivå
       Output: plain-text SQL, tar, eget arkivformat (m/kompr)


    pg_restore
       Laster inn input fra pg_dump*
Contrib
  Egen contrib-distribusjon, med dels utvidelser og dels støttefunksjonalitet:

  dblink         - Allows remote query execution
  dbmirror       - Replication server
  dbsize         - Reports database and table disk space
  fuzzystrmatch - Levenshtein, metaphone, and soundex fuzzy string matching
  isbn_issn      - PostgreSQL type extensions for ISBN and ISSN
  mysql          - Utility to convert MySQL schema dumps to PostgreSQL
  oracle         - Converts Oracle database schema to PostgreSQL
  pg_autovacuum - Automatically performs vacuum
  pg_upgrade     - Upgrade from previous PostgreSQL version
  pgbench        - TPC-B like benchmarking tool
  pgcrypto       - Cryptographic functions
  reindexdb      - Reindexes a database
  apache_logging - Getting Apache to log to PostgreSQL
  tsearch2       - Full-text-index support using GiST
  xml2           - Storing XML in PostgreSQL
PostgreSQL: Egenskaper
Overordnede egenskaper
  Fritt tilgjengelig; ingen lisenskostnader å tenke på

  Ekstremt robust gjennom mange år

  Designet for å kreve et minimum av administrasjon; enkle,
  men gode administrasjonsmekanismer (CLI og GUI)

  Portabel, kjører på ”alle” relevante plattformer

  Utvidbar, med godt dokumenterte API for å legge til
  funksjonalitet

  Flere ulike alternativ for høytilgjengelighet / replikering

  Veldig god de facto support, med mulighet for kommersiell
  support for de som ønsker det
Egenskaper
                                              SQL-støtte
  Database
      Fullt ut ACID-kompatibel                    God ANSI SQL-støtte
      Fremmednøkler (referential integrity)       Rules
      Bedre enn rad-nivå låsing (MVCC)
                                                  Views       5.0
      Funksjonelle og partielle indekser
                                                  Triggers    5.1 (rudimentary)
                                                  Cursors     5.0
  Utvikling
                                                  Unicode
       Stored procedures      5.0
                                                  Sequences 5.1?
       Procedural languages
                                                  Inheritance ?
       Native interfaces for ODBC,
                                                  Outer Joins
       JDBC, C, C++, PHP, Perl, TCL,
                                                  Sub-selects
       ECPG, Python, and Ruby
                                                  Support for UNION
       Et åpent og veldokumentert API
                                                  (ALL/EXCEPT)
  Sikkerhet
                                              Utvidbar
      Native SSL support
                                                   Datatyper
      Native Kerberos autentisering
                                                   Funksjoner
                                                   Operatorer
Etterlevelse av SQL-standarden
  SQL-standarden
    ISO/IEC 9075 “Database Language SQL”
    Sist revidert i 2003, aka ISO/IEC 9075:2003 eller bare SQL:2003
    Tidligere versjoner var SQL:1999 og SQL-92, men SQL:2003
    erstatter disse

    Kravene er definert som individuelle egenskaper:
        “Core”, som alle SQL-implementasjoner må etterleve
        resten er valgfrie, gruppert i ”packages”
    Ingen kjente databasesystemer som fullt ut etterlever Core SQL:2003


  PostgreSQL versus SQL:2003
    PostgreSQL forsøker å etterleve standarden der det er mulig uten å
    ødelegge bakoverkompatibilitet og ”sunn fornuft”
    Mye av SQL:2003 er støttet, men iblant med noe forskjellig syntax
    Det arbeides med å ytterligere forbedre etterlevelsen
    255 krav (58%) etterlevd, 184 (42%) er ikke etterlevd.
Egenskaper for å sikre integritet: ACID
  Atomisk       / Atomic
     En transaksjon er udelelig – ”alt eller intet”


  Konsistent / Consistent
     En transaksjon skal bringe databasen fra en
     konsistent til en konsistent tilstand uten at den
     nødvendigvis er konsistent underveis


  Isolert       / Isolated
     Transaksjoner berøres ikke av konsekvensene til
     andre transaksjoner som kjøres samtidig


   Holdbarhet / Durable
     Når en transaksjon har gjort COMMIT, er
     endringene permanent lagret, også etter et havari
MultiVersion Concurrency Control (MVCC)
   I motsetning til tradisjonell rad-låsing ved oppdateringer,
   vedlikeholder MVCC flere versjoner av en gitt rad, og
   muliggjør derfor:

  1.   Hver transaksjon ser et snapshot slik databasen så ut ved
       transaksjonens start, uavhengig av hva andre transaksjoner gjør
       mens den kjører
  2.   Leseoperasjoner blokkerer ikke skriveoperasjoner
  3.   Skriveoperasjoner blokkerer ikke leseoperasjoner
  4.   Skriveoperasjoner blokkerer bare når de oppdaterer samme rad


   En annen fordel med MVCCs snapshot er muligheten for
   varme backuper

   Se “Transaction Processing in PostgreSQL” av Tom Lane
Transaksjoner
                         Tett knyttet til ACID/MVCC er transaksjonsbegrepet:
                           En transaksjon grupperer flere steg til ètt atomisk steg
                           Resultatet av transaksjonen er enten komplett eller intet
                           Dersom en feil oppstår i ett av stegene, forkastes hele
                           transaksjonen

                         BEGIN;
Én transaksjonsblokk




                         UPDATE accounts SET balance = balance -         100.00
                           WHERE name = ’Alice’;
                         UPDATE branches SET balance = balance -         100.00
                           WHERE name = (SELECT branch_name FROM         accounts
                           WHERE name = ’Alice’);
                         UPDATE accounts SET balance = balance +         100.00
                           WHERE name = ’Bob’;
                         UPDATE branches SET balance = balance +         100.00
                           WHERE name = (SELECT branch_name FROM         accounts
                           WHERE name = ’Bob’);
                         COMMIT;
Views
  Et view maskerer en spørring bak en virtuell tabell; fordeler:
     Konsistent grensesnitt selv om tabeller i bakgrunnen endrer seg
     Innpakking av detaljer i tabeller
     Views basert på views kan maskere kompleksitet
     Kan gi selektiv tilgang til informasjon, og dermed økt sikkerhet


  Fletting av utvalgte kolonner fra to tabeller:
       CREATE VIEW myview AS
         SELECT city, temp_lo, temp_hi, prcp, date, location
         FROM weather, cities
         WHERE city = name;

       SELECT * FROM myview;


  PostgreSQL støtter foreløpig ikke materialserte views, dvs.
  lagring av resultatet av spørringer bak views (nyttig ifb.
  datavarehus / analytiske databaser).
Schemas
  Schemas er en måte å dele opp namespace internt i
  en database, omtrent som filkataloger (bare ett nivå):
     Separere ulike brukere fra hverandre
     Gruppere databaseobjekter logisk sammen
     Unngå navnekollisjoner i større database
     (Ingen føringer mhp. rettigheter)

  CREATE   SCHEMA blug;
  CREATE   TABLE blug.tabell (..);
  SHOW     search_path;
  DROP     SCHEMA blug [CASCADE];



  public er default; i tillegg inneholder hver database
  pg_catalog som inneholder systemtabeller mv.
Constraints
  Datatypene som definerer kolonnene i en tabell gir
  begrensninger på hvilke data som kan legges inn

  Constraints gir ytterligere fleksibilitet mhp. begrensninger på
  hva som kan legges inn; kan defineres for kolonner & tabeller
     Eksempel: En kolonne med priser vil være hel- eller flyttall, men i
     tillegg bare positive verdier


  PostgreSQL støtter fem former for constraints
     Check               - price numeric CHECK (price > 0)
     Not NULL            - product_no integer NOT NULL
     Unikhet             - product_no integer UNIQUE
     Primærnøkler        - Unik + !NULL: PRIMARY KEY (a, c)
     Fremmednøkler       - product_no integer REFERENCES products
     (product_no),
Triggere
  En trigger kan defineres til å eksekvere før eller
  etter en INSERT, UPDATE eller DELETE, enten per
  statement eller modifisert rad

  Eksempel:
   CREATE TRIGGER if_film_exists
      BEFORE DELETE OR UPDATE ON distributors
      FOR EACH ROW
      EXECUTE PROCEDURE check_foreign_key
             (1, 'CASCADE', 'did', 'films', 'did');



  Funksjonen må være definert i et prosedyrespråk
Inheritance / Arv
  Arv i PostgreSQL er samme konsept som arv mellom
  objekter i objektorienterte språk som C++

  En tabell som arver en annen får med seg alle
  kolonner fra foreldretabellen.

  Kan også begrense spørringer til foreldretabeller:
     SELECT a, b from ONLY tableA
  Støttes også av UPDATE, DELETE og andre

  Ikke fullt ut integrert med unike begrensninger eller
  fremmednøkler
Eksempel på inheritance
  CREATE TABLE capitals (
     name text,
     population real,
     altitude int, -- (in ft)
     state char(2)
  );
  CREATE TABLE non_capitals (
     name text,
     population real,
     altitude int -- (in ft)
  );
  CREATE VIEW cities AS
     SELECT name, population, altitude FROM capitals
  UNION
     SELECT name, population, altitude FROM non_capitals;


  CREATE TABLE cities (
     name text,
     population real,
     altitude int -- (in ft)
  );

  CREATE TABLE capitals (
     state char(2)
  ) INHERITS (cities);
Cursorer / Markører
  Cursorer gir oss muligheten for å for å hente ut
  resultatsettet i lettfordøyelige blokker av rader.

  Dette kan bidra til å unngå ressursproblemer på
  klientsiden, og muliggjør retur av referanse til en
  cursor i stedet for resultatsettet
Sekvenser
testdb=> CREATE TABLE tabell (
   id    integer default nextval('news_id') UNIQUE not
   NULL,
   news       text not NULL,
   post_time time default now()
);

testdb=> INSERT INTO tabell (news) VALUES (‘abc');
INSERT 7259941 1
testdb=> INSERT INTO tabell (news) VALUES (‘def');
INSERT 7259943 1
testdb=> INSERT INTO tabell (news) VALUES (‘ghi');
INSERT 7259944 1

testdb=> SELECT * FROM tabell;
  id | news | post_time
------+-------+----------
 1000 | abc   | 15:18:40
 1001 | def   | 15:18:56
 1002 | ghi   | 15:19:36
Subqueries
  Subqueries som en konstant:
   SELECT f1.firstname, f1.lastname, f1.state
     FROM friend f1
     WHERE f1.state <> ( SELECT f2.state
                    FROM friend f2
                    WHERE f2.firstname = ‘Dick’ AND
                          f2.lastname = ‘Cleason’ );

  Subqueries som korrellerte verdier:
   SELECT f1.firstname, f1.lastname, f1.age
     FROM friend f1
     WHERE age = ( SELECT MAX(f2.age)
                    FROM friend f2
                    WHERE f1.state = f2.state );

  Multiple kolonner støttes:
      WHERE (uppercol1, uppercol2) IN (SELECT col1, col2 FROM
      subtable)
  Subqueries kan også brukes ifb. DELETE, INSERT, UPDATE
  (SELECT INTO oppretter en ny tabell med resultatet)
Indeksering
  PostgreSQL støtter indekseringsalgoritmer:
    B-tree (default)
    R-tree
    Hash, og
    GiST
Write-Ahead Logging (WAL)
  Standard teknikk for transaksjonslogging
    Endringer i datafiler kan bare skrives etter at
    endringene er logget, og loggen skrevet til disk
    Trenger ikke flushe datafilene etter hver commit


  Fordeler
    Redusert antall skriveoperasjoner mot disk
    Èn sync mot loggfilen i stedet for potensielt mange
    mot datafilene
    Loggfilen skrives sekvensielt
    Datafilene er konsistente
    Muliggjør online backup og point-in-time recovery
Nytt i versjon 8.0
  7.0 lansert i midten av 2000, så 4.5 år med utvikling
    8 måneder med utvikling i forhold til 7.x
    Totalt 17 sider med endringer
    5 måneder med betatesting
    Mål: Gjøre PostgreSQL til en ’enterprise’-kandidat


  Viktigste nye egenskaper:
    Tablespaces: spre databaser på tvers av disker
    Savepoints
    Point-in-time Recovery (PITR)
    Perl integrert i server
    Native støtte for Windows (~10 årsverk)
Tablespaces
   I PostgreSQL < 8 måtte man bruke symlinker for å legge
   ulike datafiler på ulike partisjoner

   Tablespaces lar oss styre hvilken disk som lagrer ulike:
      Database
      Schema
      Tabell
      Indekser


   Fordeler:
      Styres på individuelt objektnivå
      Forbedrer ytelse og kontroll over hvordan diskene utnyttes
      Større fleksibilitet til å legge til plass når en disk går full

CREATE TABLESPACE fastspace LOCATION ’/disk1/pgsql/data’;
CREATE TABLE foo(i int) TABLESPACE fastspace;
Savepoints
                    Savepoints gir oss muligheten til å håndtere feil inne i
                    transaksjoner på en grasiøs måte, uten nødvendigvis å måtte
                    avbryte hele transaksjonen
                       Endringer før savepoint gjennomføres selv om rollback til det skjer
                       Eventuelle rollbacks m/konsekvenser er ikke synlig utenfor
                       transaksjonen, jfr. ACID-prinsippene

                 BEGIN;
                 UPDATE accounts SET balance = balance - 100.00 WHERE name = ’Alice’;
                 SAVEPOINT my_savepoint;
Èn transaksjon




                 UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Bob’;


                    Oops ... bruk Charlie sin konto i stedet!

                 ROLLBACK TO my_savepoint;
                 UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Charlie’;
                 COMMIT;
Point-In-Time Recovery
  I PostgreSQL < 8, var den eneste måten å komme
  seg videre etter et diskcrash enten å:
    Gjenskape data fra backup, eller
    Bruke en replikerende server

  Point-in-time recovery muliggjør kontinuerlig
  backup av serveren:
    Write-ahead log’en (WAL) beskriver alle endringer; ved å
    ta backup av denne, kan vi ”spole” databasetilstanden frem
    og tilbake.
    PITR baserer seg på løpende overføring av WAL til
    failovermaskine, basert på en fritt valgt arkiverings-
    mekanisme
    Recover frem til crashtidspunktet, eller et vilkårlig valgt
    tidspunkt
Støtte for, eh, Windows #1
  Har tidligere vært tilgjengelig via Cygwin, nå native
  Støtter 2000, XP & 2003
  Kan kjøre som service
  Installer som fungerer rimelig bra:
Støtte for, eh, Windows #2
  Inkluderer følgende add-ons:
    Npgsql
    JDBC
    psqlODBC
    pgAdmin III
PostgreSQL bak kulissene
Overordnet arkitektur




Klientprosesser                                               Serverprosesser
                               Initiell forbindelse
     Klient-                                          postmaster                             Disk-
                                og autentisering                                                      Kernel disk
                                                                                                       buffers
                                                          (daemon)
   applikasjon                                                                              buffere
                                                                  Spawner
                                                                  serverprosess
                                                                                        Tabeller
   Klient                                               postgres
               libpq




                                                          postgres
                                  Spørringer
   bibliotek                                           (backend)
                                                            postgres
                                og resultatsett
                                                                                                       Disk
                                                         (backend)                     Delte
                                                           (backend)
           23961       Ss   0:05.64   /usr/local/bin/postmaster                (postgres)
           23963       S    0:01.13   postmaster: stats buffer process         (postgres)
           23966       S    0:03.24   postmaster: stats collector process      (postgres)
           36324       I    0:00.43   postmaster: oddbjorn testdb [local] idle (postgres)
           36428       I    0:00.23   postmaster: oddbjorn testdb [local] idle (postgres)
Hva skjer med en spørring?
                                          1.   Spørring ankommer via en socket,
                                               legges i en streng
Postgres
                                          2.   Lex/yacc parser strengen, og type
                                               spørring identifiseres
Parser
                                          3.   Hvis kompleks spørring gå videre,
           query tree
                                               hvis ikke:
Traffic cop                 Utility cmd
                                          4.   Send til respektive spesialfunk.
            query tree
Rewrite &
Generate paths                            5.   Tar hensyn til regler, views++
            query tree + views og annet
Planner /
                                          6.   Velger optimal plan basert på
optimizer
                                               kostnad av query tree, og sender
            query plan
                                               denne til executor
Executor
                                          7.   Gjennomfører henting av data, sort,
                                               joins, kvalifiseringer av data og
                                               leverer til slutt resultatet
Tuning: EXPLAIN
     PostgreSQL lager en query plan for hver spørring
     Viktig redskap for å forstå og tune spørringer inkl. bruk av indekser

     EXPLAIN foran en SELECT viser den respektive planen:

      testdb=> EXPLAIN SELECT * FROM syslog;
                               QUERY PLAN
      ------------------------------------------------------------
       Seq Scan on syslog (cost=0.00..20.00 rows=1000 width=104)
      (1 row)



                                                     Kostnadene er målt i antall pages som
1.   Estimert oppstartskostnad                       må hentes fra disk. CPU-kostnadene
                                                     konverteres til disk-enheter.
2.   Estimert totalkostnad (for alle rader)
3.   Estimert antall rader som spørringen resulterer i
4.   Bredde målt i bytes per rad som spørringen resulterer i

     (Mye mer info): Efficient SQL, OSCON 2003
         http://www.gtsm.com/oscon2003/toc.html
Tuning: ANALYZE
testdb=> ANALYZE   VERBOSE syslog;
INFO: analyzing    quot;public.syslogquot;
INFO: quot;syslogquot;:    3614 pages, 3000 rows sampled, 26243 estimated total rows
ANALYZE
testdb=> EXPLAIN SELECT * from syslog;
                          QUERY PLAN
---------------------------------------------------------------
 Seq Scan on syslog (cost=0.00..3876.43 rows=26243 width=132)
(1 row)



   Kvaliteten på planen er altså avhengig av:
        kunnskapen PostgreSQL har om tabeller, indekser mv
        kombinert med parametersettingene i postgresql.conf
Tuning: VACUUM
VACUUM må kjøres periodisk av følgende årsaker:
1. Frigjøre diskplass brukt av oppdaterte eller slettede rader
2. Oppdatere statistikken som benytes for å lage query plans
3. Beskytte mot tap av veldig gamle data på grunn av wraparound av
   transaksjons-IDen


Kan kjøres parallellt med vanlig bruk av databasen



pg_autovacuum
   contrib-klient som overvåker alle databaser i en PostgreSQL-instans
   Bruker statistikkinnsamlingen til å overvåke INSERT-, UPDATE- og
   DELETE-aktiviteten
   Starter automagisk VACUUM når definerte grenseverdier overstiges
Katalogstruktur #1
/usr/local/pgsql/data
   PG_VERSION           f.eks. ”8.0”
   postgresql.conf      konfigurasjonfil
   postmaster.opts      evt. opsjoner
   postmaster.pid       PID + litt til
   pg_hba.conf          tilgangskontroll
   pg_ident.conf        mapping mellom identer

   base/                databasefilene
   global/
   pg_log/              applikasjonslogger fra pg
   pg_clog/             transaksjonslogger
   pg_xlog/             WALtransaksjonslogger
   pg_tblspc/           tablespaces
postgresql.conf: Connection Settings
tcpip_socket = false
max_connections = 20
#superuser_reserved_connections = 2
port = 5432
[..]
postgresql.conf: Resource Settings

# - Memory -

shared_buffers = 1000           # min 16, at least max_connections*2, 8KB each
#sort_mem = 1024                # min 64, size in KB
#vacuum_mem = 8192              # min 1024, size in KB

# - Free Space Map -

#max_fsm_pages = 20000          # min max_fsm_relations*16, 6 bytes each
#max_fsm_relations = 1000       # min 100, ~50 bytes each

# - Kernel Resource Usage -

#max_files_per_process = 1000   # min 25
#preload_libraries = ''
postgresql.conf: Annet
  Security & Authentication
  Write Ahead Log
      Settings
      Checkpoints
  Query Tuning
      Planner Method Enabling
      Planner Cost Constants
      Genetic Query Optimizer
  Error Reporting and Logging
      syslog
      When to log
      What to log
  Runtime Statistics
      Statistics Monitoring
      Query/Index Statistics Collector
  Client Connection Defaults
      Statement Behaviour
      Locale and Formatting
  Lock Management
  Version / Platform Compatibility
Tilgangskontroll: pg_hba.conf
#   PostgreSQL Client Authentication Configuration File
#   ===================================================
#
#   This file controls: which hosts are allowed to connect, how clients
#   are authenticated, which PostgreSQL user names they can use, which
#   databases they can access. Records take one of seven forms:
#
#   local       DATABASE   USER   METHOD [OPTION]
#   host        DATABASE   USER   IP-ADDRESS IP-MASK     METHOD    [OPTION]
#   hostssl     DATABASE   USER   IP-ADDRESS IP-MASK     METHOD    [OPTION]
#   hostnossl   DATABASE   USER   IP-ADDRESS IP-MASK     METHOD    [OPTION]
#   host        DATABASE   USER   IP-ADDRESS/CIDR-MASK   METHOD    [OPTION]
#   hostssl     DATABASE   USER   IP-ADDRESS/CIDR-MASK   METHOD    [OPTION]
#   hostnossl   DATABASE   USER   IP-ADDRESS/CIDR-MASK   METHOD    [OPTION]
#
#   [..]
#   METHOD can be quot;trustquot;, quot;rejectquot;,quot;md5quot;, quot;cryptquot;,
#   quot;passwordquot;, quot;krb4quot;, quot;krb5quot;, quot;identquot;, or quot;pamquot;.
#
#   If you want to allow non-local connections, you need to add more
#   quot;hostquot; records. Also, remember TCP/IP connections are only enabled
#   if you enable quot;tcpip_socketquot; in postgresql.conf.

# TYPE   DATABASE     USER           IP-ADDRESS          IP-MASK              METHOD
local    all          all                                                     trust
host     all          all            127.0.0.1           255.255.255.255      trust
host     all          all            192.168.1.2         255.255.255.255      trust
Sjekk av status: pg_controldata
home ~> pg_controldata /usr/local/pgsql/data
pg_control version number:            72
Catalog version number:               200310211
Database cluster state:               in production
pg_control last modified:             Sun Jan 30 17:08:32 2005
Current log file ID:                  0
Next log file segment:                57
Latest checkpoint location:           0/3879ABE4
Prior checkpoint location:            0/3879ABA4
Latest checkpoint's REDO location:    0/3879ABE4
Latest checkpoint's UNDO location:    0/0
Latest checkpoint's StartUpID:        78
Latest checkpoint's NextXID:          886791
Latest checkpoint's NextOID:          5065687
Time of latest checkpoint:            Thu Jan 27 16:19:38 2005
Database block size:                  8192
Blocks per segment of large relation: 131072
Maximum length of identifiers:        64
Maximum number of function arguments: 32
Date/time type storage:               floating-point numbers
Maximum length of locale name:        128
LC_COLLATE:                           C
LC_CTYPE:                             C
Systemkatalogen & Information schema
  Systemkatalogen: pg_catalog
    Systemkatalogen er et schema som inneholder
    PostgreSQL-spesifikke tabeller og views som beskriver
    tilgjengelige datatyper, funksjoner, operatorer mv.


  Information schema: information_schema
    Blir automatisk etablert i alle databaser
    Inneholder, i likhet med pg_catalog, et antall views med
    informasjon om objekter i databasen
    Er en del av SQL-standarden; stabil og portabel
    Inneholder ikke PostgreSQL-spesifikk informasjon
Systemkatalogene (grafisk)
Datatyper iflg. systemkatalogen: dT+ i psql
 List of data types
   Schema   |             Name            | Internal name    | Size |                             Description
------------+-----------------------------+------------------+------+-------------------------------------------------------------------
 pg_catalog | quot;SETquot;                       | SET              | var | set of tuples
 pg_catalog | quot;anyquot;                       | any              |4     |
 pg_catalog | quot;charquot;                      | char             |1     | single character
 pg_catalog | quot;pathquot;                      | path             | var | geometric path '(pt1,...)'
 pg_catalog | quot;triggerquot;                   | trigger          |4     |
 pg_catalog | quot;unknownquot;                   | unknown          | var |
 pg_catalog | abstime                     | abstime          |4     | absolute, limited-range date and time (Unix system time)
 pg_catalog | aclitem                     | aclitem          | 12   | access control list
 pg_catalog | anyarray                    | anyarray         | var |
 pg_catalog | anyelement                  | anyelement       |4     |
 pg_catalog | bigint                      | int8             |8     | ~18 digit integer, 8-byte storage
 pg_catalog | bit                         | bit              | var | fixed-length bit string
 pg_catalog | bit varying                 | varbit           | var | variable-length bit string
 pg_catalog | boolean                     | bool             |1     | boolean, 'true'/'false'
 pg_catalog | box                         | box              | 32   | geometric box '(lower left,upper right)'
 pg_catalog | bytea                       | bytea            | var | variable-length string, binary values escaped
 pg_catalog | character                   | bpchar           | var | char(length), blank-padded string, fixed storage length
 pg_catalog | character varying           | varchar          | var | varchar(length), non-blank-padded string, variable storage length
 pg_catalog | cid                         | cid              |4     | command identifier type, sequence in transaction id
 pg_catalog | cidr                        | cidr             | var | network IP address/netmask, network address
 pg_catalog | circle                      | circle           | 24   | geometric circle '(center,radius)'
 pg_catalog | cstring                     | cstring          | var |
 pg_catalog | date                        | date             |4     | ANSI SQL date
 pg_catalog | double precision            | float8           |8     | double-precision floating point number, 8-byte storage
 pg_catalog | inet                        | inet             | var | IP address/netmask, host address, netmask optional
 pg_catalog | int2vector                  | int2vector       | 64   | array of 32 int2 integers, used in system tables
 pg_catalog | integer                     | int4             |4     | -2 billion to 2 billion integer, 4-byte storage
 pg_catalog | internal                    | internal         |4     |
 pg_catalog | interval                    | interval         | 12   | @ <number> <units>, time interval
 pg_catalog | language_handler            | language_handler | 4    |
 pg_catalog | line                        | line             | 32   | geometric line (not implemented)'
 pg_catalog | lseg                        | lseg             | 32   | geometric line segment '(pt1,pt2)'
 pg_catalog | macaddr                     | macaddr          |6     | XX:XX:XX:XX:XX:XX, MAC address
 pg_catalog | money                       | money            |4     | monetary amounts, $d,ddd.cc
 pg_catalog | name                        | name             | 64   | 63-character type for storing system identifiers
 pg_catalog | numeric                     | numeric          | var | numeric(precision, decimal), arbitrary precision number
 pg_catalog | oid                         | oid              |4     | object identifier(oid), maximum 4 billion
 pg_catalog | oidvector                   | oidvector        | 128 | array of 32 oids, used in system tables
 pg_catalog | opaque                      | opaque           |4     |
 pg_catalog | point                       | point            | 16   | geometric point '(x, y)'
 pg_catalog | polygon                     | polygon          | var | geometric polygon '(pt1,...)'
 pg_catalog | real                        | float4           |4     | single-precision floating point number, 4-byte storage
 pg_catalog | record                      | record           |4     |
 pg_catalog | refcursor                   | refcursor        | var | reference cursor (portal name)
 pg_catalog | regclass                    | regclass         |4     | registered class
                                                                               Operasjoner mot kolonner med felles type gir
 pg_catalog | regoper                     | regoper          |4     | registered operator
 pg_catalog | regoperator                 | regoperator      |4     | registered operator (with args)
                                                                               konsistente resultater, og er normalt det
 pg_catalog | regproc                     | regproc          |4     | registered procedure
 pg_catalog | regprocedure                | regprocedure     |4     | registered procedure (with args)
 pg_catalog | regtype                     | regtype          |4     | registered type
                                                                               raskeste
 pg_catalog | reltime                     | reltime          |4     | relative, limited-range time interval (Unix delta time)
 pg_catalog | smallint                    | int2             |2     | -32 thousand to 32 thousand, 2-byte storage
 pg_catalog | smgr                        | smgr             |2     | storage manager
                                                                               Riktig typebruk gir formatvalidering av data,
 pg_catalog | text                        | text             | var | variable-length string, no limit specified
 pg_catalog | tid                         | tid              |6     | (Block, offset), physical location of tuple
                                                                               og ugyldige formater aksepteres ikke
 pg_catalog | time with time zone         | timetz           | 12   | hh:mm:ss, ANSI SQL time
 pg_catalog | time without time zone      | time             |8     | hh:mm:ss, ANSI SQL time
 pg_catalog | timestamp with time zone    | timestamptz      |8     | date and time with time zone
                                                                               Riktig bruk av datatypene gir den mest
 pg_catalog | timestamp without time zone | timestamp        |8     | date and time
 pg_catalog | tinterval                   | tinterval        | 12   | (abstime,abstime), time interval
                                                                               effektive lagringen av data
 pg_catalog | void                        | void             |4     |
 pg_catalog | xid                         | xid              |4     | transaction id
(62 rows)
Innebygde datatyper
Nettverkstyper
   Følgende tre datatyper:
        inet       - host eller nettmaske, fex. 10.0.0.1
        cidr       - nettverksmasker, fex 10.0.0.0/8
        macaddr    - fex ’08:00:2b:01:02:03’


   Gir endel kule muligheter:
   1.   WHERE ’192.168.1.5’   < ’192.168.1.6’
   2.   WHERE ’192.168.1/24’ >> ’192.168.1.5’
   3.   WHERE ip << ’192.168.1.0/24’
   4.   trunc(macaddr)
Funksjoner og operatorer
Støtte for regulære uttrykk
  Støtte for flere former for pattern matching:
     SQL LIKE-operatøren
     SQL99 SIMILAR TO-operatøren
     POSIX-style regulære uttrykk


  Eksempel på sistnevnte:
     ’abc’   ~   ’abc’      true
     ’abc’   ~   ’^a’       true
     ’abc’   ~   ’(b|d)’    true
     ’abc’   ~   ’^(b|c)’   false
psql: Liste systemkatalogen
test=> dS
 List of relations
   Schema   |              Name                  | Type        | Owner
------------+--------------------------+---------+-------
 pg_catalog | pg_aggregate                       | table       | pgsql
 pg_catalog | pg_am tabellene i systemkatalogen, | table       | pgsql
                   I                             lagrer PostgreSQL metadata;
 pg_catalog | pg_amop informasjon om databaser,table views, brukere
                                                 | tabeller, | pgsql
                   f.eks.
 pg_catalog | pg_amproc                          | table       | pgsql
                   og så videre. Ved CREATE DATABASE blir f.eks.
 pg_catalog | pg_attrdef                         | table       | pgsql
                   pg_database oppdatert, samt databasen skrevet til disk.
 pg_catalog | pg_attribute                       | table       | pgsql
 pg_catalog | pg_cast                            | table       | pgsql
 pg_catalog | pg_class                           | table       | pgsql
 pg_catalog | pg_constraint                      | table       | pgsql
 pg_catalog | pg_conversion                      | table       | pgsql
 pg_catalog | pg_database                        | table       | pgsql
 pg_catalog | pg_depend                          | table       | pgsql
 pg_catalog | pg_description                     | table       | pgsql
 pg_catalog | pg_group                           | table       | pgsql
 pg_catalog | pg_index                           | table       | pgsql
 pg_catalog | pg_indexes                         | view        | pgsql
 pg_catalog | pg_inherits                        | table       | pgsql
 [..]
Utvidelse av SQL-reportoaret
  SQL-støtten i PostgreSQL kan utvides vha. bla. følgende:
     funksjoner
     aggregater (min, max, sum osv)
     datatyper
     operatorer


  Dette er relativt enkelt, ettersom definisjonene for disse
  ligger i systemkatalogen.
     Potensielt mulig å skyte seg selv i foten..


  PostgreSQL kan dessuten laste brukerutviklet kode vha.
  dynamisk lasting av bibliotek som implementerer en type
  eller en funksjon
Replikeringsløsninger
Slony-I
  En “master to multiple slaves” replikeringsløsning
     Utvikles av Jan Wieck
     Slony er russisk flertall for elefant
     http://www.slony.info

  Støtter:
     etablering av en replika ”i fart”
     asynkron replikering
     enhver replika kan overta for enhver annen node
         promotering av slave til master hvis master dør

  Slony-2 kommer til å støtte multi-master

  Introducing Slony & Building and Configuring Slony
     A. Elein Mustain
     http://www.onlamp.com/lpt/a/{5328,5486}
Slony-I: Grafisk beskrivelse


         Master


                                                      Cascading
                                    Slave
                                    Nivå 1

Slave             Slave
Nivå 1            Nivå 1



     Bergen
                           Slave             Slave
                           Nivå 2            Nivå 2


                                     Oslo
Andre replikeringsløsninger
  pgcluster
      Synkron replikering inkl. lastbalansering
      http://pgcluster.projects.postgresql.org/

  pgpool
      Connection-pool-server; ligger som et lag mellom klienter og opp til 2 PostgreSQL-
      servere
      Cacher connections for å redusere overhead
      Automatisk failover til sekundær server når primær går ned
      Replikering ved ag pgpool sender transaksjonene parallellt til hver server (synkron
      replikering)

  eRServer
      Trigger-basert single-master/multi-slave asynkron replikeringsløsning
      Ikke lenger i live?
      http://www.erserver.com/

  pgreplicator
      “Store and forward” asynkron replikering
      To-veis synkronisering, differensiell replikering
      Ikke lenger i live?
      http://pgreplicator.sourceforge.net
Programmering
mot PostgreSQL
Språk: Frontend versus backend
  Frontend: Språk for å aksessere data fra ’utsiden’,
  fex. script eller applikasjoner

  Backend: Språk for å utvide funksjonaliteten internt
  i databaseserveren

  Praktisk talt alle språkene kan benyttes i begge roller
  Klassisk avveining om funksjonalitet skal ligger i
  databasen eller i applikasjonen
Funksjoner i andre språk enn SQL&C
  PostgreSQL støtter brukerdefinerte funksjoner i et assortert
  utvalg språk ut over SQL og C.
     PL/pgSQL
     PL/Tcl
     PL/Perl
     PL/Python
     PL/PHP
     PL/Java / pl-j


  PL = procedural languages
  Andre språk kan defineres av brukeren

  PostgreSQL forholder seg ikke til kildekoden; overfører bare
  kallet til en handler som deretter fungerer som lim i forhold
  til det aktuelle språket.
Bruk av språk
createlang plperl dbname

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
if ($_[0] > $_[1]) { return $_[0]; }
return $_[1];
$$ LANGUAGE plperl;

CREATE TABLE employee (
   name text,
   basesalary integer,
   bonus integer
);

CREATE FUNCTION empcomp(employee) RETURNS integer AS $$
   my ($emp) = @_;
   return $emp->{basesalary} + $emp->{bonus};
$$ LANGUAGE plperl;

SELECT name, empcomp(employee.*) FROM employee;
PL/pgSQL
 PL/pgSQL er et lastbart prosedyrespråk

 Støtter:
    Definering av funksjoner og triggere
    Kontrollstrukturer
    Beregninger
    Gjenbruker alle datatyper, funksjoner og operatorer som
    er tilgjengelig i PostgreSQL
    Gruppering av transaksjoner i ett kall internt i
    databaseserveren, unngår overhead med klient/tjener-
    arkitekturen
PL/pgSQL: Eksempel #1
CREATE FUNCTION tax(numeric)
  RETURNS numeric
  AS ‘SELECT ($1 * 0.06::numeric(8,2))::numeric(8,2);’
  LANGUAGE ‘sql’;

CREATE FUNCTION shipping(numeric)
  RETURNS numeric
  AS ‘SELECT CASE
       WHEN $1 < 2             THEN CAST(3.00 AS numeric(8,2))
       WHEN $1 >= 2 AND $1 < 4 THEN CAST(5.00 AS numeric(8,2))
       WHEN $1 >=4             THEN CAST(6.00 AS numeric(8,2))
  END;’
  LANGUAGE ‘sql’;

SELECT part_id, trim(name) AS name, cost, tax(cost), cost +
  tax(cost) AS subtotal, shipping(weight), cost + tax(cost) +
  shipping(weight) AS total
  FROM part
  ORDER BY part_id;
PL/pgSQL: Eksempel #2
CREATE TABLE emp (empname text, salary int4,
                  last_date datetime, last_user name);

CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS
   BEGIN
   -- Check that empname and salary are given
   IF NEW.empname ISNULL THEN
         RAISE EXCEPTION ''empname cannot be NULL value' ';
    END IF;
   IF NEW.salary ISNULL THEN
         RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
   END IF;
   -- Who works for us when she must pay for?
   IF NEW.salary < 0 THEN
         RAISE EXCEPTION ''% cannot have a negative salary'',
   NEW.empname;
   END IF;
   -- Remember who changed the payroll when
   NEW.last_date := ' 'now' ';
   NEW.last_user := getpgusername();
   RETURN NEW;
   END; '
LANGUAGE 'plpgsql';

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
pl/R
  R er et integrert miljø for manipulering av data, beregninger
  og grafisk visning
       Nært basert på AT&Ts S

  R inkluderer:
       effektiv håndtering og lagring av data
       operatorer for beregninger over tabeller og matriser
       et større antall koherente og integrerte verktøy for analyse av data
       verktøy for å generere høykvalitets grafer, både til skjerm og print
       et modent programmeringsspråk for å knytte det hele sammen

  PL/R er et lastbart prosedyrespråk som muliggjør funksjoner
  og triggere i PostgreSQL til å uttrykkes i R
       Skrevet av Joe Conway
       How to Graph data in PostgreSQL av Robert Bernier:
           http://www.varlena.com/varlena/GeneralBits/Tidbits/ +
           bernier/art_66/graphingWithR.html
pl/R: Plotting av brannvegglogger

BEGIN;

CREATE TEMPORARY TABLE
  mytemp(id serial, hit int, source_ip inet)
  ON COMMIT DROP;

INSERT INTO mytemp(hit,source_ip)
  SELECT count(*) AS counterhits, source_ip
  FROM firewall
  GROUP BY source_ip
  ORDER BY counterhits DESC;

CREATE OR REPLACE FUNCTION f_graph2() RETURNS text AS '
sql <- paste(quot;SELECT id as x,hit as y FROM mytemp LIMIT 30quot;,sep=quot;quot;);
str <- c(pg.spi.exec(sql));

mymain <- quot;Graph 2quot;;
mysub <- paste(quot;The worst offender is: quot;,str[1,3],quot; with quot;,str[1,2],quot; hitsquot;,sep=quot;quot;);
myxlab <- quot;Top 30 IP Addressesquot;;
myylab <- quot;Number of Hitsquot;;

pdf(''/tmp/graph2.pdf'');
plot(str,type=quot;bquot;,main=mymain,sub=mysub,xlab=myxlab,ylab=myylab,lwd=3);
mtext(quot;Probes by intrusive IP Addressesquot;,side=3);
dev.off();

print(''DONE'');
' LANGUAGE plr;

-- now generating the graph
SELECT f_graph2();
COMMIT;
Andre grensesnitt
  psqlODBC
      This is the most common interface for Windows applications.
  pgjdbc
      A JDBC interface.
  Npgsql
      .Net interface for more recent Windows applications.
  libpqxx
      A newer C++ interface.
  libpq++
      An older C++ interface.
  pgperl
      A Perl interface with an API similar to libpq.
  DBD-Pg
      A Perl interface that uses the DBD-standard API.
  pgtclng
      A newer version of the Tcl interface.
  pgtcl
      The original version of the Tcl interface.
  PyGreSQL
      A Python interface library.
Bruk av PostgreSQL fra Perl
    DBI / DBD::Pg / DBD::PgPP (ikke libpq-basert)

#!/usr/local/bin/perl –w

use DBI;

$dbh = DBI->connect('dbi:Pg:dbname=testdb;', ‘username', '');

$sth = $dbh->prepare(“SELECT id,news from news”);
$sth->execute;

while (@news = $sth->fetchrow) {
   $date    = $news[0];
   $article = $news[1];

    print(“$date:t $articlen”);
}
Bruk av PostgreSQL fra Python #1
  PygreSQL
    Eldst og velprøvd
    Nær libpq
    http://www.pygresql.org


  psycopg
    Basert på libpq, med DB API-grensesnitt
    Benyttes mye ifb. Zope
    Smart gjenbruk av connections
    http://initd.org/software/initd/psycopg


  og flere (pyPgSQL, DB-API)
Bruk av PostgreSQL fra Python #2
import psycopg

o = psycopg.connect('dbname=mydb user=fog')

c = o.cursor()
c.execute('SELECT * FROM addressbook WHERE name = %s', [‘Bob'])
data = c.fetchone()

print quot;Saving image of %s %squot; % (data[0], data[1])
open(data[0]+quot;.pngquot;, 'w').write(data[3])
Bruk av PostgreSQL fra PHP
  http://www.php.net/manual/en/ref.pgsql.php

$conn = pg_connect(quot;dbname=testdbquot;);

if (!$conn) {
   print(quot;Connection Failed.quot;);
   exit;
}

$query = “SELECT posted_date,posted_time,news FROM news”;
$news = pg_query($conn, $query);

echo quot;<table border=1>nquot;;

for($i = 0; $i < pg_num_rows($news); $i++)     {
   echo quot;<tr>nquot;;
   echo quot;<td>” . pg_result($news, $i, 0) .     quot;</td>nquot;;
   echo quot;<td>quot; . pg_result($news, $i, 1) .     quot;</td>nquot;;
   echo quot;<td>quot; . pg_result($news, $i, 2) .     quot;</td>nquot;;
   echo quot;</tr>quot;;
}

echo quot;</table>quot;;
ODBC & JDBC
 ODBC
   http://odbc.postgresql.org/


 JDBC
   Ren Java-implementasjon
   Støtter JDBC v3 + utvidelser
   http://jdbc.postgresql.org/


 Begge tilgjengelig som FreeBSD-ports
Tredjepartsløsninger
  (noe redusert pga. omfanget på resten)
Autodoc
  Dokumenterer en PostgreSQL-database

  Template-basert rapportering til:
    HTML
    Dot
    Dia
    Docbook XML
Autodoc: Eksempler #1




     HTML               Docbook
Autodoc: Eksempler #2


dia




                          graphviz
PostGIS

  PostGIS implementerer støtte for “spatial data”

  Data som beskriver lokasjon eller form
    Punkter
    Linjer
    Polygoner


  samt funksjoner mhp. forhold disse i mellom:
    Avstand
    Nærhet (”touching” og ”connectivity”)
    Inneholder (”inside” og ”overlapping”)
PostGIS: Eksempel
  CREATE TABLE pubs (name VARCHAR, beer_price FLOAT4);
  ADDGEOMETRYCOLUMN (‘beer_db’,'pubs','location’ ,2167,'POINT',3);

  INSERT INTO pubs VALUES ('Garricks Head',4.50,GeometryFromText('POINT
  (1196131 383324)’,2167));

  SELECT name, beer_price,
         DISTANCE(location, GeometryFromText('POINT(1195722 383854)',2167))
         FROM pubs ORDER BY beer_price;

        name      | beer_price |     distance
   ---------------+------------+------------------
    Fireside      |       4.25 | 1484.10275160491
    The Forge     |       4.33 | 1533.06561109862
    Rumours       |       4.46 | 2042.00094093097
    Garricks Head |        4.5 | 669.389105609889
    Slap Happy    |        4.5 | 1882.31910168298
    Old Bailys    |       4.55 | 1147.20900404641
    Black Sheep   |       4.66 | 536.859935972633
    Big Bad Daves |       4.75 | 907.446543878884

  SELECT name, beer_price + 0.001 * DISTANCE(location,
         GeometryFromText('POINT(1195722 383854)',2167))
         AS net_price FROM pubs ORDER BY price;

        name      |     net_price
   ---------------+------------------
    Garricks Head | 5.16938910560989
    Black Sheep   | 5.19685978338474
    Big Bad Daves | 5.65744654387888
    Old Bailys    | 5.69720919478127
    Fireside      | 5.73410275160491
    The Forge     | 5.86306553480468
    Slap Happy    | 6.38231910168298
    Rumours       | 6.50200097907794
Hvordan komme i gang?
www.postgresql.org
Dokumentasjon #1
Dokumentasjon #2

                   1332
                   sider!
http://pgfoundry.org
http://gborg.postgresql.org/
Mailinglister & IRC
                                                         pgsql-admin
                                                         pgsql-advocacy
Et assortert utvalg mailinglister er tilgjengelig:
                                                         pgsql-announce
   http://www.postgresql.org/community/lists/subscribe
   Generelt høyt volum                                   pgsql-bugs
   Høy kompetanse
                                                         pgsql-docs
   Strekker seg langt for å hjelpe
                                                         pgsql-general
                                                         pgsql-hackers
Arkiv tilgjengelig på:
                                                         pgsql-interfaces
   http://archives.postgresql.org/
                                                         pgsql-jdbc
                                                         pgsql-novice
IRC: irc.freenode.net/#postgresql
                                                         pgsql-odbc
   En unik kombinasjon av kompetanse og
   imøtekommendehet
                                                         pgsql-performance
                                                         pgsql-php
                                                         pgsql-sql
Webressurser
  http://techdocs.postgresql.org/
    Tekniske artikler og ymse


  General Bits av A. Elein Mustain
    http://www.varlena.com/GeneralBits
    Ukentlig oppsummering av pgsql-general-listen


  PGSearch:
    http://www.pgsql.ru/db/pgsearch
    Søkemotor basert på PostgreSQL og TSearch2
pg_live
  Knoppix-basert live-CD med PostgreSQL
    Satt sammen av Robert Bernier
    Nyeste versjon er 1.3.3, 8. februar 2005
    http://www.sraapowergres.com +
    /en/newsletter/issue_02/pg_live/pg_live.1.3.3.iso
Relevante bøker #1




• http://www.postgresql.org/docs/books/awbook.html
• http://www.commandprompt.com/ppbook/
Relevante bøker #2
Spørsmål?

     Presentasjonen tilgjengelig på:
        http://www.tricknology.org/foilware/




    oddbjorn@tricknology.org
Uh oh...
Del 1 av ”Bli kjent med!”-serien

More Related Content

Similar to Bli kjent med PostgreSQL!

BK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritpingBK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritpingGeodata AS
 
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av AutentiseringsprosjektetIkt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektetleiftorger
 
Enterprise GIS-administratorer seminar 29.10.2014
Enterprise GIS-administratorer seminar 29.10.2014Enterprise GIS-administratorer seminar 29.10.2014
Enterprise GIS-administratorer seminar 29.10.2014Geodata AS
 
Hva er Koha? - Versjon 2
Hva er Koha? - Versjon 2Hva er Koha? - Versjon 2
Hva er Koha? - Versjon 2Libriotech
 
BK2011 Python i arc gis 10
BK2011 Python i arc gis 10BK2011 Python i arc gis 10
BK2011 Python i arc gis 10Geodata AS
 
Intro to Azure DevOps
Intro to Azure DevOpsIntro to Azure DevOps
Intro to Azure DevOpsAudunSolemdal
 
Jacky 原创我用linux 实现你的梦想之rtc服务系列
Jacky 原创我用linux 实现你的梦想之rtc服务系列Jacky 原创我用linux 实现你的梦想之rtc服务系列
Jacky 原创我用linux 实现你的梦想之rtc服务系列yoyojacky
 
ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014Geodata AS
 
Ikke test Puppet-koden din
Ikke test Puppet-koden dinIkke test Puppet-koden din
Ikke test Puppet-koden dinJan Ivar Beddari
 
Bruk av GeoSOSI Professional
Bruk av GeoSOSI ProfessionalBruk av GeoSOSI Professional
Bruk av GeoSOSI ProfessionalGeodata AS
 
Presentation Mapreduce Bjornnordlund
Presentation Mapreduce BjornnordlundPresentation Mapreduce Bjornnordlund
Presentation Mapreduce BjornnordlundBjørn Nordlund
 
Git i praksis - erfaringer med overgang fra ClearCase til Git
Git i praksis - erfaringer med overgang fra ClearCase til GitGit i praksis - erfaringer med overgang fra ClearCase til Git
Git i praksis - erfaringer med overgang fra ClearCase til GitFredrik Vraalsen
 
Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3Morten Bergset
 
Introduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformenIntroduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformenGeodata AS
 
GoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergGoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergFriprogsenteret
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevnfossmo
 
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...Geodata AS
 

Similar to Bli kjent med PostgreSQL! (20)

BK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritpingBK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritping
 
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av AutentiseringsprosjektetIkt Fagforum - Presentasjon Av Autentiseringsprosjektet
Ikt Fagforum - Presentasjon Av Autentiseringsprosjektet
 
Enterprise GIS-administratorer seminar 29.10.2014
Enterprise GIS-administratorer seminar 29.10.2014Enterprise GIS-administratorer seminar 29.10.2014
Enterprise GIS-administratorer seminar 29.10.2014
 
Hva er Koha? - Versjon 2
Hva er Koha? - Versjon 2Hva er Koha? - Versjon 2
Hva er Koha? - Versjon 2
 
BK2011 Python i arc gis 10
BK2011 Python i arc gis 10BK2011 Python i arc gis 10
BK2011 Python i arc gis 10
 
Manus Scom Ljs
Manus Scom LjsManus Scom Ljs
Manus Scom Ljs
 
Intro to Azure DevOps
Intro to Azure DevOpsIntro to Azure DevOps
Intro to Azure DevOps
 
Jacky 原创我用linux 实现你的梦想之rtc服务系列
Jacky 原创我用linux 实现你的梦想之rtc服务系列Jacky 原创我用linux 实现你的梦想之rtc服务系列
Jacky 原创我用linux 实现你的梦想之rtc服务系列
 
ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014
 
Ikke test Puppet-koden din
Ikke test Puppet-koden dinIkke test Puppet-koden din
Ikke test Puppet-koden din
 
Bruk av GeoSOSI Professional
Bruk av GeoSOSI ProfessionalBruk av GeoSOSI Professional
Bruk av GeoSOSI Professional
 
Presentation Mapreduce Bjornnordlund
Presentation Mapreduce BjornnordlundPresentation Mapreduce Bjornnordlund
Presentation Mapreduce Bjornnordlund
 
AWS på kartet
AWS på kartetAWS på kartet
AWS på kartet
 
Cassandra intro
Cassandra introCassandra intro
Cassandra intro
 
Git i praksis - erfaringer med overgang fra ClearCase til Git
Git i praksis - erfaringer med overgang fra ClearCase til GitGit i praksis - erfaringer med overgang fra ClearCase til Git
Git i praksis - erfaringer med overgang fra ClearCase til Git
 
Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3Responsiv design og Bootstrap 3
Responsiv design og Bootstrap 3
 
Introduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformenIntroduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformen
 
GoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen WahlbergGoOpen 2010: Jorgen Wahlberg
GoOpen 2010: Jorgen Wahlberg
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevn
 
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...
Effektiv bruk av analyseverktøy og geoprosessering - Geodata sommerkonferanse...
 

More from Oddbjørn Steffensen

More from Oddbjørn Steffensen (8)

Tjenestenektangrep DND
Tjenestenektangrep DNDTjenestenektangrep DND
Tjenestenektangrep DND
 
EVRY Håndtering av sikkerhetshendelser DND BITS
EVRY Håndtering av sikkerhetshendelser DND BITSEVRY Håndtering av sikkerhetshendelser DND BITS
EVRY Håndtering av sikkerhetshendelser DND BITS
 
Adobe Lightroom i et nøtteskall
Adobe Lightroom i et nøtteskallAdobe Lightroom i et nøtteskall
Adobe Lightroom i et nøtteskall
 
Risiko i en virtualisert infrastruktur
Risiko i en virtualisert infrastrukturRisiko i en virtualisert infrastruktur
Risiko i en virtualisert infrastruktur
 
Anvendt logghåndtering 2.0
Anvendt logghåndtering 2.0Anvendt logghåndtering 2.0
Anvendt logghåndtering 2.0
 
Praktisk bruk og oppfølgning av logger
Praktisk bruk og oppfølgning av loggerPraktisk bruk og oppfølgning av logger
Praktisk bruk og oppfølgning av logger
 
Bli kjent med FreeBSD!
Bli kjent med FreeBSD!Bli kjent med FreeBSD!
Bli kjent med FreeBSD!
 
Get to know PostgreSQL!
Get to know PostgreSQL!Get to know PostgreSQL!
Get to know PostgreSQL!
 

Bli kjent med PostgreSQL!

  • 1. Bli kjent med Bergen Linux User Group, 24. februar 2005 Oddbjørn Steffensen, IT Drift
  • 2. Bakgrunn for presentasjonen Dette er ikke... en introduksjon til relasjonsdatabaser eller SQL en uttømmende tutorial rundt PostgreSQL, mer en appetittvekker PostgreSQL vs. mySQL vs. Oracle vs. ... Jeg er... ingen PostgreSQL-ekspert ingen (god) DBA ganske patetisk mhp. SQL Presenterer som en fornøyd bruker samme ”wow”-følelsen som da jeg konverterte til FreeBSD i 1996 etter 3-4 år med Linux-bruk... Hvorfor nå? Versjon 8.0 er akkurat lansert!
  • 3. Agenda 1. Bakgrunn 3+6 slides 2. Praktisk bruk av PostgreSQL 22 slides 3. Egenskaper 24 slides 4. PostgreSQL bak kulissene 22 slides 5. Replikeringsløsninger 4 slides 6. Bruk av PostgreSQL fra ulike språk 15 slides 7. Tredjepartsverktøy 6 slides 8. Hvordan komme i gang! 11 + 3 slides ~45 minutter 10 minutter pause ~45 minutter nn minutter med spørsmål og muligens svar
  • 5. Hva er PostgreSQL? PostgreSQL er en: avansert fritt tilgjengelig open source relasjonsdatabaseserver Støtter mye av SQL-standarden + avanserte egenskaper: Komplekse spørringer (bla. subselects) Fremmednøkler Triggere Views Transaksjonsintegritet (ACID) Multiversion concurrency control (MVCC) BSD-lisens (”gjør hva du vil, men ikke skyld på oss”)
  • 6. Bakgrunn for PostgreSQL Fra INGRES til POSTGRES: 1977-1994 Michael Stonebraker, professor ved UC @ Berkeley fra 1971 Utviklet INGRES fra 1977 Proof-of-concept databasemotor for relasjonsdatabaser Michael Stonebraker Selskapet Ingres etbl. i 1980 for å kommersialisere forskningen Oppkjøpt av CA i 1994, som opensourcet CA Ingres høsten 2004 Jobbet videre med POSTGRES fra 1986 En videreføring av INGRES med fokus på objektorientering / Quel Kodebasen fra INGRES ble ikke videreført Kommersialisert som Illustra (kjøpt av Informix, kjøpt av IBM) Fra POSTGRES til PostgreSQL: 1994-1996 SQL-støtte lagt til i 1994, lansert som Postgres95 i 1995 1977-1985 INGRES 1977-1985 INGRES Relansert som PostgreSQL 6.0 i 1996 1986-1994 POSTGRES 1986-1994 POSTGRES 1994-1995 Postgres95 1994-1995 Postgres95 Etablering av PostgreSQL Global Development Team 1996- PostgreSQL 1996- PostgreSQL
  • 7. PostgreSQL Global Developments Team Thomas Lockhart Jolly Chen Vadim Mikheev Jan Wieck Andrew Yu Tom Lane Bruce Momjian Marc Fournier
  • 8. PostgreSQL utviklingsmetodikk Kjerneteam (a la FreeBSD) Kildekoden i CVS (a la FreeBSD) http://developer.postgresql.org/ Egne mailingliste for utviklerne Todo-liste Developer's FAQ Beta-versjoner av PostgreSQL + dokumentasjon Presentasjoner Web-grensesnitt mot CVS Patcher som venter på å legges inn Oversikt over innrapporterte bugs
  • 9. Releasehistorikk Forbedret ytelse Forenklet vedlikehold og administrasjon Etterlevelse 24/7-bruk ”Crash” av SQL 1.09 6.1 6.3 7.2 6.0 7.0 8.0 6.5 7.1 7.4 6.2 6.4 7.3 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 LoC 178’ 383’ 508’ 7.4.0 2003-11-17 7.4.1 2003-12-22 7.4.2 2004-03-08 Punktrevisjoner krever normalt 7.4.3 2004-06-14 ikke relast av databaser 7.4.4 2004-08-16 7.4.5 2004-08-18 7.4.6 2004-10-22
  • 10. Praktisk bruk av PostgreSQL
  • 11. Installasjon av PostgreSQL FreeBSD: # cd /usr/ports/databases/postgresql80-server # sudo make install distclean # cd /usr/ports/databases/postgresql80-client # sudo make install distclean # cd /usr/ports/databases/postgresql-docs # sudo make install distclean ====================================================================== To initialize the database, you should run initdb as the quot;pgsqlquot; user. Example: su -l pgsql -c initdb You can then start PostgreSQL by running: /usr/local/etc/rc.d/010.pgsql.sh start For postmaster settings, see ~pgsql/data/postgresql.conf For more tips, read ~pgsql/post-install-notes ======================================================================
  • 12. Initialisering av PostgreSQL pgsql@home> initdb The files belonging to this database system will be owned by user quot;pgsqlquot; This user must also own the server process. The database cluster will be initialized with locale C. creating directory /usr/local/pgsql/data... ok creating directory /usr/local/pgsql/data/base... ok creating directory /usr/local/pgsql/data/global... ok creating directory /usr/local/pgsql/data/pg_xlog... ok creating directory /usr/local/pgsql/data/pg_clog... ok creating template1 database in /usr/local/pgsql/data/base/1... ok creating configuration files... ok initializing pg_shadow... ok enabling unlimited row size for system tables... ok initializing pg_depend... ok creating system views... ok loading pg_description... ok creating conversions... ok setting privileges on built-in objects... ok creating information schema... ok vacuuming database template1... ok copying template1 to template0... ok Success. You can now start the database server using: /usr/local/pgsql//bin/postmaster -D /usr/local/pgsql/data or /usr/local/pgsql//bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
  • 13. Etablering av database oddbjorn@home ~> createdb demo createdb: database creation failed: ERROR: permission denied to create database oddbjorn@home ~> su - pgsql pgsql@home ~> createdb demo CREATE DATABASE pgsql@home ~> psql demo Welcome to psql 7.4.2, the PostgreSQL interactive terminal. Type: copyright for distribution terms h for help with SQL commands ? for help on internal slash commands g or terminate with semicolon to execute query q to quit demo=# grant all on database demo to oddbjorn; GRANT oddbjorn@home ~> psql demo Welcome to psql 7.4.2, the PostgreSQL interactive terminal. Type: copyright for distribution terms h for help with SQL commands ? for help on internal slash commands g or terminate with semicolon to execute query q to quit demo=>
  • 14. psql: Den primære kommandolinjeklienten Usage: psql [OPTIONS]... [DBNAME [USERNAME]] General options: -d DBNAME specify database name to connect to (default: quot;oddbjornquot;) -c COMMAND run only single command (SQL or internal) and exit -f FILENAME execute commands from file, then exit -l list available databases, then exit -v NAME=VALUE set psql variable NAME to VALUE -X do not read startup file (~/.psqlrc) --help show this help, then exit --version output version information, then exit Input and output options: -a echo all input from script -e echo commands sent to server -E display queries that internal commands generate -q run quietly (no messages, only query output) -o FILENAME send query results to file (or |pipe) -n disable enhanced command line editing (readline) -s single-step mode (confirm each query) -S single-line mode (end of line terminates SQL command) Output format options: -A unaligned table output mode (-P format=unaligned) -H HTML table output mode (-P format=html) -t print rows only (-P tuples_only) -T TEXT set HTML table tag attributes (width, border) (-P tableattr=) -x turn on expanded table output (-P expanded) -P VAR[=ARG] set printing option VAR to ARG (see pset command) -F STRING set field separator (default: quot;|quot;) (-P fieldsep=) -R STRING set record separator (default: newline) (-P recordsep=) Connection options: -h HOSTNAME database server host or socket directory (default: quot;local socketquot;) -p PORT database server port (default: quot;5432quot;) -U NAME database user name (default: quot;oddbjornquot;) -W prompt for password (should happen automatically)
  • 15. psql: ? lister psqls interne kommandoer General Informational c[onnect] [DBNAME|- [USER]] d [NAME] describe table, index, sequence, or view connect to new database d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail) cd [DIR] change the current working directory list tables/indexes/sequences/views/system tables copyright show PostgreSQL usage and distribution terms da [PATTERN] list aggregate functions encoding [ENCODING] dc [PATTERN] list conversions show or set client encoding dC list casts h [NAME] help on syntax of SQL commands, * for all commands dd [PATTERN] show comment for object q quit psql dD [PATTERN] list domains set [NAME [VALUE]] df [PATTERN] list functions (add quot;+quot; for more detail) set internal variable, or list all if no parameters dn [PATTERN] list schemas timing toggle timing of commands (currently off) do [NAME] list operators unset NAME unset (delete) internal variable dl list large objects, same as lo_list ! [COMMAND] execute command in shell or start interactive shell dp [PATTERN] list table access privileges dT [PATTERN] list data types (add quot;+quot; for more detail) Query Buffer du [PATTERN] list users e [FILE] edit the query buffer (or file) with external editor l list all databases (add quot;+quot; for more detail) g [FILE] send query buffer to server (and results to file or z [PATTERN] list table access privileges (same as dp) |pipe) p show the contents of the query buffer Formatting r reset (clear) the query buffer a toggle between unaligned and aligned output mode s [FILE] display history or save it to file C [STRING] set table title, or unset if none w [FILE] write query buffer to file f [STRING] show or set field separator for unaligned query output H toggle HTML output mode (currently off) Input/Output pset NAME [VALUE] echo [STRING] write string to standard output set table output option i FILE execute commands from file (NAME := {format|border|expanded|fieldsep|footer|null| o [FILE] send all query results to file or |pipe recordsep|tuples_only|title|tableattr|pager}) qecho [STRING] t show only rows (currently off) write string to query output stream (see o) T [STRING] set HTML <table> tag attributes, or unset if none x toggle expanded output (currently off) Copy, Large Object copy ... perform SQL COPY with data stream to the client host lo_export lo_import lo_list lo_unlink large object operations
  • 16. psql: d: Describe d [NAME] describe table, index, sequence, or view d{t|i|s|v|S} [PATTERN] (add quot;+quot; for more detail) list tables/indexes/sequences/views/system tables da [PATTERN] list aggregate functions dc [PATTERN] list conversions dC list casts dd [PATTERN] show comment for object dD [PATTERN] list domains df [PATTERN] list functions (add quot;+quot; for more detail) dn [PATTERN] list schemas do [NAME] list operators dl list large objects, same as lo_list dp [PATTERN] list table access privileges dT [PATTERN] list data types (add quot;+quot; for more detail) du [PATTERN] list users l list all databases (add quot;+quot; for more detail) z [PATTERN] list table access privileges (same as dp)
  • 17. psql: d-eksempel testdb=> CREATE TABLE my_table ( testdb(> first integer not null default 0, testdb(> second text testdb-> ); CREATE TABLE testdb=> d my_table Table quot;my_tablequot; Attribute | Type | Modifier -----------+---------+-------------------- first | integer | not null default 0 second | text |
  • 18. psql: h: SQL-hjelp ABORT CREATE LANGUAGE DROP TYPE ALTER AGGREGATE CREATE OPERATOR CLASS DROP USER ALTER CONVERSION CREATE OPERATOR DROP VIEW ALTER DATABASE CREATE RULE END ALTER DOMAIN CREATE SCHEMA EXECUTE ALTER FUNCTION CREATE SEQUENCE EXPLAIN ALTER GROUP CREATE TABLE FETCH ALTER LANGUAGE CREATE TABLE AS GRANT ALTER OPERATOR CLASS CREATE TRIGGER INSERT ALTER SCHEMA CREATE TYPE LISTEN ALTER SEQUENCE CREATE USER LOAD ALTER TABLE CREATE VIEW LOCK ALTER TRIGGER DEALLOCATE MOVE ALTER USER DECLARE NOTIFY ANALYZE DELETE PREPARE BEGIN DROP AGGREGATE REINDEX CHECKPOINT DROP CAST RESET CLOSE DROP CONVERSION REVOKE CLUSTER DROP DATABASE ROLLBACK COMMENT DROP DOMAIN SELECT COMMIT DROP FUNCTION SELECT INTO COPY DROP GROUP SET CREATE AGGREGATE DROP INDEX SET CONSTRAINTS CREATE CAST DROP LANGUAGE SET SESSION AUTHORIZATION CREATE CONSTRAINT TRIGGER DROP OPERATOR CLASS SET TRANSACTION CREATE CONVERSION DROP OPERATOR SHOW CREATE DATABASE DROP RULE START TRANSACTION CREATE DOMAIN DROP SCHEMA TRUNCATE CREATE FUNCTION DROP SEQUENCE UNLISTEN CREATE GROUP DROP TABLE UPDATE CREATE INDEX DROP TRIGGER VACUUM
  • 19. CREATE / ALTER / DROP av objekter AGGREGATE OPERATOR CAST RULE CONSTRAINT SCHEMA CONVERSION SEQUENCE DATABASE TABLE DOMAIN TYPE FUNCTION TRIGGER GROUP USER LANGUAGE VIEW
  • 20. SQL-transaksjoner + vedlikehold Oppdatering av data INSERT / UPDATE / DELETE COPY TRUNCATE Spørringer SELECT SELECT INTO Rettigheter GRANT / REVOKE Vedlikehold EXPLAIN ANALYZE VACUUM
  • 21. SQL: Annet Transaksjoner BEGIN / ABORT / ROLLBACK / CHECKPOINT / COMMIT SET TRANSACTION / START TRANSACTION / SET CONSTRAINTS Cursorer DECLARE / FETCH / MOVE / CLOSE Triggere LISTEN / NOTIFY / UNLISTEN Parametere SHOW / SET / RESET Annet PREPARE / EXECUTE / DEALLOCATE LOAD LOCK COMMENT REINDEX CLUSTER SET SESSION AUTHORIZATION
  • 22. psql: h select: Informasjon om kommando testdb=> h select Command: SELECT Description: retrieve rows from a table or view Syntax: SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ] [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start ] [ FOR UPDATE [ OF table_name [, ...] ] ] where from_item can be one of: [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] )]] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ] function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] ) from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]
  • 23. psql: Ymse egenskaper Bruk av psql i batch: psql –f fil.sql dbnavn program | psql –f - dbnavn Readline-støtte (!) Innebygget tidtaking på operasjoner: db=> timing Timing is on. net=> select count(*) from tabellnavn; count ------- 25523 (1 row) Time: 52.729 ms Valg av format på output HTML|format|border|expanded|fieldsep|footer|null recordsep|tuples_only|title|tableattr|pager
  • 24. psql: Kopiering av data i bulk: COPY Laster inn rå tabseparerte datafiler i èn transaksjon Fordel: går raskt Ulempe: dersom èn rad ikke blir akseptert, forkastes alle radene copy tabellnavn from ’filename’ psql støtter også last av store objekter (lo_*)
  • 25. pgAdmin III Fritt tilgjengelig grafisk administrasjonsverktøy for PostgreSQL Kjører på: Linux, FreeBSD & Windows Versjon 1.2 støtter 8.0
  • 28. Pgbash home ~> pgbash Welcome to Pgbash version 7.3 ( bash-2.05a.0(1)-release ) Type '?' for HELP. Type 'connect to DB;' before executing SQL. Type 'SQL;' to execute SQL. Type 'exit' or 'Ctrl+D' to terminate Pgbash. home ~> CONNECT TO testdb; home ~> SELECT * FROM iso3166 LIMIT 10; cc | country ----+--------------------- AF | Afghanistan AL | Albania DZ | Algeria AS | American Samoa AD | Andorra AO | Angola AI | Anguilla AQ | Antarctica AG | Antigua and Barbuda AR | Argentina (10 rows)
  • 29. Andre kommandoer Administrative verktøy pg_ctl – start, stop eller restart av server pg_config – dumper config-informasjon Dump & restore pg_dump og pg_dumpall Førstnevnte dumper én database, sistnevnte alle Valg mellom alt/schema/data på tabell/databasenivå Output: plain-text SQL, tar, eget arkivformat (m/kompr) pg_restore Laster inn input fra pg_dump*
  • 30. Contrib Egen contrib-distribusjon, med dels utvidelser og dels støttefunksjonalitet: dblink - Allows remote query execution dbmirror - Replication server dbsize - Reports database and table disk space fuzzystrmatch - Levenshtein, metaphone, and soundex fuzzy string matching isbn_issn - PostgreSQL type extensions for ISBN and ISSN mysql - Utility to convert MySQL schema dumps to PostgreSQL oracle - Converts Oracle database schema to PostgreSQL pg_autovacuum - Automatically performs vacuum pg_upgrade - Upgrade from previous PostgreSQL version pgbench - TPC-B like benchmarking tool pgcrypto - Cryptographic functions reindexdb - Reindexes a database apache_logging - Getting Apache to log to PostgreSQL tsearch2 - Full-text-index support using GiST xml2 - Storing XML in PostgreSQL
  • 32. Overordnede egenskaper Fritt tilgjengelig; ingen lisenskostnader å tenke på Ekstremt robust gjennom mange år Designet for å kreve et minimum av administrasjon; enkle, men gode administrasjonsmekanismer (CLI og GUI) Portabel, kjører på ”alle” relevante plattformer Utvidbar, med godt dokumenterte API for å legge til funksjonalitet Flere ulike alternativ for høytilgjengelighet / replikering Veldig god de facto support, med mulighet for kommersiell support for de som ønsker det
  • 33. Egenskaper SQL-støtte Database Fullt ut ACID-kompatibel God ANSI SQL-støtte Fremmednøkler (referential integrity) Rules Bedre enn rad-nivå låsing (MVCC) Views 5.0 Funksjonelle og partielle indekser Triggers 5.1 (rudimentary) Cursors 5.0 Utvikling Unicode Stored procedures 5.0 Sequences 5.1? Procedural languages Inheritance ? Native interfaces for ODBC, Outer Joins JDBC, C, C++, PHP, Perl, TCL, Sub-selects ECPG, Python, and Ruby Support for UNION Et åpent og veldokumentert API (ALL/EXCEPT) Sikkerhet Utvidbar Native SSL support Datatyper Native Kerberos autentisering Funksjoner Operatorer
  • 34. Etterlevelse av SQL-standarden SQL-standarden ISO/IEC 9075 “Database Language SQL” Sist revidert i 2003, aka ISO/IEC 9075:2003 eller bare SQL:2003 Tidligere versjoner var SQL:1999 og SQL-92, men SQL:2003 erstatter disse Kravene er definert som individuelle egenskaper: “Core”, som alle SQL-implementasjoner må etterleve resten er valgfrie, gruppert i ”packages” Ingen kjente databasesystemer som fullt ut etterlever Core SQL:2003 PostgreSQL versus SQL:2003 PostgreSQL forsøker å etterleve standarden der det er mulig uten å ødelegge bakoverkompatibilitet og ”sunn fornuft” Mye av SQL:2003 er støttet, men iblant med noe forskjellig syntax Det arbeides med å ytterligere forbedre etterlevelsen 255 krav (58%) etterlevd, 184 (42%) er ikke etterlevd.
  • 35. Egenskaper for å sikre integritet: ACID Atomisk / Atomic En transaksjon er udelelig – ”alt eller intet” Konsistent / Consistent En transaksjon skal bringe databasen fra en konsistent til en konsistent tilstand uten at den nødvendigvis er konsistent underveis Isolert / Isolated Transaksjoner berøres ikke av konsekvensene til andre transaksjoner som kjøres samtidig Holdbarhet / Durable Når en transaksjon har gjort COMMIT, er endringene permanent lagret, også etter et havari
  • 36. MultiVersion Concurrency Control (MVCC) I motsetning til tradisjonell rad-låsing ved oppdateringer, vedlikeholder MVCC flere versjoner av en gitt rad, og muliggjør derfor: 1. Hver transaksjon ser et snapshot slik databasen så ut ved transaksjonens start, uavhengig av hva andre transaksjoner gjør mens den kjører 2. Leseoperasjoner blokkerer ikke skriveoperasjoner 3. Skriveoperasjoner blokkerer ikke leseoperasjoner 4. Skriveoperasjoner blokkerer bare når de oppdaterer samme rad En annen fordel med MVCCs snapshot er muligheten for varme backuper Se “Transaction Processing in PostgreSQL” av Tom Lane
  • 37. Transaksjoner Tett knyttet til ACID/MVCC er transaksjonsbegrepet: En transaksjon grupperer flere steg til ètt atomisk steg Resultatet av transaksjonen er enten komplett eller intet Dersom en feil oppstår i ett av stegene, forkastes hele transaksjonen BEGIN; Én transaksjonsblokk UPDATE accounts SET balance = balance - 100.00 WHERE name = ’Alice’; UPDATE branches SET balance = balance - 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = ’Alice’); UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Bob’; UPDATE branches SET balance = balance + 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = ’Bob’); COMMIT;
  • 38. Views Et view maskerer en spørring bak en virtuell tabell; fordeler: Konsistent grensesnitt selv om tabeller i bakgrunnen endrer seg Innpakking av detaljer i tabeller Views basert på views kan maskere kompleksitet Kan gi selektiv tilgang til informasjon, og dermed økt sikkerhet Fletting av utvalgte kolonner fra to tabeller: CREATE VIEW myview AS SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name; SELECT * FROM myview; PostgreSQL støtter foreløpig ikke materialserte views, dvs. lagring av resultatet av spørringer bak views (nyttig ifb. datavarehus / analytiske databaser).
  • 39. Schemas Schemas er en måte å dele opp namespace internt i en database, omtrent som filkataloger (bare ett nivå): Separere ulike brukere fra hverandre Gruppere databaseobjekter logisk sammen Unngå navnekollisjoner i større database (Ingen føringer mhp. rettigheter) CREATE SCHEMA blug; CREATE TABLE blug.tabell (..); SHOW search_path; DROP SCHEMA blug [CASCADE]; public er default; i tillegg inneholder hver database pg_catalog som inneholder systemtabeller mv.
  • 40. Constraints Datatypene som definerer kolonnene i en tabell gir begrensninger på hvilke data som kan legges inn Constraints gir ytterligere fleksibilitet mhp. begrensninger på hva som kan legges inn; kan defineres for kolonner & tabeller Eksempel: En kolonne med priser vil være hel- eller flyttall, men i tillegg bare positive verdier PostgreSQL støtter fem former for constraints Check - price numeric CHECK (price > 0) Not NULL - product_no integer NOT NULL Unikhet - product_no integer UNIQUE Primærnøkler - Unik + !NULL: PRIMARY KEY (a, c) Fremmednøkler - product_no integer REFERENCES products (product_no),
  • 41. Triggere En trigger kan defineres til å eksekvere før eller etter en INSERT, UPDATE eller DELETE, enten per statement eller modifisert rad Eksempel: CREATE TRIGGER if_film_exists BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did'); Funksjonen må være definert i et prosedyrespråk
  • 42. Inheritance / Arv Arv i PostgreSQL er samme konsept som arv mellom objekter i objektorienterte språk som C++ En tabell som arver en annen får med seg alle kolonner fra foreldretabellen. Kan også begrense spørringer til foreldretabeller: SELECT a, b from ONLY tableA Støttes også av UPDATE, DELETE og andre Ikke fullt ut integrert med unike begrensninger eller fremmednøkler
  • 43. Eksempel på inheritance CREATE TABLE capitals ( name text, population real, altitude int, -- (in ft) state char(2) ); CREATE TABLE non_capitals ( name text, population real, altitude int -- (in ft) ); CREATE VIEW cities AS SELECT name, population, altitude FROM capitals UNION SELECT name, population, altitude FROM non_capitals; CREATE TABLE cities ( name text, population real, altitude int -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities);
  • 44. Cursorer / Markører Cursorer gir oss muligheten for å for å hente ut resultatsettet i lettfordøyelige blokker av rader. Dette kan bidra til å unngå ressursproblemer på klientsiden, og muliggjør retur av referanse til en cursor i stedet for resultatsettet
  • 45. Sekvenser testdb=> CREATE TABLE tabell ( id integer default nextval('news_id') UNIQUE not NULL, news text not NULL, post_time time default now() ); testdb=> INSERT INTO tabell (news) VALUES (‘abc'); INSERT 7259941 1 testdb=> INSERT INTO tabell (news) VALUES (‘def'); INSERT 7259943 1 testdb=> INSERT INTO tabell (news) VALUES (‘ghi'); INSERT 7259944 1 testdb=> SELECT * FROM tabell; id | news | post_time ------+-------+---------- 1000 | abc | 15:18:40 1001 | def | 15:18:56 1002 | ghi | 15:19:36
  • 46. Subqueries Subqueries som en konstant: SELECT f1.firstname, f1.lastname, f1.state FROM friend f1 WHERE f1.state <> ( SELECT f2.state FROM friend f2 WHERE f2.firstname = ‘Dick’ AND f2.lastname = ‘Cleason’ ); Subqueries som korrellerte verdier: SELECT f1.firstname, f1.lastname, f1.age FROM friend f1 WHERE age = ( SELECT MAX(f2.age) FROM friend f2 WHERE f1.state = f2.state ); Multiple kolonner støttes: WHERE (uppercol1, uppercol2) IN (SELECT col1, col2 FROM subtable) Subqueries kan også brukes ifb. DELETE, INSERT, UPDATE (SELECT INTO oppretter en ny tabell med resultatet)
  • 47. Indeksering PostgreSQL støtter indekseringsalgoritmer: B-tree (default) R-tree Hash, og GiST
  • 48. Write-Ahead Logging (WAL) Standard teknikk for transaksjonslogging Endringer i datafiler kan bare skrives etter at endringene er logget, og loggen skrevet til disk Trenger ikke flushe datafilene etter hver commit Fordeler Redusert antall skriveoperasjoner mot disk Èn sync mot loggfilen i stedet for potensielt mange mot datafilene Loggfilen skrives sekvensielt Datafilene er konsistente Muliggjør online backup og point-in-time recovery
  • 49. Nytt i versjon 8.0 7.0 lansert i midten av 2000, så 4.5 år med utvikling 8 måneder med utvikling i forhold til 7.x Totalt 17 sider med endringer 5 måneder med betatesting Mål: Gjøre PostgreSQL til en ’enterprise’-kandidat Viktigste nye egenskaper: Tablespaces: spre databaser på tvers av disker Savepoints Point-in-time Recovery (PITR) Perl integrert i server Native støtte for Windows (~10 årsverk)
  • 50. Tablespaces I PostgreSQL < 8 måtte man bruke symlinker for å legge ulike datafiler på ulike partisjoner Tablespaces lar oss styre hvilken disk som lagrer ulike: Database Schema Tabell Indekser Fordeler: Styres på individuelt objektnivå Forbedrer ytelse og kontroll over hvordan diskene utnyttes Større fleksibilitet til å legge til plass når en disk går full CREATE TABLESPACE fastspace LOCATION ’/disk1/pgsql/data’; CREATE TABLE foo(i int) TABLESPACE fastspace;
  • 51. Savepoints Savepoints gir oss muligheten til å håndtere feil inne i transaksjoner på en grasiøs måte, uten nødvendigvis å måtte avbryte hele transaksjonen Endringer før savepoint gjennomføres selv om rollback til det skjer Eventuelle rollbacks m/konsekvenser er ikke synlig utenfor transaksjonen, jfr. ACID-prinsippene BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = ’Alice’; SAVEPOINT my_savepoint; Èn transaksjon UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Bob’; Oops ... bruk Charlie sin konto i stedet! ROLLBACK TO my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = ’Charlie’; COMMIT;
  • 52. Point-In-Time Recovery I PostgreSQL < 8, var den eneste måten å komme seg videre etter et diskcrash enten å: Gjenskape data fra backup, eller Bruke en replikerende server Point-in-time recovery muliggjør kontinuerlig backup av serveren: Write-ahead log’en (WAL) beskriver alle endringer; ved å ta backup av denne, kan vi ”spole” databasetilstanden frem og tilbake. PITR baserer seg på løpende overføring av WAL til failovermaskine, basert på en fritt valgt arkiverings- mekanisme Recover frem til crashtidspunktet, eller et vilkårlig valgt tidspunkt
  • 53. Støtte for, eh, Windows #1 Har tidligere vært tilgjengelig via Cygwin, nå native Støtter 2000, XP & 2003 Kan kjøre som service Installer som fungerer rimelig bra:
  • 54. Støtte for, eh, Windows #2 Inkluderer følgende add-ons: Npgsql JDBC psqlODBC pgAdmin III
  • 56. Overordnet arkitektur Klientprosesser Serverprosesser Initiell forbindelse Klient- postmaster Disk- og autentisering Kernel disk buffers (daemon) applikasjon buffere Spawner serverprosess Tabeller Klient postgres libpq postgres Spørringer bibliotek (backend) postgres og resultatsett Disk (backend) Delte (backend) 23961 Ss 0:05.64 /usr/local/bin/postmaster (postgres) 23963 S 0:01.13 postmaster: stats buffer process (postgres) 23966 S 0:03.24 postmaster: stats collector process (postgres) 36324 I 0:00.43 postmaster: oddbjorn testdb [local] idle (postgres) 36428 I 0:00.23 postmaster: oddbjorn testdb [local] idle (postgres)
  • 57. Hva skjer med en spørring? 1. Spørring ankommer via en socket, legges i en streng Postgres 2. Lex/yacc parser strengen, og type spørring identifiseres Parser 3. Hvis kompleks spørring gå videre, query tree hvis ikke: Traffic cop Utility cmd 4. Send til respektive spesialfunk. query tree Rewrite & Generate paths 5. Tar hensyn til regler, views++ query tree + views og annet Planner / 6. Velger optimal plan basert på optimizer kostnad av query tree, og sender query plan denne til executor Executor 7. Gjennomfører henting av data, sort, joins, kvalifiseringer av data og leverer til slutt resultatet
  • 58. Tuning: EXPLAIN PostgreSQL lager en query plan for hver spørring Viktig redskap for å forstå og tune spørringer inkl. bruk av indekser EXPLAIN foran en SELECT viser den respektive planen: testdb=> EXPLAIN SELECT * FROM syslog; QUERY PLAN ------------------------------------------------------------ Seq Scan on syslog (cost=0.00..20.00 rows=1000 width=104) (1 row) Kostnadene er målt i antall pages som 1. Estimert oppstartskostnad må hentes fra disk. CPU-kostnadene konverteres til disk-enheter. 2. Estimert totalkostnad (for alle rader) 3. Estimert antall rader som spørringen resulterer i 4. Bredde målt i bytes per rad som spørringen resulterer i (Mye mer info): Efficient SQL, OSCON 2003 http://www.gtsm.com/oscon2003/toc.html
  • 59. Tuning: ANALYZE testdb=> ANALYZE VERBOSE syslog; INFO: analyzing quot;public.syslogquot; INFO: quot;syslogquot;: 3614 pages, 3000 rows sampled, 26243 estimated total rows ANALYZE testdb=> EXPLAIN SELECT * from syslog; QUERY PLAN --------------------------------------------------------------- Seq Scan on syslog (cost=0.00..3876.43 rows=26243 width=132) (1 row) Kvaliteten på planen er altså avhengig av: kunnskapen PostgreSQL har om tabeller, indekser mv kombinert med parametersettingene i postgresql.conf
  • 60. Tuning: VACUUM VACUUM må kjøres periodisk av følgende årsaker: 1. Frigjøre diskplass brukt av oppdaterte eller slettede rader 2. Oppdatere statistikken som benytes for å lage query plans 3. Beskytte mot tap av veldig gamle data på grunn av wraparound av transaksjons-IDen Kan kjøres parallellt med vanlig bruk av databasen pg_autovacuum contrib-klient som overvåker alle databaser i en PostgreSQL-instans Bruker statistikkinnsamlingen til å overvåke INSERT-, UPDATE- og DELETE-aktiviteten Starter automagisk VACUUM når definerte grenseverdier overstiges
  • 61. Katalogstruktur #1 /usr/local/pgsql/data PG_VERSION f.eks. ”8.0” postgresql.conf konfigurasjonfil postmaster.opts evt. opsjoner postmaster.pid PID + litt til pg_hba.conf tilgangskontroll pg_ident.conf mapping mellom identer base/ databasefilene global/ pg_log/ applikasjonslogger fra pg pg_clog/ transaksjonslogger pg_xlog/ WALtransaksjonslogger pg_tblspc/ tablespaces
  • 62. postgresql.conf: Connection Settings tcpip_socket = false max_connections = 20 #superuser_reserved_connections = 2 port = 5432 [..]
  • 63. postgresql.conf: Resource Settings # - Memory - shared_buffers = 1000 # min 16, at least max_connections*2, 8KB each #sort_mem = 1024 # min 64, size in KB #vacuum_mem = 8192 # min 1024, size in KB # - Free Space Map - #max_fsm_pages = 20000 # min max_fsm_relations*16, 6 bytes each #max_fsm_relations = 1000 # min 100, ~50 bytes each # - Kernel Resource Usage - #max_files_per_process = 1000 # min 25 #preload_libraries = ''
  • 64. postgresql.conf: Annet Security & Authentication Write Ahead Log Settings Checkpoints Query Tuning Planner Method Enabling Planner Cost Constants Genetic Query Optimizer Error Reporting and Logging syslog When to log What to log Runtime Statistics Statistics Monitoring Query/Index Statistics Collector Client Connection Defaults Statement Behaviour Locale and Formatting Lock Management Version / Platform Compatibility
  • 65. Tilgangskontroll: pg_hba.conf # PostgreSQL Client Authentication Configuration File # =================================================== # # This file controls: which hosts are allowed to connect, how clients # are authenticated, which PostgreSQL user names they can use, which # databases they can access. Records take one of seven forms: # # local DATABASE USER METHOD [OPTION] # host DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] # hostssl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] # hostnossl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] # host DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] # hostssl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] # hostnossl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] # # [..] # METHOD can be quot;trustquot;, quot;rejectquot;,quot;md5quot;, quot;cryptquot;, # quot;passwordquot;, quot;krb4quot;, quot;krb5quot;, quot;identquot;, or quot;pamquot;. # # If you want to allow non-local connections, you need to add more # quot;hostquot; records. Also, remember TCP/IP connections are only enabled # if you enable quot;tcpip_socketquot; in postgresql.conf. # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local all all trust host all all 127.0.0.1 255.255.255.255 trust host all all 192.168.1.2 255.255.255.255 trust
  • 66. Sjekk av status: pg_controldata home ~> pg_controldata /usr/local/pgsql/data pg_control version number: 72 Catalog version number: 200310211 Database cluster state: in production pg_control last modified: Sun Jan 30 17:08:32 2005 Current log file ID: 0 Next log file segment: 57 Latest checkpoint location: 0/3879ABE4 Prior checkpoint location: 0/3879ABA4 Latest checkpoint's REDO location: 0/3879ABE4 Latest checkpoint's UNDO location: 0/0 Latest checkpoint's StartUpID: 78 Latest checkpoint's NextXID: 886791 Latest checkpoint's NextOID: 5065687 Time of latest checkpoint: Thu Jan 27 16:19:38 2005 Database block size: 8192 Blocks per segment of large relation: 131072 Maximum length of identifiers: 64 Maximum number of function arguments: 32 Date/time type storage: floating-point numbers Maximum length of locale name: 128 LC_COLLATE: C LC_CTYPE: C
  • 67. Systemkatalogen & Information schema Systemkatalogen: pg_catalog Systemkatalogen er et schema som inneholder PostgreSQL-spesifikke tabeller og views som beskriver tilgjengelige datatyper, funksjoner, operatorer mv. Information schema: information_schema Blir automatisk etablert i alle databaser Inneholder, i likhet med pg_catalog, et antall views med informasjon om objekter i databasen Er en del av SQL-standarden; stabil og portabel Inneholder ikke PostgreSQL-spesifikk informasjon
  • 69. Datatyper iflg. systemkatalogen: dT+ i psql List of data types Schema | Name | Internal name | Size | Description ------------+-----------------------------+------------------+------+------------------------------------------------------------------- pg_catalog | quot;SETquot; | SET | var | set of tuples pg_catalog | quot;anyquot; | any |4 | pg_catalog | quot;charquot; | char |1 | single character pg_catalog | quot;pathquot; | path | var | geometric path '(pt1,...)' pg_catalog | quot;triggerquot; | trigger |4 | pg_catalog | quot;unknownquot; | unknown | var | pg_catalog | abstime | abstime |4 | absolute, limited-range date and time (Unix system time) pg_catalog | aclitem | aclitem | 12 | access control list pg_catalog | anyarray | anyarray | var | pg_catalog | anyelement | anyelement |4 | pg_catalog | bigint | int8 |8 | ~18 digit integer, 8-byte storage pg_catalog | bit | bit | var | fixed-length bit string pg_catalog | bit varying | varbit | var | variable-length bit string pg_catalog | boolean | bool |1 | boolean, 'true'/'false' pg_catalog | box | box | 32 | geometric box '(lower left,upper right)' pg_catalog | bytea | bytea | var | variable-length string, binary values escaped pg_catalog | character | bpchar | var | char(length), blank-padded string, fixed storage length pg_catalog | character varying | varchar | var | varchar(length), non-blank-padded string, variable storage length pg_catalog | cid | cid |4 | command identifier type, sequence in transaction id pg_catalog | cidr | cidr | var | network IP address/netmask, network address pg_catalog | circle | circle | 24 | geometric circle '(center,radius)' pg_catalog | cstring | cstring | var | pg_catalog | date | date |4 | ANSI SQL date pg_catalog | double precision | float8 |8 | double-precision floating point number, 8-byte storage pg_catalog | inet | inet | var | IP address/netmask, host address, netmask optional pg_catalog | int2vector | int2vector | 64 | array of 32 int2 integers, used in system tables pg_catalog | integer | int4 |4 | -2 billion to 2 billion integer, 4-byte storage pg_catalog | internal | internal |4 | pg_catalog | interval | interval | 12 | @ <number> <units>, time interval pg_catalog | language_handler | language_handler | 4 | pg_catalog | line | line | 32 | geometric line (not implemented)' pg_catalog | lseg | lseg | 32 | geometric line segment '(pt1,pt2)' pg_catalog | macaddr | macaddr |6 | XX:XX:XX:XX:XX:XX, MAC address pg_catalog | money | money |4 | monetary amounts, $d,ddd.cc pg_catalog | name | name | 64 | 63-character type for storing system identifiers pg_catalog | numeric | numeric | var | numeric(precision, decimal), arbitrary precision number pg_catalog | oid | oid |4 | object identifier(oid), maximum 4 billion pg_catalog | oidvector | oidvector | 128 | array of 32 oids, used in system tables pg_catalog | opaque | opaque |4 | pg_catalog | point | point | 16 | geometric point '(x, y)' pg_catalog | polygon | polygon | var | geometric polygon '(pt1,...)' pg_catalog | real | float4 |4 | single-precision floating point number, 4-byte storage pg_catalog | record | record |4 | pg_catalog | refcursor | refcursor | var | reference cursor (portal name) pg_catalog | regclass | regclass |4 | registered class Operasjoner mot kolonner med felles type gir pg_catalog | regoper | regoper |4 | registered operator pg_catalog | regoperator | regoperator |4 | registered operator (with args) konsistente resultater, og er normalt det pg_catalog | regproc | regproc |4 | registered procedure pg_catalog | regprocedure | regprocedure |4 | registered procedure (with args) pg_catalog | regtype | regtype |4 | registered type raskeste pg_catalog | reltime | reltime |4 | relative, limited-range time interval (Unix delta time) pg_catalog | smallint | int2 |2 | -32 thousand to 32 thousand, 2-byte storage pg_catalog | smgr | smgr |2 | storage manager Riktig typebruk gir formatvalidering av data, pg_catalog | text | text | var | variable-length string, no limit specified pg_catalog | tid | tid |6 | (Block, offset), physical location of tuple og ugyldige formater aksepteres ikke pg_catalog | time with time zone | timetz | 12 | hh:mm:ss, ANSI SQL time pg_catalog | time without time zone | time |8 | hh:mm:ss, ANSI SQL time pg_catalog | timestamp with time zone | timestamptz |8 | date and time with time zone Riktig bruk av datatypene gir den mest pg_catalog | timestamp without time zone | timestamp |8 | date and time pg_catalog | tinterval | tinterval | 12 | (abstime,abstime), time interval effektive lagringen av data pg_catalog | void | void |4 | pg_catalog | xid | xid |4 | transaction id (62 rows)
  • 71. Nettverkstyper Følgende tre datatyper: inet - host eller nettmaske, fex. 10.0.0.1 cidr - nettverksmasker, fex 10.0.0.0/8 macaddr - fex ’08:00:2b:01:02:03’ Gir endel kule muligheter: 1. WHERE ’192.168.1.5’ < ’192.168.1.6’ 2. WHERE ’192.168.1/24’ >> ’192.168.1.5’ 3. WHERE ip << ’192.168.1.0/24’ 4. trunc(macaddr)
  • 73. Støtte for regulære uttrykk Støtte for flere former for pattern matching: SQL LIKE-operatøren SQL99 SIMILAR TO-operatøren POSIX-style regulære uttrykk Eksempel på sistnevnte: ’abc’ ~ ’abc’ true ’abc’ ~ ’^a’ true ’abc’ ~ ’(b|d)’ true ’abc’ ~ ’^(b|c)’ false
  • 74. psql: Liste systemkatalogen test=> dS List of relations Schema | Name | Type | Owner ------------+--------------------------+---------+------- pg_catalog | pg_aggregate | table | pgsql pg_catalog | pg_am tabellene i systemkatalogen, | table | pgsql I lagrer PostgreSQL metadata; pg_catalog | pg_amop informasjon om databaser,table views, brukere | tabeller, | pgsql f.eks. pg_catalog | pg_amproc | table | pgsql og så videre. Ved CREATE DATABASE blir f.eks. pg_catalog | pg_attrdef | table | pgsql pg_database oppdatert, samt databasen skrevet til disk. pg_catalog | pg_attribute | table | pgsql pg_catalog | pg_cast | table | pgsql pg_catalog | pg_class | table | pgsql pg_catalog | pg_constraint | table | pgsql pg_catalog | pg_conversion | table | pgsql pg_catalog | pg_database | table | pgsql pg_catalog | pg_depend | table | pgsql pg_catalog | pg_description | table | pgsql pg_catalog | pg_group | table | pgsql pg_catalog | pg_index | table | pgsql pg_catalog | pg_indexes | view | pgsql pg_catalog | pg_inherits | table | pgsql [..]
  • 75. Utvidelse av SQL-reportoaret SQL-støtten i PostgreSQL kan utvides vha. bla. følgende: funksjoner aggregater (min, max, sum osv) datatyper operatorer Dette er relativt enkelt, ettersom definisjonene for disse ligger i systemkatalogen. Potensielt mulig å skyte seg selv i foten.. PostgreSQL kan dessuten laste brukerutviklet kode vha. dynamisk lasting av bibliotek som implementerer en type eller en funksjon
  • 77. Slony-I En “master to multiple slaves” replikeringsløsning Utvikles av Jan Wieck Slony er russisk flertall for elefant http://www.slony.info Støtter: etablering av en replika ”i fart” asynkron replikering enhver replika kan overta for enhver annen node promotering av slave til master hvis master dør Slony-2 kommer til å støtte multi-master Introducing Slony & Building and Configuring Slony A. Elein Mustain http://www.onlamp.com/lpt/a/{5328,5486}
  • 78. Slony-I: Grafisk beskrivelse Master Cascading Slave Nivå 1 Slave Slave Nivå 1 Nivå 1 Bergen Slave Slave Nivå 2 Nivå 2 Oslo
  • 79. Andre replikeringsløsninger pgcluster Synkron replikering inkl. lastbalansering http://pgcluster.projects.postgresql.org/ pgpool Connection-pool-server; ligger som et lag mellom klienter og opp til 2 PostgreSQL- servere Cacher connections for å redusere overhead Automatisk failover til sekundær server når primær går ned Replikering ved ag pgpool sender transaksjonene parallellt til hver server (synkron replikering) eRServer Trigger-basert single-master/multi-slave asynkron replikeringsløsning Ikke lenger i live? http://www.erserver.com/ pgreplicator “Store and forward” asynkron replikering To-veis synkronisering, differensiell replikering Ikke lenger i live? http://pgreplicator.sourceforge.net
  • 81. Språk: Frontend versus backend Frontend: Språk for å aksessere data fra ’utsiden’, fex. script eller applikasjoner Backend: Språk for å utvide funksjonaliteten internt i databaseserveren Praktisk talt alle språkene kan benyttes i begge roller Klassisk avveining om funksjonalitet skal ligger i databasen eller i applikasjonen
  • 82. Funksjoner i andre språk enn SQL&C PostgreSQL støtter brukerdefinerte funksjoner i et assortert utvalg språk ut over SQL og C. PL/pgSQL PL/Tcl PL/Perl PL/Python PL/PHP PL/Java / pl-j PL = procedural languages Andre språk kan defineres av brukeren PostgreSQL forholder seg ikke til kildekoden; overfører bare kallet til en handler som deretter fungerer som lim i forhold til det aktuelle språket.
  • 83. Bruk av språk createlang plperl dbname CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ if ($_[0] > $_[1]) { return $_[0]; } return $_[1]; $$ LANGUAGE plperl; CREATE TABLE employee ( name text, basesalary integer, bonus integer ); CREATE FUNCTION empcomp(employee) RETURNS integer AS $$ my ($emp) = @_; return $emp->{basesalary} + $emp->{bonus}; $$ LANGUAGE plperl; SELECT name, empcomp(employee.*) FROM employee;
  • 84. PL/pgSQL PL/pgSQL er et lastbart prosedyrespråk Støtter: Definering av funksjoner og triggere Kontrollstrukturer Beregninger Gjenbruker alle datatyper, funksjoner og operatorer som er tilgjengelig i PostgreSQL Gruppering av transaksjoner i ett kall internt i databaseserveren, unngår overhead med klient/tjener- arkitekturen
  • 85. PL/pgSQL: Eksempel #1 CREATE FUNCTION tax(numeric) RETURNS numeric AS ‘SELECT ($1 * 0.06::numeric(8,2))::numeric(8,2);’ LANGUAGE ‘sql’; CREATE FUNCTION shipping(numeric) RETURNS numeric AS ‘SELECT CASE WHEN $1 < 2 THEN CAST(3.00 AS numeric(8,2)) WHEN $1 >= 2 AND $1 < 4 THEN CAST(5.00 AS numeric(8,2)) WHEN $1 >=4 THEN CAST(6.00 AS numeric(8,2)) END;’ LANGUAGE ‘sql’; SELECT part_id, trim(name) AS name, cost, tax(cost), cost + tax(cost) AS subtotal, shipping(weight), cost + tax(cost) + shipping(weight) AS total FROM part ORDER BY part_id;
  • 86. PL/pgSQL: Eksempel #2 CREATE TABLE emp (empname text, salary int4, last_date datetime, last_user name); CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS BEGIN -- Check that empname and salary are given IF NEW.empname ISNULL THEN RAISE EXCEPTION ''empname cannot be NULL value' '; END IF; IF NEW.salary ISNULL THEN RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname; END IF; -- Who works for us when she must pay for? IF NEW.salary < 0 THEN RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname; END IF; -- Remember who changed the payroll when NEW.last_date := ' 'now' '; NEW.last_user := getpgusername(); RETURN NEW; END; ' LANGUAGE 'plpgsql'; CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
  • 87. pl/R R er et integrert miljø for manipulering av data, beregninger og grafisk visning Nært basert på AT&Ts S R inkluderer: effektiv håndtering og lagring av data operatorer for beregninger over tabeller og matriser et større antall koherente og integrerte verktøy for analyse av data verktøy for å generere høykvalitets grafer, både til skjerm og print et modent programmeringsspråk for å knytte det hele sammen PL/R er et lastbart prosedyrespråk som muliggjør funksjoner og triggere i PostgreSQL til å uttrykkes i R Skrevet av Joe Conway How to Graph data in PostgreSQL av Robert Bernier: http://www.varlena.com/varlena/GeneralBits/Tidbits/ + bernier/art_66/graphingWithR.html
  • 88. pl/R: Plotting av brannvegglogger BEGIN; CREATE TEMPORARY TABLE mytemp(id serial, hit int, source_ip inet) ON COMMIT DROP; INSERT INTO mytemp(hit,source_ip) SELECT count(*) AS counterhits, source_ip FROM firewall GROUP BY source_ip ORDER BY counterhits DESC; CREATE OR REPLACE FUNCTION f_graph2() RETURNS text AS ' sql <- paste(quot;SELECT id as x,hit as y FROM mytemp LIMIT 30quot;,sep=quot;quot;); str <- c(pg.spi.exec(sql)); mymain <- quot;Graph 2quot;; mysub <- paste(quot;The worst offender is: quot;,str[1,3],quot; with quot;,str[1,2],quot; hitsquot;,sep=quot;quot;); myxlab <- quot;Top 30 IP Addressesquot;; myylab <- quot;Number of Hitsquot;; pdf(''/tmp/graph2.pdf''); plot(str,type=quot;bquot;,main=mymain,sub=mysub,xlab=myxlab,ylab=myylab,lwd=3); mtext(quot;Probes by intrusive IP Addressesquot;,side=3); dev.off(); print(''DONE''); ' LANGUAGE plr; -- now generating the graph SELECT f_graph2(); COMMIT;
  • 89. Andre grensesnitt psqlODBC This is the most common interface for Windows applications. pgjdbc A JDBC interface. Npgsql .Net interface for more recent Windows applications. libpqxx A newer C++ interface. libpq++ An older C++ interface. pgperl A Perl interface with an API similar to libpq. DBD-Pg A Perl interface that uses the DBD-standard API. pgtclng A newer version of the Tcl interface. pgtcl The original version of the Tcl interface. PyGreSQL A Python interface library.
  • 90. Bruk av PostgreSQL fra Perl DBI / DBD::Pg / DBD::PgPP (ikke libpq-basert) #!/usr/local/bin/perl –w use DBI; $dbh = DBI->connect('dbi:Pg:dbname=testdb;', ‘username', ''); $sth = $dbh->prepare(“SELECT id,news from news”); $sth->execute; while (@news = $sth->fetchrow) { $date = $news[0]; $article = $news[1]; print(“$date:t $articlen”); }
  • 91. Bruk av PostgreSQL fra Python #1 PygreSQL Eldst og velprøvd Nær libpq http://www.pygresql.org psycopg Basert på libpq, med DB API-grensesnitt Benyttes mye ifb. Zope Smart gjenbruk av connections http://initd.org/software/initd/psycopg og flere (pyPgSQL, DB-API)
  • 92. Bruk av PostgreSQL fra Python #2 import psycopg o = psycopg.connect('dbname=mydb user=fog') c = o.cursor() c.execute('SELECT * FROM addressbook WHERE name = %s', [‘Bob']) data = c.fetchone() print quot;Saving image of %s %squot; % (data[0], data[1]) open(data[0]+quot;.pngquot;, 'w').write(data[3])
  • 93. Bruk av PostgreSQL fra PHP http://www.php.net/manual/en/ref.pgsql.php $conn = pg_connect(quot;dbname=testdbquot;); if (!$conn) { print(quot;Connection Failed.quot;); exit; } $query = “SELECT posted_date,posted_time,news FROM news”; $news = pg_query($conn, $query); echo quot;<table border=1>nquot;; for($i = 0; $i < pg_num_rows($news); $i++) { echo quot;<tr>nquot;; echo quot;<td>” . pg_result($news, $i, 0) . quot;</td>nquot;; echo quot;<td>quot; . pg_result($news, $i, 1) . quot;</td>nquot;; echo quot;<td>quot; . pg_result($news, $i, 2) . quot;</td>nquot;; echo quot;</tr>quot;; } echo quot;</table>quot;;
  • 94. ODBC & JDBC ODBC http://odbc.postgresql.org/ JDBC Ren Java-implementasjon Støtter JDBC v3 + utvidelser http://jdbc.postgresql.org/ Begge tilgjengelig som FreeBSD-ports
  • 95. Tredjepartsløsninger (noe redusert pga. omfanget på resten)
  • 96. Autodoc Dokumenterer en PostgreSQL-database Template-basert rapportering til: HTML Dot Dia Docbook XML
  • 97. Autodoc: Eksempler #1 HTML Docbook
  • 99. PostGIS PostGIS implementerer støtte for “spatial data” Data som beskriver lokasjon eller form Punkter Linjer Polygoner samt funksjoner mhp. forhold disse i mellom: Avstand Nærhet (”touching” og ”connectivity”) Inneholder (”inside” og ”overlapping”)
  • 100. PostGIS: Eksempel CREATE TABLE pubs (name VARCHAR, beer_price FLOAT4); ADDGEOMETRYCOLUMN (‘beer_db’,'pubs','location’ ,2167,'POINT',3); INSERT INTO pubs VALUES ('Garricks Head',4.50,GeometryFromText('POINT (1196131 383324)’,2167)); SELECT name, beer_price, DISTANCE(location, GeometryFromText('POINT(1195722 383854)',2167)) FROM pubs ORDER BY beer_price; name | beer_price | distance ---------------+------------+------------------ Fireside | 4.25 | 1484.10275160491 The Forge | 4.33 | 1533.06561109862 Rumours | 4.46 | 2042.00094093097 Garricks Head | 4.5 | 669.389105609889 Slap Happy | 4.5 | 1882.31910168298 Old Bailys | 4.55 | 1147.20900404641 Black Sheep | 4.66 | 536.859935972633 Big Bad Daves | 4.75 | 907.446543878884 SELECT name, beer_price + 0.001 * DISTANCE(location, GeometryFromText('POINT(1195722 383854)',2167)) AS net_price FROM pubs ORDER BY price; name | net_price ---------------+------------------ Garricks Head | 5.16938910560989 Black Sheep | 5.19685978338474 Big Bad Daves | 5.65744654387888 Old Bailys | 5.69720919478127 Fireside | 5.73410275160491 The Forge | 5.86306553480468 Slap Happy | 6.38231910168298 Rumours | 6.50200097907794
  • 101. Hvordan komme i gang?
  • 104. Dokumentasjon #2 1332 sider!
  • 107. Mailinglister & IRC pgsql-admin pgsql-advocacy Et assortert utvalg mailinglister er tilgjengelig: pgsql-announce http://www.postgresql.org/community/lists/subscribe Generelt høyt volum pgsql-bugs Høy kompetanse pgsql-docs Strekker seg langt for å hjelpe pgsql-general pgsql-hackers Arkiv tilgjengelig på: pgsql-interfaces http://archives.postgresql.org/ pgsql-jdbc pgsql-novice IRC: irc.freenode.net/#postgresql pgsql-odbc En unik kombinasjon av kompetanse og imøtekommendehet pgsql-performance pgsql-php pgsql-sql
  • 108. Webressurser http://techdocs.postgresql.org/ Tekniske artikler og ymse General Bits av A. Elein Mustain http://www.varlena.com/GeneralBits Ukentlig oppsummering av pgsql-general-listen PGSearch: http://www.pgsql.ru/db/pgsearch Søkemotor basert på PostgreSQL og TSearch2
  • 109. pg_live Knoppix-basert live-CD med PostgreSQL Satt sammen av Robert Bernier Nyeste versjon er 1.3.3, 8. februar 2005 http://www.sraapowergres.com + /en/newsletter/issue_02/pg_live/pg_live.1.3.3.iso
  • 110. Relevante bøker #1 • http://www.postgresql.org/docs/books/awbook.html • http://www.commandprompt.com/ppbook/
  • 112. Spørsmål? Presentasjonen tilgjengelig på: http://www.tricknology.org/foilware/ oddbjorn@tricknology.org
  • 114. Del 1 av ”Bli kjent med!”-serien