48
Introduction to PostgreSQL Ilia Alshanetsky - @iliaa 1

Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Introduction to PostgreSQL Ilia Alshanetsky - @iliaa

1

Page 2: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

whois: Ilia Alshanetsky

✤ PHP Core Developer since 2001

✤ Release Master of 4.3, 5.1 and 5.2

✤ Author of “Guide to PHP Security”

✤ PostgreSQL user since 2007

✤ CIO @ Centah Inc.

✤ Occasional Photographer ;-)

2

Page 3: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

A special thanks to Christophe Pettus whose talk on PostgreSQL was an inspiration for this talk.

Christophe PettusPostgreSQL Experts, [email protected]

3

Page 4: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

The Meeting of Elephants

4

Page 5: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

SELECT * FROM PostgreSQL;

✤ Relational Database Management System

✤ Open Source answer to Oracle, Microsoft SQL Server, etc…

✤ Data integrity & reliability is #1 priority

✤ Free as in Beer (BSD/MIT license)

✤ It works well, and I like it! ;-)

5

Page 6: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

A Dash of History

✤ Created by Michael Stonebraker at UC Berkley in 1986

✤ Developed in secret until 1995

✤ Becomes an Open Source project in late 1995, as PostgreSQL v6.0

✤ Rapidly evolving & improving ever since

✤ Latest stable release is 9.1.3 (use it!)

6

Page 7: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

It runs on?

✤ All Unixy system types

✤ All flavours of Linux, BSDs, OSX, Solaris, etc…

✤ Windows since v8.0 (2005)

✤ Does not run on your Blackberry

✤ But runs on Android since 2010 ;-)

7

Page 8: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

IN ( PostgreSQL )

✤ More features than you can shake a stick at!

✤ You can read the entire, long & boring list at http://www.postgresql.org/about/featurematrix/

✤ Highly Performant, even on complex queries

✤ Extremely stable

✤ Secure (2 critical security bugs in last 5 years)

8

Page 9: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Auto-Increment via Sequences

PostgreSQL does not have AUTO_INCREMENT, but no worries, it has something even better!

SEQUENCES!

9

Page 10: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

CREATE  TABLE  users  (        id  serial,        name  varchar(50),

       primary  key(id));

postgres=#  NOTICE:    CREATE  TABLE  will  create  implicit  sequence  "users_id_seq"  for  serial  column  "users.id"

postgres=#  \d  users

                                                               Table  "public.users"  Column  |                  Type                    |                                          Modifiers-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  id          |  integer                              |  not  null  default                                                                      nextval('users_id_seq'::regclass)  name      |  character  varying(50)  |  

10

Page 11: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

select  setval('users_id_seq',  10);  setval  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐            10

select  nextval('users_id_seq');  nextval  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐            11

select  currval('users_id_seq');  currval-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐            11

11

Page 12: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

CREATE  SEQUENCE  recounter            INCREMENT  BY  2            MAXVALUE  10            START  WITH  6            CYCLE;

SELECT nextval('recounter'); >> 6SELECT nextval('recounter'); >> 8SELECT nextval('recounter'); >> 10SELECT nextval('recounter'); >> 1

12

Page 13: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Data integrity for the WIN

13

Page 14: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Integrity checks with Constraints

CREATE  TABLE  products  (        id  serial,        name  text,        price  numeric  CHECK  (price  >  0),

       primary  key(id));

14

Page 15: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Go beyond the basic validation

CREATE  TABLE  products  (        id  serial,        name  text,        price  numeric  CHECK  (price  >  0),        discount  numeric              CONSTRAINT  discount_check                      CHECK  (discount  <  0),                    CHECK  (-­‐discount  <  price),                  primary  key(id));

15

Page 16: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Be the master of your DOMAIN

CREATE  DOMAIN  email_t  AS  varchar(255)

CONSTRAINT  email_validation

     CHECK  (VALUE  ~  ('^[_a-­‐zA-­‐Z0-­‐9-­‐]+'  ||E'(\\.[_a-­‐zA-­‐Z0-­‐9-­‐]+)*@[a-­‐zA-­‐Z0-­‐9-­‐]+'  ||  E'(\\.[a-­‐zA-­‐Z0-­‐9-­‐]+)*\\.'  ||'(([0-­‐9]{1,3})|([a-­‐zA-­‐Z]{2,3})'  ||'|(aero|coop|info|museum|name))$')

);

