You are on page 1of 72

PostgreSQL

Capacitacin Nivel 1
Da 2

Agenda

Herramientas

PgAdmin, psql

Monitoreo

Administracin general

Jerarquia de objetos.

Creacin de objetos del cluster.

Respaldos

WAL.

Mantenimiento

SQL.

PgAdmin Vs psql

PgAdmin vs psql (2)

PgAdmin Query Builder

Monitoreo con PgAdmin

Tools Server Status


Conexiones
clientes abiertas

Monitoreando inserciones
Esto nos indica
Que esta habiendo una
Carga importante de
datos

Herramientas SO: top

El top muestra de manera dinmica el uso


de nuestro server.

Herramientas SO: htop

Es ms completo.

No viene instalado por defecto.



Herramientas SO: iostat,
mpstat, free

Son relativamente estndar.



Herramientas Postgres

El script de inicio posee una opcin status.

Solo nos indica el PD del servidor que


est levantado contra el cluster.

Herramientas SO: Admin. Tareas win.

Podemos ver de manera bsica el


comportamiento del servidor.

Desde 'cmd' con el comando tasklist.



Herramientas SO: cmd

Algunos Windows no tienen estos


comandos.

W2003 y superior si los tienen.



Actividad /O

Consulta sobre el catalogo de sistema.


Nos trae cuantos bloques fueron consultados y cuantos fueron 'tocados'.

Setear el script de arranque SysV
$ su root
# tar xvfz postgresql-<version>.tar.gz
# cd postgresql-<version>
# cp contrib/start-scripts/linux /etc/rc.d/init.d/postgresql
# chmod a+x /etc/rc.d/init.d/postgresql
# update-rc.d postgresql defaults
(o)
# ln -s /etc..sql /etc/rc3.d/S12postgresql
# ln -s /etc..sql /etc/rc3.d/K02postgresql

update-rc.d es una herramienta caracterstica de las


versiones basadas en Debian.

Manejar el servidor
Con service:
service postgresql [start|stop|restart|reload|status]
Con script:
/etc/init.d/postgres [start|stop|restart|reload|status]
Con comando:
pg_ctl start [-w] [-t SECS] [-D DATADR] [-s] [-l FLENAME] [-o
"OPTONS"]
pg_ctl stop [-W] [-t SECS] [-D DATADR] [-s] [-m SHUTDOWN-
MODE]
pg_ctl restart [-w] [-t SECS] [-D DATADR] [-s] [-m SHUTDOWN-
MODE] [-o "OPTONS"]
pg_ctl reload [-D DATADR] [-s]
pg_ctl status [-D DATADR]
pg_ctl kill SGNALNAME PD

Administrando
Nuestro
contexto

Administrando Usuarios

Usuarios SO != usuarios Base de datos

Rol = usuario
USER opcin LOGN por defecto.
ROLE opcin NO LOGN por defecto.
GROUP no tiene CONNECTON LMT

SE-Postgresql
Propone un ambiente ms seguro entre usuarios del SO
y la base.

Ejemplos
CREATE GROUP los_resagados
WTH NOSUPERUSER NOLOGN;
SELECT (CURRENT_DATE+1)::timestamp;
CREATE USER resagado1
WTH PASSWORD '1234'
VALD UNTL '2009-08-06 00:00:00'
N GROUP los_resagados;
CREATE USER resagado2 WTH PASSWORD '1234' VALD UNTL '2009-08-
06 00:00:00' N GROUP los_resagados;
DROP USER resagado1;
ALTER USER resagado2 WTH PASSWORD '4321';
1
2

Bases de Datos
CREATE DATABASE name
[ [ WTH ] [ OWNER [=] dbowner ]
[ TEMPLATE [=] template ]
[ ENCODNG [=] encoding ]
[ TABLESPACE [=] tablespace ]
[ CONNECTON LMT [=] connlimit ] ]
TEMPLATE: utilizar esa base como plantilla de la nueva. ncluido los datos!
TABLESPACE: Podemos almacenar la base en una parte especial del disco.
CONNECTON LMT: Permite hasta un nmero determinado de conexiones.
OWNER: Dueo de la base.
HINT: La base que utilicemos como plantilla no debe estar siendo accedida
Por otros usuarios.

Tablespaces vs. Schemas

