Bli kjent med PostgreSQL!
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Bli kjent med PostgreSQL!

  • 7,359 views
Uploaded on

Norskspråklig kortfattet introduksjon til PostgreSQL

Norskspråklig kortfattet introduksjon til PostgreSQL

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
7,359
On Slideshare
7,357
From Embeds
2
Number of Embeds
1

Actions

Shares
Downloads
16
Comments
0
Likes
0

Embeds 2

http://www.slideshare.net 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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
  • 4. PostgreSQL: Bakgrunn
  • 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
  • 26. pgAdmin III: Screenshots
  • 27. phpPgAdmin
  • 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
  • 31. PostgreSQL: Egenskaper
  • 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
  • 55. PostgreSQL bak kulissene
  • 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
  • 68. Systemkatalogene (grafisk)
  • 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)
  • 70. Innebygde datatyper
  • 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)
  • 72. Funksjoner og operatorer
  • 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
  • 76. Replikeringsløsninger
  • 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
  • 80. Programmering mot PostgreSQL
  • 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
  • 98. Autodoc: Eksempler #2 dia graphviz
  • 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?
  • 102. www.postgresql.org
  • 103. Dokumentasjon #1
  • 104. Dokumentasjon #2 1332 sider!
  • 105. http://pgfoundry.org
  • 106. http://gborg.postgresql.org/
  • 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/
  • 111. Relevante bøker #2
  • 112. Spørsmål? Presentasjonen tilgjengelig på: http://www.tricknology.org/foilware/ oddbjorn@tricknology.org
  • 113. Uh oh...
  • 114. Del 1 av ”Bli kjent med!”-serien