CREATE  TABLE  users  (  …  email        email_t  …);16

Page 17: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

CREATE  TABLE  shopping_cart_items  (        product_id      integer,        cart_id            integer,        user_id            integer,

       FOREIGN  KEY  (product_id)                          REFERENCES  products(id),        FOREIGN  KEY  (cart_id,  user_id)                      REFERENCES  shopping_cart(id,  user_id)                        ON  DELETE  CASCADE,        FOREIGN  KEY  (user_id)                      REFERENCES  users(user_id)                      ON  DELETE  RESTRICT,  ON  UPDATE  CASCADE);

Oh yes, there are Foreign Keys too

17

Page 18: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Not your grandfather’s transactions

18

Page 19: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Transactional Schema Changes

BEGIN;

CREATE  TABLE  foo  (id  integer);INSERT  INTO  foo  (id)  values(1);

ROLLBACK;

select  *  from  foo;

ERROR:    relation  "foo"  does  not  exist

19

Page 20: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Unsure about something? Use Savepoints!

BEGIN;

UPDATE  wallet  SET  money  =  money  -­‐  100                                                WHERE  user  =  ‘bob’;

SAVEPOINT  bobs_wallet;

UPDATE  wallet  SET  money  =  money  +  10                                              WHERE  user  =  ‘bob’;

ROLLBACK  TO  bobs_wallet;

COMMIT;20

Page 21: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Multi-Version Concurrency Control

✤ Uses versioning & snapshots to isolate concurrent queries & update operations.

✤ Queries see the state of the database at the start of the query or transaction.

✤ READ COMMITTED (default) or SERIALIZABLE isolation levels

21

Page 22: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

MVCC in Plain English

✤ Reads don’t block writes

✤ Writes rarely block reads

✤ Writes don’t affect other writes unless both are writing the same data.

22

Page 23: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

And?

✤ Lot’s of concurrent clients are supported easily

✤ Very little locking happens in most applications

✤ Transactions are cheap(er)

23

Page 24: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Data Storage

PostgreSQL provides many different data types for managing your data beyond the basic Numeric, Text and Date types.

24

Page 25: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Date & Time Interval

SELECT  '2012-­‐01-­‐12'::date  -­‐    '1  year  2  mons  10  days  5  hours'::interval;

2010-­‐11-­‐01  19:00:00

create  table  foo  (bar  interval);insert  into  foo            values('11:55:06'::time  -­‐  '05:22:15'::time);  select  *  from  foo;

06:32:51

25

Page 26: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Network

SELECT  '192.168.1.2'::inet;

192.168.1.2

SELECT  '08002b010203'::macaddr;    

 08:00:2b:01:02:03

SELECT  '192.168'::cidr  +  300;

SELECT  '192.168'::cidr;

192.168.0.0/24

192.168.1.44/24

26

Page 27: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Arrays

CREATE  TABLE  sample  (        int_list  integer[],        char_box  varchar[3][3]);

INSERT  INTO  sample  (int_list,  char_box)  VALUES(            '{1,2,3,4,5}',            '{{a,b,c},{x,y,z},{1,2,3}}');

   int_list      |                  char_box                    -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  {1,2,3,4,5}  |  {{a,b,c},{x,y,z},{1,2,3}}

27

Page 28: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Geometric

Point  (x,y)Line  ((x1,y1),(x2,y2))

Box  ((x1,y1),(x2,y2))

Circle  ((x1,y1),r)

Path  ((x1,y1),...)

28

Page 29: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Composite Types

CREATE  TYPE  pair  AS  (        x            integer,        y            numeric);

CREATE  TABLE  foo  (  id  int,  bar    pair  );

INSERT  INTO  foo  VALUES  (1,  ROW(1,  5.4));

SELECT  *  FROM  foo;

SELECT  (bar).x  from  foo;

 id  |      bar      -­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    1  |  (1,5.4)

 x      -­‐-­‐-­‐  1

29

Page 30: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

XML Data Types

CREATE  TABLE  ExMel  (  data  xml  );

INSERT  INTO  ExMel  VALUES