Esquemas

Organizacin lgica
de objetos y
relaciones de la base.

Por defecto: Public.

Tablespaces

Organizacin fsica
de objetos del cluster.

Ejemplo Tablespace
emanuel@pgsql:/var/lib/pgsql$ sudo mkdir data/test_ts
emanuel@pgsql:/var/lib/pgsql$ sudo chown postgres data/test_ts
CREATE TABLESPACE test_ts OWNER resagado2
LOCATON '/var/lib/pgsql/data/test_ts';
CREATE DATABASE test WTH OWNER resagado2
TEMPLATE template1 TABLESPACE test_Ts;
Createdb
createuser
Comandos desde shell

Ejemplo Schema + Tablespace
base1=# create database foo wit
owner = post!res
template=template1
encodin!="#T$%" tablespace=prueba&
'()*T) +*T*,*-)
base1=# create scema .&
'()*T) -'H)/*
base1=# create table .01&
'()*T) T*,L)
base1=# alter table . set scema .&
*LT)( T*,L)
root2bo.:3usr3local3p!sql# mkdir tablespace
root2bo.:3usr3local3p!sql# cown post!res tablespace3
base1=# create tablespace prueba owner post!res location
"3usr3local3p!sql3tablespace"&
'()*T) T*,L)-P*')
base1=# alter table ... set tablespace prueba&
*LT)( T*,L)
Una tabla puede estar
en un esquema
y en un tablespace al
mismo tiempo.

Jerarqua de Objetos

Servidores

Bases de datos

Cast

Lenguajes

Esquemas

...

Replicacion

Tablespaces.

Roles Group y
User.

Tablas

Vistas

Tipos

Funciones

Sequences

Funciones y Triggers

Dominios

Agregados y
conversiones

Respaldos y restauraciones

Herramientas estandar

pg_dump

pg_restore

psql (sirve para restaurar)



pg_dump
-f, --file=FLENAME output file name
-F, --format=c|t|p output file format (custom, tar, plain text)
-i, --ignore-version proceed even when server version mismatches
-Z, --compress=0-9 compression level for compressed formats
-a, --data-only dump only the data, not the schema
-b, --blobs include large objects in dump
-c, --clean clean (drop) schema prior to create
-C, --create include commands to create database in dump
-d, --inserts dump data as NSERT commands, rather than COPY
-D, --column-inserts dump data as NSERT commands with column names
-E, --encoding=ENCODNG dump the data in encoding ENCODNG
-n, --schema=SCHEMA dump the named schema(s) only
-N, --exclude-schema=SCHEMA do NOT dump the named schema(s)
-o, --oids include ODs in dump
-O, --no-owner skip restoration of object ownership in plain text format
-s, --schema-only dump only the schema, no data
-S, --superuser=NAME specify the superuser user name to use in plain text format
-t, --table=TABLE dump the named table(s) only
-T, --exclude-table=TABLE do NOT dump the named table(s)
-x, --no-privileges do not dump privileges (grant/revoke)
--disable-dollar-quoting disable dollar quoting, use SQL standard quoting
--disable-triggers disable triggers during data-only restore
Generales
Control
De
salida

pg_restore
-d, --dbname=NAME connect to database name
-f, --file=FLENAME output file name
-F, --format=c|t specify backup file format
-i, --ignore-version proceed even when server version mismatches
-l, --list print summarized TOC of the archive
-v, --verbose verbose mode
-a, --data-only restore only the data, no schema
-c, --clean clean (drop) schema prior to create
-C, --create create the target database
-, --index=NAME restore named index
-L, --use-list=FLENAME use specified table of contents for ordering
output from this file
-n, --schema=NAME restore only objects in this schema
-O, --no-owner skip restoration of object ownership
-P, --function=NAME(args) restore named function
-s, --schema-only restore only the schema, no data
-S, --superuser=NAME specify the superuser user name to use for
disabling triggers
-t, --table=NAME restore named table
-T, --trigger=NAME restore named trigger
-x, --no-privileges skip restoration of access privileges (grant/revoke)
--disable-triggers disable triggers during data-only restore
--no-data-for-failed-tables
-1, --single-transaction restore as a single transaction
Generales
Control
De
Salida

Dump and restore cooktip :)

Volcar con compresin y con re-creacin


de objetos:

pg_dump -c -U<usuario> -Z6 <base> >


archivo.sql.gz

Restaurar con compresin:

gzip -d archivo.sql.gz

pg_restore -Uubuntu -dubuntu dump.sql



Hot dump & restore

WTF?!

pg_dump -Fp -C -Uubuntu ubuntu | perl 4pe


"s3ubuntu3ubuntu53!" | psql -p5432 -Uubuntu

WTF?????!!!!!!

La linea de perl es opcional, solamente cambio el


nombre de la base a crear.

Se utiliza para migraciones teniendo 2 servidores


arriba. Como?
Teniendo 2 clusters en puertos distintos

Dump con tar

De esta forma se dumpea en formato tar.

pg_dump -Ft -U<user> database > dump.tar

Se puede descomprimir con:

tar xvf dump.tar



Dump - Restore PgAdmin

Click botn derecho sobre la base.

Seleccionar Backup o restore.



Tips

No hagas respaldos separados (pgdump


-s y -a). Esto servir para mantener los
campos serial en buen estado.

Nombr el archivo con la fecha del dump,


asi sera mas fcil de ordenar.

Al menos tener 3 o ms backups


histricos.

WAL

Write Ahead Log.


Permite acelerar inserciones masivas
Es un estadio previo a comprometer los datos en el
espacio de datos.
Su configuracin en ambientes masivos es crtica.
Permite integridad de transacciones.

WAL Configuracin
#fsync = on # Sincronizacin con disco (se recomienda utilizar en
# ON, aunque diversos experimentos en ZFS dieron
# buenos resultados.
#synchronous_commit = on # Sincroniza inmediatamnete al comprometer
#wal_sync_method = fsync # Verificar cual soporta el SO open_datasync,
# fdatasync, fsync, fsync_writethrough, open_sync
#full_page_writes = on # Recupera desde escrituras parciales
#wal_buffers = 64kB # min 32kB(change requires restart)
#wal_writer_delay = 200ms # 1-10000 milliseconds; Junta varias escrituras al
# mismo tiempo
#commit_delay = 0 # range 0-100000, in microseconds idem anterior
#commit_siblings = 5 # range 1-1000
#checkpoint_segments = 3 # in logfile segments, min 1, 16MB each
#checkpoint_timeout = 5min # range 30s-1h
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_warning = 30s # 0 is off

WAL

Ubicacin
en el
cluster:
pg_xlog

Contenido:
archivos de
bloque

Antiguos problemas de la WAL
LOG: next transaction D: 884736;
next OD: 306834> PANC: could not
access status of transaction 884736>
DETAL: could not read from file> "/usr
/local/pgsql8b-3/data/pg_clog/0000"- at
offset 221184: Success> LOG: startup
process (PD 17774) was terminated by
signal 6> LOG: aborting startup due to
startup process failure
LOG: next transaction D: 1048576;
next OD: 306834> PANC: could not
access status of transaction 1048576>
DETAL: could not open file "/usr/local/
pgsql8b-3/data/pg_clog/0001"-: No>
such file or directory
pg_resetxlog
NO FUNCONA!
dd bs=8k count=1 < /dev/zero > /usr/loc-al/pgsql8b3/data/pg_-clog/0001

Mantenimiento

Herramientas indispensables

VACUUM

ANALYZE

RENDEX

Clusterdb

Mantenimiento Logs

MARTLLO
+
=

Vacuum
Recobrar espacio de disco
ocupado por la actualizacin y
borrado de datos.
Actualizar las estadsticas
usadas por el planeador.
Proteger contra la posible
prdida de datos sobre
problemas con el transaction
D en datos viejos
Tipos:
- FREEZE
- ANALZE
- F!LL
- S"P

Vacuum Full vs. vacuum
VACUUM FULL puede liberar
mayor cantidad de disco pero
es ms lento.
VACUUM FULL requiere
bloqueo exclusivo en la tabla
que esta trabajando.
Desventaja es que no reduce
el tamao proporsional del
ndice. Puede hacer a los
ndices ms grandes.
Reindex database.
EL Vacuum estndar puede
correr de forma paralela con
otras operaciones exepto
modificaciones en los objetos
(ALTER)
Generalmente se recomienda
utilizar este tipo de vacuum.

Vacuum

Desde linea de
comandos:

Vacuumdb
-a, --all vacuum all
databases
-d, --dbname=DBNAME
database to vacuum
-t, --table='TABLE[(COLUMNS)]'
vacuum specific table only
-f, --full do full vacuuming
-z, --analyze update
optimizer hints

Desde un cliente:
VACUUM [ FULL ] [ FREEZE ]
[ VERBOSE ] [ table ]
VACUUM [ FULL ] [ FREEZE ]
[ VERBOSE ] ANALYZE [ table [ (column
[, ...] ) ] ]

Vacuum Freeze

Como saber
cuando los XD's
estn al borde?

SELECT relname,
age(relfrozenxid)
FROM pg_class
WHERE relkind = 'r';

SELECT datname,
age(datfrozenxid)
FROM pg_database;

El posible mensaje
que puede
aparecer es:

WARNNG:
database "ubuntu"
must be vacuumed
within 177008866
transactions

Configurar VACUUM
vacuum_cost_limit = 200
vacuum_cost_page_hit = 1
vacuum_cost_page_miss = 10
vacuum_cost_page_dirty = 20
vacuum_cost_delay = 0
Esto se va sumando
Hasta alcanzar el lmite
Es para disminuir el /O cuando
el clculo de costo toco lmite.
Dejarlo bajo es una buena prctica, ir
subiendo a medida que hagamos las
mediciones.

Autovacuum

Es un daemon que
constantemente
vigila las tablas
con muchas
inserciones y
actualizaciones.

Es altamente
recomendado.

Se configura
desde el
postgresql.conf

Se lo puede
desactivar.

Mejoras en 8.4

Vacuum en 8.4
utiliza VSM
(Visibility Space
Map)

Permite realizar la
operacin sobre
tuplas modificadas
unicamente.

Otros caminos

Reacomodar la
tabla con ALTER.

ANALYZE

Recolecta estadsticas
de acuerdo a la
configuracin de las
relaciones.

Se puede setear la
recoleccin por
columna.

ALTER TABLE tabla


ALTER [ COLUMN ]
column SET
STATSTCS integer
ANALYZE [ VERBOSE
] [ table [ ( column [, ...]
) ] ]
VACUUM ANALYZE ;
#uchos $%A consideran
&ue 'as estad(sticas a )eces
sue'en ser tan importantes
como 'os datos*

RENDEX

Re-indiza los ndices.

Suele pasar (aunque


no debera) que los
ndices se corrompan
o desactualicen.

Los ndices
clusterizados no
tienen efecto con este
comando.
RENDEX
{ NDEX |
TABLE |
DATABASE |
SYSTEM } name
[ FORCE ]
Desde linea de comando:
reindexdb

Clusterdb

Reclusteriza los
ndices que han
sido clusterizados.

La sentencia es
CLUSTER y la
linea de comandos
es clusterdb.

CLUSTER?

Obliga a la tabla a
guardarse en el mismo
orden que el ndice.

Se utiliza mucho para


tablas grandes y de
pocos cambios.

nversamente
proporsional, a menos
cambios, se
recomienda aumentar
el fillfactor.
Crear: CLUSTER employees
USNG employees_ind;
Actualizar: CLUSTER
employees;
Actualizar todo: CLUSTER;
CREATE NDEX nombreind
ON tabla
USNG btree
(columna)
WTH (FLLFACTOR=80);
ALTER TABLE tabla CLUSTER ON
nombreind;

Rotacin y
mantenimiento de logs
Evitar el crecimiento
exponencial de los logs.
Especificar rotacin.
Mostrar datos realmente
relevantes.
Borrar historicos seguido, a
menos que sean valuables.
Setear niveles de log de
acuerdo a la situacin, evitar
dejar uno esttico.
pg_ctl start | rotatelogs /var/log/pgsql_log
86400
Desde el postgresql.conf:
log_rotation_size = 10MB

Martillo

Suele usarse
cuando todo falla.

SQL

Lenguajes

DDL

DML

Control de transacciones

Control de permisos

Sentencias bsicas DML

SELECT

NSERT

UPDATE

TRUNCATE

SELECT
SELECT [ ALL | DSTNCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVNG condition [, ...] ]
[ { UNON | NTERSECT | EXCEPT } [ ALL ] select ]
[ ORDER BY expression [ ASC | DESC | USNG operator ] [ NULLS { FRST | LAST } ] [, ...] ]
[ LMT { count | ALL } ]
[ OFFSET start ]
[ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAT ] [...] ]
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 | USNG ( join_column [, ...] ) ]
Predicado
Fuentes
Agrupacin
Conjuncin
Ordenacin
Filtro
Bloqueos
Condicin

NSERT
NSERT NTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ...] |
query }
[ RETURNNG * | output_expression [ AS
output_name ] [, ...] ]

UPDATE
UPDATE [ ONLY ] table [ [ AS ] alias ]
SET { column = { expression | DEFAULT } |
( column [, ...] ) = ( { expression | DEFAULT }
[, ...] ) } [, ...]
[ FROM fromlist ]
[ WHERE condition | WHERE CURRENT OF
cursor_name ]
[ RETURNNG * | output_expression [ AS
output_name ] [, ...] ]

DELETE - TRUNCATE
DELETE FROM [ ONLY ] table [ [ AS ] alias ]
[ USNG usinglist ]
[ WHERE condition | WHERE CURRENT OF
cursor_name ]
[ RETURNNG * | output_expression [ AS
output_name ] [, ...] ]
TRUNCATE [ TABLE ] name [, ...] [ CASCADE |
RESTRCT ]

DELETE ejemplo

Condicionales de SQL

CASE

COALESCE

NULLF

GREATEST AND
LEAST

Subquerys - SemiJoins

Operadores: NOT N, N (list) or (query),


EXST, NOT EXST, ANY, SOME, ALL

Sentencias bsicas DDL

CREATE

ALTER

DROP

DDL
create table varios(
state char(2),
name varchar(30),
children integer,
distance float,
budget numeric(19,2),
born date,
checkin time,
started timestamp default
CURRENT_TMESTAMP
);
comment on table varios S 'ejemplo de tabla con
varios datos y un default';
CREATE TABLE statename (
code CHAR(2) PRMARY KEY,
name CHAR(30)
);
COMMENT ON statename S 'tabla de paises';
create table customer (
customer_id integer,
name char(30),
telephone char(20),
state char(2) references statename
);
COMMENT ON customer S 'ingresar un state que
este en statename';
create table employee (
employee_id integer primary key,
name varchar(20),
weight float
);
create table llaves_compuestas(
col1 integer,
col2 integer,
primary key(col1,col2)
);

...DDL (cont)
create table llaves_foraneas_compuestas(
col3 integer,
col4 integer,
foreign key (col3, col4)
references
llaves_compuestas
);
create table t_con_check(
nombre varchar(20) CHECK
(length(trim(nombre)) > 1),
sexo char(1) CHECK(sexo N ('M','F')),
fecha_pasada date
CHECK(fecha_pasada
BETWEEN '1990-01-01' AND CURRENT_DATE),
CHECK (upper(trim(nombre)) != 'EMA')
--check de tabla
);

ALTER ejemplos
prueba=# alter table customer add primary key(customer_id);
NOTCE: ALTER TABLE / ADD PRMARY KEY crear el ndice implcito
customer_pkey para la tabla customer
ALTER TABLE
prueba=# create table coches(
customer integer references customer,
modelo varchar(4)
);
CREATE TABLE
prueba=# create index ix_btree_customer on customer USNG btree(customer_id)
TABLESPACE prueba;
Prueba=# create index ix_h_cutomer on customer USNG hash(customer_id)
TABLESPACE prueba;

Vistas simples
Con la vista se puede hacer una simulacion del sinonym de Oracle
(Permite dar un alias a una tabla). De esta forma:
CREATE VEW tablaAlias AS 'Select * from tabla';
-- No confundir con las vistas materializadas!!!
De la misma forma podemos crear una funcion para que retorne un record set...
CREATE OR REPLACE FUNCTON simula(integer)
MMUTABLE LANGUAGE SQL AS 'Select * from tabla where columna = $1';

Control transaccional

BEGN

END

SAVEPONT

COMMT

ROLLBACK

PREPARE TRANSACTON

ROLLBACK PREPARED

Ejemplo bsico

Control permisos

GRANT

REVOKE

</Da 2>
Gracias!

You might also like