Si teneis una base de datos con varios esquemas, llega un momento en que es complicado encontrar una tabla y es farragoso tener que escribir el nombre del esquema delante de cada tabla para acceder al contenido.
Una solución es modificar el search_path del usuario con el que te conectas a la base de datos, por ejemplo del usuario user_connect, conectado como superusuario:
alter user "user_connect" set search_path to "$user",public,master,soccer;
Pero es mucho mejor indicar el camino de acceso a nivel de base de datos, en lugar de hacerlo a nivel de usuario.
alter database "league" set search_path to "$user",public,master,soccer;
De esta forma todos los usuarios que se conecten a esta base de datos, podrán encontrar las tablas de forma cómoda, en los esquemas public, master, soccer y en un esquema con su propio nombre de usuario con el que se ha conectado.
Intentando arrojar un poco de luz a problemas que puedes encontrarte. Especialmente con PostgreSql
lunes, 17 de marzo de 2014
jueves, 27 de febrero de 2014
Exportar una instancia
Comando para exportar mi instancia amazon a una imagen que poder cargar en un HyperV:
ec2addixt i-0cd6fd4c -e Microsoft -b export-ami-crom -f vhd -d "export i-0cd6fd4c -e Microsoft -b export-ami-crom" -O ...AKIA... -W ...feuC... --region eu-west-1 -U http://ec2.amazonaws.com/
Error
Client.NotExportable: Only imported instances can be exported.
Resulta que amazon no deja exportar ninguna instancia.
Solo puedes exportarla si la importastes en primer lugar sobre una máquina EC2.
No me ha gustado nada saber que solo puedo exportar lo que yo importé primeramente. Por lo tanto todas las AMIS del market de Amazon son un callejón sin salida, así que ojo.
domingo, 12 de enero de 2014
Bloque de comandos sin crear una función
Si necesitas hacer pruebas con un bloque de comandos de pgsql, sin tener que crear una función, esta es la forma:
do
$$declare
intervalo varchar;
fecha timestamp;
begin
--fecha := ;
intervalo:= 1 || ' days';
fecha := current_timestamp + intervalo::interval;
insert into acumulado(usuario_id,f_fin,texto) values ( 1, fecha, 'texto' );
end$$;
do
$$declare
intervalo varchar;
fecha timestamp;
begin
--fecha := ;
intervalo:= 1 || ' days';
fecha := current_timestamp + intervalo::interval;
insert into acumulado(usuario_id,f_fin,texto) values ( 1, fecha, 'texto' );
end$$;
lunes, 30 de septiembre de 2013
Consulta de Bloqueos en PostgreSql > 9.2 y como matar procesos
Para las versiones de Postgres 9.2 o superiores podéis crear una vista que facilitará la consulta de los procesos que actualmente tiene bloqueos en vuestro sistema:
CREATE OR REPLACE VIEW public.procesos_bloqueantes(
blocking_pid,
blocking_user,
blocking_query,
blocked_pid,
blocked_user,
blocked_query,
age)
AS
SELECT kl.pid AS blocking_pid,
ka.usename AS blocking_user,
ka.query AS blocking_query,
bl.pid AS blocked_pid,
a.usename AS blocked_user,
a.query AS blocked_query,
to_char(age(now(), a.query_start), 'HH24h:MIm:SSs' ::text) AS age
FROM pg_locks bl
JOIN pg_stat_activity a ON bl.pid = a.pid
JOIN pg_locks kl ON bl.locktype = kl.locktype AND NOT bl.database IS
DISTINCT
FROM kl.database AND NOT bl.relation IS DISTINCT
FROM kl.relation AND NOT bl.page IS DISTINCT
FROM kl.page AND NOT bl.tuple IS DISTINCT
FROM kl.tuple AND NOT bl.virtualxid IS DISTINCT
FROM kl.virtualxid AND NOT bl.transactionid IS DISTINCT
FROM kl.transactionid AND NOT bl.classid IS DISTINCT
FROM kl.classid AND NOT bl.objid IS DISTINCT
FROM kl.objid AND NOT bl.objsubid IS DISTINCT
FROM kl.objsubid AND bl.pid <> kl.pid
JOIN pg_stat_activity ka ON kl.pid = ka.pid
WHERE kl.granted AND
NOT bl.granted
ORDER BY a.query_start;
Una vez localizados los procesos que están produciendo el bloqueo y que sentencia están ejecutando, podemos tomar la decisión de eliminarlos si llevan demasiado tiempo en ejecución y no nos importa perder él resultado de la acción que estaban ejecutando. El identificador de proceso a matar es el "blocking_id" de la vista:
select pg_cancel_backend ( blocking_pid );
CREATE OR REPLACE VIEW public.procesos_bloqueantes(
blocking_pid,
blocking_user,
blocking_query,
blocked_pid,
blocked_user,
blocked_query,
age)
AS
SELECT kl.pid AS blocking_pid,
ka.usename AS blocking_user,
ka.query AS blocking_query,
bl.pid AS blocked_pid,
a.usename AS blocked_user,
a.query AS blocked_query,
to_char(age(now(), a.query_start), 'HH24h:MIm:SSs' ::text) AS age
FROM pg_locks bl
JOIN pg_stat_activity a ON bl.pid = a.pid
JOIN pg_locks kl ON bl.locktype = kl.locktype AND NOT bl.database IS
DISTINCT
FROM kl.database AND NOT bl.relation IS DISTINCT
FROM kl.relation AND NOT bl.page IS DISTINCT
FROM kl.page AND NOT bl.tuple IS DISTINCT
FROM kl.tuple AND NOT bl.virtualxid IS DISTINCT
FROM kl.virtualxid AND NOT bl.transactionid IS DISTINCT
FROM kl.transactionid AND NOT bl.classid IS DISTINCT
FROM kl.classid AND NOT bl.objid IS DISTINCT
FROM kl.objid AND NOT bl.objsubid IS DISTINCT
FROM kl.objsubid AND bl.pid <> kl.pid
JOIN pg_stat_activity ka ON kl.pid = ka.pid
WHERE kl.granted AND
NOT bl.granted
ORDER BY a.query_start;
Una vez localizados los procesos que están produciendo el bloqueo y que sentencia están ejecutando, podemos tomar la decisión de eliminarlos si llevan demasiado tiempo en ejecución y no nos importa perder él resultado de la acción que estaban ejecutando. El identificador de proceso a matar es el "blocking_id" de la vista:
select pg_cancel_backend ( blocking_pid );
Etiquetas:
administración,
monitorización,
postgresql
jueves, 26 de septiembre de 2013
Indices no utilizados en postgresql
Consultar los índices de tu bbdd que no están siendo utilizados, para ahorrar espacio o replantearte sus campos:
SELECT
schemaname || '.' || relname AS table,
indexrelname AS index,
pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
idx_scan as index_scans
FROM pg_stat_user_indexes ui
JOIN pg_index i ON ui.indexrelid = i.indexrelid
WHERE NOT indisunique AND idx_scan < 50 AND pg_relation_size(relid) > 5 * 8192
ORDER BY pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST,
pg_relation_size(i.indexrelid) DESC;
Etiquetas:
optimización,
postgres,
postgresql,
tuning
viernes, 10 de mayo de 2013
Consulta de Bloqueos en PostgresSql
Si tienes problemas de registros bloqueados en la base de datos ejecuta la siguiente sentencia para visualizar que sentencia/s lo están provocando:
SELECT bl.pid AS blocked_pid, a.usename AS blocked_user,
kl.pid AS blocking_pid, ka.usename AS blocking_user, a.query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a
ON bl.pid = a.pid
JOIN pg_catalog.pg_locks kl
JOIN pg_catalog.pg_stat_activity ka
ON kl.pid = ka.pid
ON bl.transactionid = kl.transactionid AND bl.pid != kl.pid
WHERE NOT bl.granted;
SELECT bl.pid AS blocked_pid, a.usename AS blocked_user,
kl.pid AS blocking_pid, ka.usename AS blocking_user, a.query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a
ON bl.pid = a.pid
JOIN pg_catalog.pg_locks kl
JOIN pg_catalog.pg_stat_activity ka
ON kl.pid = ka.pid
ON bl.transactionid = kl.transactionid AND bl.pid != kl.pid
WHERE NOT bl.granted;
lunes, 11 de marzo de 2013
Suscribirse a:
Entradas (Atom)