('foo<bar>Baz</bar>'::xml),

(XMLPARSE  (CONTENT  'foo<bar>Baz</bar>')),

(XMLPARSE  (DOCUMENT  '<?xml  version="1.0"?><eof/>'));              data                -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  foo<bar>Baz</bar>  foo<bar>Baz</bar>  <eof/>

30

Page 31: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

And Many Others...

✤ UUID

✤ ENUM

✤ BIT

✤ Fulltext (ts_vector & ts_query)

✤ Boolean

✤ Bit

✤ Money

✤ ByteA

31

Page 32: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

When PostgreSQL install you must, code

compile you shall!

32

Page 33: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

200+ config options you will find,

But, panic you will not.

33

Page 34: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤ shared_buffers - ideally 25% of total memory

✤ work_mem - 2-10 MB depending on your work-load

✤ maintenance_work_mem - 256 MB for most work-loads

For the rest PostgreSQL will rely on OS disk caching

Memory Management

34

Page 35: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Risk VS Speed

✤ syncronous_commit - If turned off, don’t wait for WAL data to be synced to disk

✤ wal_buffers - 1MB for most installs is plenty

✤ checkpoint_segments - 10 in most cases (every 160MB)

✤ fsync - If turned off, don’t sync data to disk (scary!)

35

Page 36: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤ max_connections - Anything over 300 is case for concern

✤ random_page_cost - 2 on fast disks, < 1 on SSDs

✤ default_statistics_target - 1,000 is a good value in most cases

Other Performance Settings

36

Page 37: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤PDO::PGSQL ✤PgSQL

PHP & PostgreSQL

37

Page 38: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Making the Connection

$db  =  new  PDO("pgsql:  dbname=postgres  host=localhost"  ,"postgres"  ,""

);

$db  =  new  PDO("pgsql:  dbname=postgres  host=localhost"  .    "  user=postgres  password=");

38

Page 39: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Query Execution

$db  =  new  PDO("pgsql:  ...");

//  create  table  users  //                (id  serial,  login  text,  passwd  text);

$db-­‐>exec("INSERT  INTO  users  (login,  passwd)                                                VALUES('login',  'pwd')");

$db-­‐>lastInsertId('users_id_seq');

39

Page 40: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

RETURNING Magic

$db-­‐>query("INSERT  INTO  users  (login,  passwd)                                VALUES('login',  'pwd')                              RETURNING  id")-­‐>fetchColumn();  //  Get  record  ID

$db-­‐>query("INSERT  INTO  users  (login,  passwd)                              VALUES('login',  'pwd')                              RETURNING  *")-­‐>fetch(PDO::FETCH_ASSOC);  //  Get  entire  record

40

Page 41: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Accumulator

$db-­‐>query("SELECT  array_agg(login)  FROM      (SELECT  login  FROM  users  ORDER  BY  id  DESC)  q")-­‐>fetchColumn();  //  {bob,mike,jane}

$db-­‐>query("  SELECT  array_to_string(array_agg(login),  '<br/>')        FROM        (SELECT  login  FROM  users  ORDER  BY  id  DESC)  q")-­‐>fetchColumn();  //  bob<br/>mike<br/>jane

41

Page 42: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Playing it Safe

42

Page 43: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

pg_dump  \

   -­‐U  postgres  \    -­‐h  localhost  \    -­‐F  c  \    -­‐C  \    -­‐Z  6  \    dbname

Snapshots

#  login

#  hostname

#  internal  format

#  create  database

#  compress

43

Page 44: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤ Very Simple to Configure

✤ Allows for a point-in-time data recovery

✤ On the downside it is not

✤ real-time

✤ does not offer automatic fail-over

WAL Log Shipping Replication

44

Page 45: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤ Very simple to setup as of v9.0

✤ Real-time

✤ Allows fail-over

✤ Master-to-slave SELECT query offloading

Streaming Replication

45

Page 46: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

What about prior releases?

✤Slony-I✤PGPool II

46

Page 47: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

✤ pgAdmin✤ phpPGAdmin✤ psql console (it is awesome!)✤ pgFouine

Helpful Tools

47

Page 48: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”

Ilia [email protected]://ilia.ws/@iliaa

http://joind.in/6001I’d love to hear your feedback

48