PostgreSQL 8.1 Gestione e tuning by Federico Campoli Postgresql 8.1 Pagina 1
Sommario Accesso al database (Il file hba_access) Il client psql Tuning dell'istanza (postgresql.conf) L'ottimizzatore a costi VACUUM L'oid wraparound Sommario Pagina 2
PostgreSQL autentica su due livelli Host L'accesso viene filtrato dal file pg_hba.conf Database L'accesso viene gestito dall'rdbms attraverso i ruoli utente Accesso al database Pagina 3
Accesso al database host based Il file pg_hba.conf si trova nella directory $PGDATA creata con initdb E' un file di testo dove ogni riga mappa le regole di accesso al database secondo lo schema TIPO DATABASE UTENTE INDIRIZZO METODO Valori ammessi Tipo: local,host Database: nome_database,all User: username,all Indirizzo:indirizzo ip o classe di indirizzi (subnet mask opzionale) Metodo: trust,password,crypt,kerberos Accesso al database Pagina 4
Tipo di connessione local La connessione avviene su socket locale. Ammessa solo per connessioni localhost host La connessione avviene via tcp/ip. Nelle versioni precedenti alla 8 richiedeva che il postmaster fosse avviato con l'opzione -i Un record host puo' gestire sia connessioni SSL che non SSL per usare SSL e' necessario che il database sia compilato con SSL abilitato. Per funzionare correttamente richiede che il parametro listen_addresses del file postgresql.conf sia correttamente valorizzato. Accesso al database Pagina 5
Metodo di connessione trust La connessione avviene senza dover fornire password password,crypt,md5 la connessione avviene verificando username e password. Nella modalita' password viene trasmessa in chiaro Nella modalita' crypt viene usato l'algoritmo crypt per criptare le password Nella modalita' md5 viene fatto un hash md5 delle password kerberos Con questa opzione PostgreSQL opera di fatto come un server kerberos (necessita' la compilazione con l'opzione krb attivata) Accesso al database Pagina 6
Esempio # TYPE DATABASE USER CIDR ADDRESS METHOD local all all trust host all all 127.0.0.1 255.255.255.255 trust host thezion thezion 192.168.1.4 255.255.255.255 password Accesso al database Pagina 7
Il client psql E' il client predefinito di PostgreSQL E' un client a riga di comando con funzionalita' readline integrate Invocazione: psql -d <DBNAME> -U <USERNAME> -p <PORT> Accetta comandi sql Puo' leggere file esterni ed eseguire lo spool su disco Permette di analizzare gli oggetti presenti con i comandi \d Lanciato con l'opzione -E visualizza le query generate dai comandi interni E' lo strumento principale per il restore dei database da dump sql Il client command line psql Pagina 8
Il client psql postgres@ubuntuworkstation:~$ psql -d globalkult_net -E Welcome to psql 8.1.4, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit globalkult_net=# Il client command line psql Pagina 9
Il client psql globalkult_net=# \d ********* QUERY ********** SELECT n.nspname as "Schema", c.relname as "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as "Type", r.rolname as "Owner" FROM pg_catalog.pg_class c JOIN pg_catalog.pg_roles r ON r.oid = c.relowner LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r','v','s','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1,2; ************************** List of relations Schema Name Type Owner + + + public access table globalkult_usr public access_aid_seq sequence globalkult_usr public accesslog table globalkult_usr public accesslog_aid_seq sequence globalkult_usr public adsense_clicks table globalkult_usr public adsense_clicks_aid_seq sequence globalkult_usr public aggregator_category table globalkult_usr public aggregator_category_cid_seq sequence globalkult_usr public aggregator_category_feed table globalkult_usr Il client command line psql Pagina 10
Il client psql globalkult_net=# \d access ********* QUERY ********** SELECT c.oid, n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ '^access$' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2, 3; ************************** ********* QUERY ********** SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules, relhasoids, reltablespace FROM pg_catalog.pg_class WHERE oid = '166250' ************************** ********* QUERY ********** SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod), (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef), a.attnotnull, a.attnum FROM pg_catalog.pg_attribute a WHERE a.attrelid = '166250' AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum ************************** Il client command line psql Pagina 11
Il client psql ********* QUERY ********** SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c2.reltablespace FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i WHERE c.oid = '166250' AND c.oid = i.indrelid AND i.indexrelid = c2.oid ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname ************************** ********* QUERY ********** SELECT c.relname FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '166250' ORDER BY inhseqno ASC ************************** Table "public.access" Column Type Modifiers + + aid integer not null default nextval('access_aid_seq'::regclass) mask character varying(255) not null default ''::character varying type character varying(255) not null default ''::character varying status smallint not null default 0::smallint Indexes: "access_pkey" PRIMARY KEY, btree (aid) globalkult_net=# Il client command line psql Pagina 12
Tuning dell'istanza (postgresql.conf) E' il file di inizializzazione del processo postgres Il file si trova nella posizione $PGDATA E' composto da una serie di righe del tipo nome = valore E' commentato in maniera esaustiva Permette di intervenire in maniera granulare sull'attivita' del db Il tuning dell'istanza Pagina 13
Tuning dell'istanza (postgresql.conf) listen_addresses = '*' port = 5432 I parametri determinano gli indirizzi e la porta su cui ascolta l'istanza Indirizzi multipli sono ammessi se separati da virgole Il tuning dell'istanza Pagina 14
Tuning dell'istanza (postgresql.conf) max_connections = 100 E' il numero massimo di connessioni concorrenti ammesse Ogni connessione usa circa 400 byte di memoria condivisa Quando si altera questo parametro e' bene aumentare di conseguenza il parametro shared_buffers Il tuning dell'istanza Pagina 15
Tuning dell'istanza (postgresql.conf) shared_buffers = 200 Determina il quantitativo di memoria condivisa usata dal server. Ogni shared buffer e' 8192 bytes Il valore minimo ammesso e' 16, e deve essere almeno il doppio del valore di max_connections; Un valore di 2000 e' accettabile per installazioni di produzione ma richiede la modifica del parametro del kernel SHMMAX Il tuning dell'istanza Pagina 16
Tuning dell'istanza (postgresql.conf) temp_buffers = 200 Determina il quantitativo massimo di memoria temporanea usata per le connessioni al database. Ogni slot e' 8192 bytes Il tuning dell'istanza Pagina 17
Il client pgadmin3 Scaricabile sotto licenza artistica all'url http://www.pgadmin.org Multipiattaforma, intuitivo e funzionale e' piu' di un semplice client Comprende il pacchetto pgagent che aggiunge funzionalita' di job scheduling al DBMS http://www.pgadmin.org/docs/1.4/pgagent.html Il client pgadmin3 Pagina 18
A colpo d'occhio presenta una vista ad albero dei database presenti nel cluster. Ogni database contiene vari oggetti che possono essere selezionati. Automaticamente pgadmin3 genera la DDL relativa all'oggetto selezionato. La finestra in alto a destra permette di leggere le statistiche eventuali e le dipendenze dell'oggetto selezionato. Il client pgadmin3 Pagina 19
Selezionando una tabella e' possibile vedere, sempre nella vista ad albero, tutte le informazioni utili riguardo ad essa. Colonne, constraints, indici rules ed eventuali triggers. Un click con il tasto destro permette di entrare in modalita' edit. Il client pgadmin3 Pagina 20
Il client pgadmin3 Pagina 21
Pgadmin3 include lo strumento sql query che e' un terminale interattivo piu' ricco di psql. Il risultato della query scritto nell'area in alto viene restituito nella griglia in basso Il client pgadmin3 Pagina 22
Dalla versione 1.4 il tool sql query include anche la possibilita' di rappresentare il piano d'esecuzione. Pgadmin3 e' quindi un client molto versatile ma e' anche un ottimo alleato per fare performance tuning sul database Il client pgadmin3 Pagina 23
VACUUM Letteralmente passare l'aspirapolvere Ricompatta i blocchi non usati e aggiorna le statistiche degli oggetti Esiste sia come comando sql che come programma thezion=# vacuum full; LOG: transaction ID wrap limit is 1099035127, limited by database "postgres" LOG: transaction ID wrap limit is 1099035127, limited by database "postgres" VACUUM postgres@ubuntuworkstation:~$ vacuumdb -f -a vacuumdb: vacuuming database "postgres" LOG: transaction ID wrap limit is 1098985901, limited by database "test_migrazi one" LOG: transaction ID wrap limit is 1098985901, limited by database "test_migrazi one" VACUUM Vacuum Pagina 24
L'oid wraparound La semantica transazionale di postgresql confronta l'id della transazione corrente con le altre per determinare quali sono nel futuro o nel passato. Se un transaction ID (XID) di una insert e' piu' grande di quello corrente allora la transazione valutata e' nel futuro e non deve essere visibile alla transazione corrente. Poiche' la dimensione di uno XID e' di 32bit si ha la ripetizione degli stessi numeri ogni 4 miliardi di transazioni. Cio' produce il risultato che tutte le transazioni che erano nel passato e quindi visibili, si ritrovano improvvisamente nel futuro e quindi invisibili! I dati pur continuando a risiedere nel database vengono visti da qualsiasi sessione perche' nel futuro. L'OID wraparound Pagina 25
L'oid wraparound Fino alla versione 7.2 l'unica soluzione era fare un initdb ogni 4 miliardi di transazioni. Dalla 7.3 in poi e' sufficiente un VACUUM FULL ogni 4 miliardi di transazioni per impedire l'oid wraparound il comando VACUUM invia dei warning quando dei database del cluster si trovano a meno di 500 milioni di transazioni dal wraparound failure WARNING: some databases have not been vacuumed in 1613770184 transactions HINT: Better vacuum them within 533713463 transactions, or you may have a wraparound failure. VACUUM A meno di 10 milioni di transazioni dal wraparound failures questo warning viene inviato per ogni transazione. A meno di 1 milione il postmaster termina spontaenamente ad ogni transazione L'OID wraparound Pagina 26
Tu sei libero: * di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare quest'opera * di modificare quest'opera Alle seguenti condizioni: Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza. Non puoi usare quest'opera per fini commerciali. sa Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica a questa. * Ogni volta che usi o distribuisci quest'opera, devi farlo secondo i termini di questa licenza, che va comunicata con chiarezza. * In ogni caso, puoi concordare col titolare dei diritti d'autore utilizzi di quest'opera non consentiti da questa licenza. Le utilizzazioni consentite dalla legge sul diritto d'autore e gli altri diritti non sono in alcun modo limitati da quanto sopra. Questo è un riassunto in linguaggio accessibile a tutti del Codice Legale. Testo integrale della licenza disponibile all'indirizzo http://creativecommons.org/licenses/by-nc-sa/2.5/it/legalcode Licenza Pagina 27
PostgreSQL 8.1 Gestione e tuning by Federico Campoli Postgresql 8.1 Pagina 28