sábado, 5 de octubre de 2019
Matar todas las conexiones con un SELECT
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TuBasedeDatos' AND pid <> pg_backend_pid();
Y listo!!
Bytes
lunes, 17 de diciembre de 2012
Crear una tabla "On-the fly" en un Query PostgreSQL
select
* from
(values(100,'JUAN'),(200,'LUCHO'),(300,'ARMANDO'),(400,'JOSE'),(500,'adrian')) as a(codigo, nombre)
order by a.nombre
espero que a algiuen mas le sirva. Bye
viernes, 19 de marzo de 2010
Cambiar contraseña del usuario postgres
- En una sesion de terminal como root :
su postgres
psql template1 (template1 o alguna base q tengan creada)
- ya en el cliente psql poner
\password postgres
- Ahi les pedira el nuevo password, luego salen con \q y listo... es todo.
Bye
miércoles, 24 de junio de 2009
Migrando de MSSQL2000 a PostgreSQL8.3 - Conclusiones
Estas son las cosas que pasaron o que siempre se deben tener en consideración al momento de hacer una migración de este tipo:
- No olvidar la diferencia de mayusculas minusculas, si desean usar Mayusculas o caracteres no ingleses como la ñ o tildes ponerlo siempre entre comillas (").
- El driver ODBC no puede capturar resultados de cursores; es decir funciones que devuelven tipos cursor o refcursor. Segun algunos se puede usando tres instrucciones:
begin;
select * from tufuncion();
fetch all from "nombre del cursor devuelto";
<<<<Yo no lo pude hacer funcionar en VB6 ni en Delphi, asi que use records, el tiempo ya presionaba mucho.
- El driver OleDB cuando retorna mas de 8000 registros aprox. se vuelve lento muy lento. ODBC es siempre rapido pero hay que definir el record para retornar valores.
- En Delphi fue muy muy ineficiente usar OleDB asi que alli solo se uso ODBC.
- La instruccion "exists" en Postgres es muy lenta, en lo posible se debe evitar su uso; siempre hay una forma de evitarla con lefts joins, right joins y esas cosas.
- No existe la sentencia TOP en Select's, en MSSQL se hace algo como:
SELECT TOP 10 * FROM tutabla, en PostgreSQL seria:SELECT * FROM tutabla LIMIT 10, dicen que tambien se puede usar el atributo 'maxrows' de CFQUERY, pero nunca lo use y no tengo idea a que se refieren :o). - La sentencia LIKE diferencia mayusculas y minusculas en postgresql, se puede solucionar con algo como esto:
SELECT * FROM tutabla WHERE LOWER(columna) LIKE '%#LCase(var)#%'(O tambien se puedes usar el operador ILIKE). - El operador mas (+) no se usa para concatenar, en su lugar se debe usar la barra doble (||), por ejemplo la instrucción en MSSQL
SELECT nombre + ' ' + apellido AS nombrecompletoseriaSELECT nombre || ' ' || apellido AS nomobrecompleto, la ultima forma es aceptada tambien en MSSQL. - Hay muchas otras funciones tambien que no existen en PLPgSQL, pero no es dificil encontrar sus equivalencias, por ejemplo:
month -> date_part
year -> date_part
convert -> to_char, cast, ::
print -> raise notice
isnull -> coalesce
str -> to_char
- El uso del tipo decimal desde VB a veces funciona y aveces no, el porque..., no lo se, asi que migramos todos los "decimal" a double precision, el problema es que despues hay que formatear las salidas y entradas a la cantidad de decimales que se necesiten.
- Es importante tambien saber que la logica de manejo de transacciones en las funciones almacenadas en PostgreSQL es diferente que la de MSSQL con los Procedimientos Almacenados, en MSSQL si queremos controlar la correcta ejecucion de tooodo un store con muchas instrucciones debemos indicar explicitamente que queremos que este store este en una transaccion e ir capturando los codigos de error para hacer un rollback, mientras que en PostgreSQL toda funcion almacenada se ejecuta automaticamente dentro de una transaccion, por lo que si falla nuestra funcion en algun punto se hara un rollback automatico.
viernes, 12 de junio de 2009
Backup Simple en PostgreSQL usando pg_dump
La entrada original en ingles esta en http://www.cyberciti.biz/tips/howto-backup-postgresql-databases.html
PostgreSQL es una de las bases de datos open-source mas robustas que existen. Como muchos otros RDBMS este brinda herramientas para realizar tareas de backup de la data.
Paso# 1: Ingresar al sistema como usuario postgres.
Digite el siguiente comando:
$ su postgres
Obtener la lista(s) de la(s) base de datos a sacar backup:
$ psql -l
Paso# 2: Hacer el backup usando pg_dump
Pg_dump es un utilitario para hacer backups de una base de datos PostgreSQL. Solo se puede hacer backup de una sola base de datos a la vez. Sintaxis general:
pg_dump basededatos > archivodestino
Ejemplo: Hacer backup a una base de datos llamada ventas
Escriba los siguientes comandos
$ pg_dump ventas > ventas.dump.out
Para restaurar la base de datos ventas:
$ psql -d ventas -f ventas.dump.out
O
$ createdb ventas
$ psql ventas
Sin embargo, en un ambiente de produccion siempre necesitaremos comprimir el backup de la base de datos:
$ pg_dump ventas | gzip -c > ventas.dump.out.gz
Para restaurar la base de datos usamos el siguiente comando:
$ gunzip ventas.dump.out.gz
$ psql -d ventas -f ventas.dump.out
Paso# 3: Automatizar el proceso
A continuación veremos un script en bash para realizar dicha tarea automaticamente, y luego los comandos necesarios para ponerlo en el gestor de tareas cron del linux.
Creamos el archivo backup.sh
$ nano backup.sh
Y alli escribimos el codigo siguiente:
#!/bin/bash
DIR=/backup/psql
F=$(date +%Y-%m-%0e)
export PGUSER=postgres
export PGPASSWORD=tupassword
[ ! $DIR ] && mkdir -p $DIR || :
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^Listado|^Nombre|template[0|1]')
#LIST="ventas produccion almacen"
for d in $LIST
do
pg_dump $d | gzip -c > $DIR/$d$F.out.gz
done
unset PGUSER
unset PGPASSWORD
Salimos guardando con Ctrl-X.
Yo reemplazo la variable LIST con los nombres de mis bases que quiero sacar backup, el comando que saca los nombres de las bases de datos en el script no me funciona del todo bien, pero la idea es esa :o).
Luego damos permisos de ejecucion al archivo backup.sh
$ chmod 755 backup.sh
Ingresamos la tarea en el cron.
$crontab -e
Configuro para que todos los dias a la 1am se realice el backup, por lo que escribo (para editar deben usar comandos de vi)
00 01 * * * /var/lib/pgsql/backup.sh
Paso #4:Backup completo de todo el gestor de base de datos.
Otra opcion es usar el comando pg_dumpall. como su nombre lo dice genera un backup de TODA la base de datos, guardando los datos de todo el gestor como usuarios, grupos y privilegios. Se puede usar el comando de la sig. forma:
$ pg_dumpall > all.dbs.out
O
$ pg_dumpall | gzip -c > todo.dbs.out.gz
Para restaurar el backup usamos el siguiente comando:
$ psql -f todo.dbs.out postgres
lunes, 27 de abril de 2009
Administrando PostgreSQL
1. psql (http://psql.sourceforge.net). Esta herramienta en modo texto o consola se instala predeterminadamente cuando instalamos el servidor PostgreSQL, es básicamente un programa interactivo para ejecutar comandos SQL en nuestro servidor, aunque no tiene un interfaz gráfico amigable es una poderosa herramienta par administrar de forma interactiva nuestro servidor de base de datos.
2. pgAdmin III (http://www.pgadmin.org/ ) El administrador gráfico por defecto para PostgreSQL, es bueno y nos permite hacer muchas de las tareas de administración y consulta a nuestra base de datos de forma gráfica, es totalmente gratuita y se instala siempre que instalamos PostgreSQL en un entorno Windows. Algunas cosas que no tiene y con lo que seria en si una poderosa herramienta son: un diseñador de consultas al estilo E/R, un depurador de funciones , aunque en este punto encontré que si es posible hacerlo pero hay que recompilar el servidor y la herramienta con algunos parches para que se pueda realizar dicha función, mas información al respecto en http://www.pgadmin.org/docs/1.8/debugger.html. También sería fenomenal si se pudiera exportar a otros formatos como html, xml, xls, etc. ya que solo soporta exportación de los datos consultados a CSV (texto separado por comas).
3. pg_dump. La herramienta predeterminada para hacer copias de seguridad de nuestras bases de datos en PostreSQL, lo malo ( si se le puede llamar asi) es que es en modo texto o consola y es totalmente interactiva, no pudiéndose programar tareas, pero usándolo en combinación con algún otro programa adicional como cron en unix/linux/freebsd se puede hacer muchas cosas interesantes. Pero en definitiva es imprescindible para cualquier administrador de base de datos PostgreSQL.
4. pg_top (http://ptop.projects.postgresql.org/). Interesante programa para poder monitorear el estado de las conexiones, que esta haciendo cada una y algunas cosas mas de nuestro servidor PostgreSQL en ambientes linux. Podríamos compararlo en funcionalidad con el SQLProfiler de MSSQL. Esta herramienta esta hecha al estilo de la interfaz del comando top de Linux. PgAdminIII puede también darnos este tipo de información pero solo si tenemos instalado PGAdmin en el mismo equipo que el servidor. Pero en definitiva la considero también como una herramienta imprescindible para un DBA de PostgreSQL que se respete :o) .
5, SQL Manager for PostgreSQL (http://sqlmanager.net/en/products/postgresql/manager). Poderosa herramienta de administración, consulta y manipulación de datos para PostgreSQL. Permite consultar, modificar, eliminar datos, administrar usuarios y permisos, depurar funciones, exportar a muchos formatos, diseñador de consultas, etc, etc, etc. Todo con excelentes interfaces y asistentes gráficos que hacen que la tarea de administración del servidor sea realmente un trabajo mucho mas sencillo. Yo he probado algunos otros mas y siempre llego a la conclusión de que esta herramienta es la mejor. Lo malo, es que es de pago, pero aun así podemos usarla con dos opciones una es un demo por 30 días con todas las opciones y la otra es una versión “Lite” libre de pago pero con limitaciones en algunas funcionalidades. Aun así si se tiene la posibilidad de comprarla sera una excelente compra.
6, Arinet Automatic Postgresql BackupScript (http://autopgsqlbakup.sourceforge.net/) Mas que un programa es un script basado en pg_dump para poder realizar las tareas de backup de nuestra base de datos de una forma mucho mas sencilla y con mejores opciones. Se debe trabajar también con cron en Unix/Linux/FreeBSD ya que el script esta hecho en bash. Pero para mi caso particular me ha servido bastante en el momento de administrar el backup de mi información. En el sig. link hay un pequeño manual de como ponerlo a trabajar en Linux: http://linux2.arinet.org/index.php?option=com_content&task=view&id=125&Itemid=35
Bueno es todo por ahora, si se de alguna otra herramienta por ahí se los haré saber en un próximo post. Bye
martes, 17 de marzo de 2009
Migrando de MSSQL2000 a PostgreSQL8.3
Los sistemas que actualmente uso y se conectan al MSSQL2000 estan hechos en VisualBasic 6 y en Delphi 5, ya hice pruebas de conectividad y uso de PGSQL con estos lenguajes y todo bien usando el driver OleDB de Postgres (http://pgfoundry.org/projects/oledb/). Generar la cadena de conexion es muy sencillo, en todo caso un ejemplo seria:
CadConn = "Provider=PostgreSQL OLE DB Provider;" & _
"Password=mipassword;User ID=miusuario;" & _
"Data Source=localhost;Location=mibasededatos;Extended Properties='';"
El Unico detalle aqui es un problema del driver cuando uno lanza SQLs que devuelven registros, provoca un error de retorno, pero esto no sucede si se hace a traves de SPs.
Ok ahora si a las bases de datos; primero unos alcances: MSSQL usa como lenguaje de programacion Transact-SQL(T-SQL) y PostgreSQL PlPgSQL, para postgres no es el unico, se pueden instalar otros como java, c, etc ,etc. Pero el mas usado y casi por default es PLPGSQL. Asi que dare alguno tips para hacer esta tarea un poco mas sencilla.
Existe una herramienta que se llama SQLWays(http://www.ispirer.com/products) que ofrece hacer dicha migracion, es realmente util, pero siempre hay que revisar lo que ha migrado, ademas al hacer esta tarea de manera automatizada hay muchos SPs que no son optimos o que no se ejecutan.
Ok entonces vamos a los tips especificos
1. En PGSQL no existen "Procedimientos Almacenados" como tales, sino mas bien "Funciones Almacenadas", eso quiere decir que siempre estaremos obligados a devolver algo desde nuestros "SPs".
2. Declaracion de variables:
MSSQL: se usa la palabra DECLARE y el nombre debe empezar con el simbolo @ , por ejem:
DECLARE @mivar INT
PGSQL: se hace el estilo de C o de java, es decir identificador seguido del tipo de dato, por ejem:
mivar int;
3. Las asignaciones de valores a variables:
MSSQL: se usa SET , ejem:
SET @mivar=1.12
PGSQL: se usa el simbolo := , ejem:
mivar:=1.12;
4. Devolucion de registros o filas, uno de los mas importantes tips creo yo.
MSSQL: se hace el select directamente y punto, por ejem: :o)
create procedure consulta as
select * from mitabla
PGSQL: como dije anteriormente en PGSQL se usan "funciones Almacenadas" por lo que debemos indicar a nuestra funcion el tipo a devolver. Lo mejor es usar el tipo pg_catalog.refcursor, que creo que esta disponible recien desde la version 8.x de PGSQL.
CREATE OR REPLACE FUNCTION consulta() RETURNS "pg_catalog"."refcursor" AS
declare data refcursor;
begin
open data for (
Select * from mitabla
);
return data;
END;
5. Recorrer cursores dentro de los SPs.
MSSQL:
declare @v_1 varchar(10)
declare @v_2 varchar(10)
declare cur1 cursor for
select * from mitabla
OPEN cur1
FETCH NEXT FROM cur1
INTO @v_1, @v_2
WHILE @@FETCH_STATUS = 0 BEGIN
print 'Valor 1 '+v_1
print 'Valor 2 '+v_2
FETCH NEXT FROM cur1
INTO @v_1, @v_2
END
CLOSE cur1
PGSQL:
declare
cur1 refcursor;
v_1 varchar (10) ;
v_2 varchar (10) ;
begin
OPEN cur1 FOR execute('select * from mitabla');
loop
fetch cur1 into v_1, v_2;
if not found then
exit ;
end if;
RAISE NOTICE 'Valor 1(%)', v_1;
RAISE NOTICE 'Valor 2(%)', v_2;
end loop;
close cur1;
end;
* Existe otra forma de recorrer registros en PGSQL, pueden ver mas detalles en http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING.
6. Bueno este tip mas que de SPs, es para la carga de data, mis tablas en MSSQL son de millones de registros asi que la mejor manera de pasar la data del MSSQL a PGSQL es:
1ero. Bajar la data del MSSQL a texto plano, tipo csv, es decir valores separados por comas.
2do. Usar el comando COPY.. FROM de PGSSQL para cargar a data desde los arhivos de texto a las tablas de PGSQL.
Ok, es todo hasta ahora, si veo algo mas lo publicare o si alguien mas puede dar un aporte bienvenido.
