Varias veces he tenido que contar los registros de todas las tablas de una base en particular.
Dejo la consulta para poder hacerlo en postgresql
SELECT
nspname AS schemaname,relname,reltuples::integer
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE
nspname NOT IN ('pg_catalog', 'information_schema') AND
relkind='r'
ORDER BY reltuples DESC;
Intentare mostrarles todas las cosas que me pasan día a día en mis pruebas, en mi trabajo, etc.
Mostrando entradas con la etiqueta postgreSQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta postgreSQL. Mostrar todas las entradas
jueves, 6 de octubre de 2016
martes, 26 de enero de 2016
Enmascarar datos en postgresql
Me paso que en una base postgresql teníamos que cambiar los nombres de las personas y sus documentos para que no se conocieran datos particulares de ellas.
Con la siguiente consulta lo realizamos
El campo del documento es un char de 20
El campo del nombre es un char muy grande
Con la siguiente consulta lo realizamos
El campo del documento es un char de 20
UPDATE tabla_documento SET campo_documento = substring(md5(campo_documento) from 1 for
20);
El campo del nombre es un char muy grande
Update tabla_persona set
campo_nombre = md5(campo_nombre);
viernes, 20 de noviembre de 2015
Permisos en postgres para correr aplicaciones Genexus
Una aplicación genexus Evo3 que en desarrollo accedía a la base con el superusuario de postgres, al tener que pasarla a producción tuve que restringir algunos permisos sobre la base de datos por temas de seguridad, acá le copio los pasos que tuve que realizar
• Crear rol aplicación: grants_app_miapp
• Crear usuario aplicación: app_miapp
• Otorgar privilegios de: select, update, insert y delete, sobre todas las tablas de la base miapp
• Otorgar privilegios de: select y usage, sobre todas las secuencias de la base miapp
Comandos ejecutados:
-- Executing query:
CREATE ROLE grants_app_miapp
SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION;
-- Executing query:
ALTER ROLE grants_app_miapp IN DATABASE miapp
SET search_path = "public";
-- Executing query:
COMMENT ON ROLE grants_app_miapp IS 'Rol de aplicación de la base de datos miapp.';
-- Executing query:
CREATE ROLE app_miapp LOGIN
PASSWORD ''
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
-- Executing query:
COMMENT ON ROLE app_miapp IS 'Usuario de aplicación de la base de datos miapp. Obtiene los privilegios a través del rol grants_app_miapp';
-- Executing query:
GRANT grants_app_miapp TO app_miapp;
Query returned successfully with no result in 42 ms.
-- Executing query:
grant select,update,insert,delete on all tables in schema public to grants_app_miapp;
-- Executing query:
grant select on all SEQUENCEs in schema public to grants_app_miapp;
-- Executing query:
grant usage on all SEQUENCEs in schema public to grants_app_miapp;
• Crear rol aplicación: grants_app_miapp
• Crear usuario aplicación: app_miapp
• Otorgar privilegios de: select, update, insert y delete, sobre todas las tablas de la base miapp
• Otorgar privilegios de: select y usage, sobre todas las secuencias de la base miapp
Comandos ejecutados:
-- Executing query:
CREATE ROLE grants_app_miapp
SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION;
-- Executing query:
ALTER ROLE grants_app_miapp IN DATABASE miapp
SET search_path = "public";
-- Executing query:
COMMENT ON ROLE grants_app_miapp IS 'Rol de aplicación de la base de datos miapp.';
-- Executing query:
CREATE ROLE app_miapp LOGIN
PASSWORD '
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
-- Executing query:
COMMENT ON ROLE app_miapp IS 'Usuario de aplicación de la base de datos miapp. Obtiene los privilegios a través del rol grants_app_miapp';
-- Executing query:
GRANT grants_app_miapp TO app_miapp;
Query returned successfully with no result in 42 ms.
-- Executing query:
grant select,update,insert,delete on all tables in schema public to grants_app_miapp;
-- Executing query:
grant select on all SEQUENCEs in schema public to grants_app_miapp;
-- Executing query:
grant usage on all SEQUENCEs in schema public to grants_app_miapp;
jueves, 1 de octubre de 2015
Matar consultas colgadas postgres
Muchas veces tenemos consultas que estan colgadas por consumir recursos o cualquier otro tema, para matarlas primero tenemos que quedarnos con el pid con la siguiente consulta:
Luego podemos matar solo una consulta por el pid
o matar todas las consultas de una base de datos
psql -h servidor -U postgres -d postgres (nos conectamos al server)
postgres=# SELECT * FROM pg_stat_activity WHERE datname='mi base de datos';
Luego podemos matar solo una consulta por el pid
postres=# SELECT pg_terminate_backend(numero de pid);
o matar todas las consultas de una base de datos
postgres=# SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='mi base de datos';
miércoles, 30 de septiembre de 2015
Ver estructura de tabala en postgreSQL
Para ver la definicion de una tabla en postgres se ejecuta la siguiente consulta
SELECT * FROM information_schema.columns WHERE table_name = 'nombre tabla con comilla simple';
SELECT * FROM information_schema.columns WHERE table_name = 'nombre tabla con comilla simple';
viernes, 14 de agosto de 2015
Consulta que esta corriendo en postgreSQL
Para saber que consulta esta corriendo en postgreSQL se debe de ejecutar una consulta, lo podes hacer por consola o por cualquier ide de consultas (sugiero utilizar SQL Workbench pero es indistinto)
SELECT * FROM pg_stat_activity ORDER BY 1;
SELECT * FROM pg_stat_activity ORDER BY 1;
sábado, 18 de julio de 2015
Optimizacion PostgresSql
Cuando trabajamos con BD y movemos de una grandes volúmenes de datos, por ejemplo hacemos un delete de una tabla con miles o millones de registros el sistema la base de datos le cuesta volver a lo optimo que esperábamos que estuviera. En cada motor existe la forma de actualizar las estadísticas, que a muy grosero modo es saber cuantos registros tiene una tabla y cual es su mejor forma de abordarla.
En postgres yo he utilizados estas 2 formas, una para windows y otra para linux, y me ha funcionado bastante bien. Quizás haya otras formas pero con mis pocos conocimientos en postgres con esto pude volver a utilizar una tabla que tenia millones de registros y los borre de una, y cuando intentaba consultar algún registro demoraba muchísimo.
- Para windows
"C:\Program Files\PostgreSQL\9.3\bin\vacuumdb.exe" -a -U postgres -h 127.0.0.1
"C:\Program Files\PostgreSQL\9.3\bin\reindexdb.exe" -a -U postgres -h 127.0.0.1
- Para linux
#!/bin/bash
# reindexado
psql -U usuario postgres -c "reindex database rucaf"
# vacuum sobre todas las bases de datos
su postgres -c "vacuumdb -a"
# actualizacin de estadisticas
su postgres -c "vacuumdb -z rucaf"
En postgres yo he utilizados estas 2 formas, una para windows y otra para linux, y me ha funcionado bastante bien. Quizás haya otras formas pero con mis pocos conocimientos en postgres con esto pude volver a utilizar una tabla que tenia millones de registros y los borre de una, y cuando intentaba consultar algún registro demoraba muchísimo.
- Para windows
"C:\Program Files\PostgreSQL\9.3\bin\vacuumdb.exe" -a -U postgres -h 127.0.0.1
"C:\Program Files\PostgreSQL\9.3\bin\reindexdb.exe" -a -U postgres -h 127.0.0.1
- Para linux
#!/bin/bash
# reindexado
psql -U usuario postgres -c "reindex database rucaf"
# vacuum sobre todas las bases de datos
su postgres -c "vacuumdb -a"
# actualizacin de estadisticas
su postgres -c "vacuumdb -z rucaf"
jueves, 23 de abril de 2015
Backup y Restore de PostgreSql por consola
Tengo un servidor Linux que es el equipo de testing con
postgresql, y el equipo Windows también con postgresql, necesito hacer un
backup en el Windows y tirarlo en el Linux.
En la carpeta de instalación de PostrgreSQL hay un
ejecutable Pd_dump.exe, lo que hay que ejecutar desde la consola es lo
siguiente:
Cd c:/…/bin/
Pg_dump.exe –C –U usuario base > archivo.respaldo.sql
-C es para incluir el Create
-U es para decirle cual es el usuario
base se debe de cambiar por la base a respaldar
archivo.respaldo.sql es el nombre del sql a crear, cambiarlo
luego desde Linux para levantar la base debemos de hacer lo
siguiente:
su postgres
psql <
archivo.respaldo.sql
Con esto tenemos la base que estaba en el equipo de
desarrollo Windows en el equipo de Testing Linux
jueves, 16 de abril de 2015
Instalación de Postgresql, Java, Jboss, en Linux Centos, para alojar aplicación genexus
En el siguiente post voy a comentar todos los pasos que tuve
que dar para poder tener una máquina virtual (en mi caso pero podría ser un
equipo físico) con Jboss y que funcione una aplicación generada con genexus.
Detalle de software que utilice.
Linux Centos 6.4 minimal
Genexus Evo3 U1
Java 7
PostgreSql 9
Jboss 7.1.1
Voy a ir contando paso a paso lo que hice y por qué.
Primero tengo que instalar Centos, eso no lo voy a detallar
pero comento que descargue la versión 6.4 que la tuve que buscar bastante
porque estaba discontinuada por no tener mantenimiento (necesitaba que fuera
esa versión porque estaba replicando un ambiente de producción). Luego de tener
la instalación completa, la actualizamos
yum update
yum upgrade
Luego de tener el equipo instalado y funcionado con las últimas
actualizaciones vamos a empezar a instalar el software base.
Con el siguiente comando vemos la versión de java que podríamos
instalar
yum search java | grep 'java-'
Buscamos la versión 7 y corremos lo siguiente
yum install java-1.7.0-openjdk-src.x86_64
Ahora vamos a instalar PostgreSQL, con la misma idea buscaos
la versión que tenemos en los repositorios e instalamos la que queramos.
yum install
postgresql-server.x86_64
Luego vamos a configurar postgresql, debemos de seguir la
siguiente secuencia
service postgresql initdb
service postgresql start
su postgres
psql
ALTER USER postgres WITH PASSWORD ‘pass_que_prefiera;
\q
Exit
Si vamos a acceder desde afuera deberíamos de tocar los
siguientes archivos
/var/lib/pgsql/data/pg_hba.conf
En mi caso como si quiera accede desde afura tuve que dejarlo
asi:
# TYPE DATABASE
USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket
connections only
local
all all trust
# IPv4 local connections:
host
all all 127.0.0.1/32 trust
# IPv6 local connections:
host all
all ::1/128 trust
#######ident
host all
all 192.168.73.153/32 trust
Y el archivo postgresql.conf debo de buscar las líneas que están
comentadas y des comentarlas y modificarlas para que quede así:
listen_addresses = '*'
port = 5432
Ahora debemos de continuar instalando jboss, para eso
instalamos algunas herramientas previas
yum install wget
yum install unzip
Ahora descargamos e instalamos jboss
wget
http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.zip
unzip jboss-as-7.1.1.Final.zip -d /usr/share
adduser jboss
chown -fR jboss.jboss
/usr/share/jboss-as-7.1.1.Final/
su jboss
cd /usr/share/jboss-as-7.1.1.Final/bin/
./add-user.sh (ManagementRealm, usuario foo y
pass)
Ahora ejecutamos jboss y probamos que funciones accediendo
por el navegador, por las dudas bajamos el firewall porque por defecto tiene
reglas y pueden hacernos ruido en este paso.
Limpiar las reglas de iptables (firewall)
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD
ACCEPT
iptables -P OUTPUT
ACCEPT
Levantar jboss (ver que no de ningún error)
/usr/share/jboss-as-7.1.1.Final/bin/standalone.sh
-Djboss.bind.address=0.0.0.0 -Djboss.bind.address.management=0.0.0.0&
Acceder de cualquier navegador a la ip del equipo y debería
de mostrarnos la página de jboss inicial.
Con esto tendremos casi todo, pero lo mejor es dejar el
firewall con las reglas que tiene y agregar nuestras reglas.
Les dejo un ejemplo del archivo /etc/sysconfig/iptables en
el que expongo el puerto 8080 para jboss, el 9990 para la consola de administración
de jboss, y el 5432 para conectarme a postgres desde fuera (esto si es producción
no se debería de agregar)
###############
archivo /etc/sysconfig/iptables ########################
# Generated by iptables-save v1.4.7 on Wed Apr
15 07:59:02 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [13:1644]
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5432 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9990 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED
-j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp
--dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with
icmp-host-prohibited
# jboss
-A FORWARD -p tcp -m tcp --dport 8080 -j ACCEPT
# postgresql
-A FORWARD -p tcp -m tcp --dport 5432 -j ACCEPT
# jboss admin
-A FORWARD -p tcp -m tcp --dport 9990 -j ACCEPT
-A FORWARD -j REJECT --reject-with
icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5432 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 9990 -j ACCEPT
COMMIT
# Completed on Wed Apr 15 07:59:02 2015
############### FIN ######################################
Ademas deberiamos de configurar para que jboss se levantara
cada vez que se reinicie el servidor, yo cree un arrancador muy basico que se
puede configurar a nuestras necesidades. Este archivo se podria llamar
/etc/init.d/jobss711
#########################
archivo /etc/init.d/jobss711 #################3
#!/bin/bash
### BEGIN INIT INFO
# Provides: jbossas7
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop JBoss AS 7
### END INIT INFO
# chkconfig: 35 92 1
## Include some script files in order to set
and export environmental variables
## as well as add the appropriate executables
to $PATH.
[ -r /etc/profile.d/java.sh ] && .
/etc/profile.d/java.sh
[ -r /etc/profile.d/jboss.sh ] && .
/etc/profile.d/jboss.sh
JBOSS_HOME=/usr/share/jboss-as-7.1.1.Final
AS7_OPTS="$AS7_OPTS
-Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true" ## See AS7-1625
AS7_OPTS="$AS7_OPTS
-Djboss.bind.address.management=0.0.0.0"
AS7_OPTS="$AS7_OPTS -Djboss.bind.address=0.0.0.0"
case "$1" in
start)
echo "Starting JBoss AS 7..."
#sudo -u jboss sh ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS ##
If running as user "jboss"
#start-stop-daemon --start --quiet --background --chuid jboss --exec
${JBOSS_HOME}/bin/standalone.sh -- $AS7_OPTS
## Ubuntu
${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS &
;;
stop)
echo "Stopping JBoss AS 7..."
#sudo -u jboss sh ${JBOSS_HOME}/bin/jboss-admin.sh --connect
command=:shutdown ## If running as user "jboss"
#start-stop-daemon --start --quiet --background --chuid jboss --exec
${JBOSS_HOME}/bin/jboss-admin.sh -- --connect command=:shutdown ## Ubuntu
${JBOSS_HOME}/bin/jboss-cli.sh --connect command=:shutdown
;;
*)
echo "Usage: /etc/init.d/jbossas7
{start|stop}"; exit 1;
;;
esac
exit 0
#########################
FIN archivo #################
Con chkconfig podremos agregarlo para que inicie y finalice
cuando arranquemos o apaguemos el equipo, ver como se adapta a cada instalación
de Linux, por ejemplo si quieren que se arranque cuando iniciamos entorno
grafico o no. Por ejemplo algo asi
chkconfig –level 345
jboss711 on
Probemos en reiniciar el equipo y probar que siga
funcionando jboss y postgresql
Esta todo funcionando, ahora lo único que falta es crear el
war desde gx, con el Depoyment wizard sin hacer ningún cambio, lo único que hay
que hacer es agregar todas las clases al war generado (se puede editar con
winzip) ya que genexus solo agrega algunas y si se quiere agregar cuando se está
generando desde la aplicación DW de gx se cae (en mi caso, pueden probarlo
ustedes).
Y por último hay que tirar el war en /usr/share/jboss-as-7.1.1.Final/standalone/deployments,
mirar el log y ver que no tire ningún error, y por último en un navegador accede
a la aplicación.
Recordar que el link sería algo así:
miércoles, 26 de noviembre de 2014
Backup / Restore base de datos PostgreSQL
¿Cómo exportar e importar una base de datos postgreSQL?
La forma fácil, pero que no siempre funciona es hacerlo por
el PgAdmin, ahí es gráfico y se puede hacer un bakup y un restore.
Lo que voy a explicar son un par de formas de hacerlo desde
consola, para los que utilizamos Linux, que también se puede utilizar de Windows.
Backup: $ pg_dump -U
{user-name} {source_db} -f {dumpfilename.sql}
Restore: $ psql -U {user-name} -d {desintation_db} -f {dumpfilename.sql}
Backup: $ pg_dump -U user bd_name > archive_name.sql
Restore: $ psql -U user db_name < /directory/archive.sql
lunes, 24 de noviembre de 2014
Instalación y configuración básica de PostgreSQL
Voy a explicar muy brevemente los pasos que tuve que hacer
para instalar en un Linux Ubutu 13.04 un postgreSQL y configurarlo para acceder
desde otro equipo con PgAdmin.
Primero se necesita obviamente un Linux instalado y
actualizado.
El primer paso es instalar, yo utilizo apg-get install
postgresql.
Luego debemos de ir a la carpeta /etc/postgresql/9.1/mail,
esto obviamente cambia depende de la versión instalada.
Editamos el archivo postgresql.conf
Buscamos la siguiente linea y la dejamos asi:
#listen_addresses
= 'localhost'
listen_addresses
= '*'
Luego tenemos que habilitar desde que red vamos a acceder,
esto lo hacemos en el archivo pg_hba.conf que qudaria algo asi:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
#
"local" is for Unix domain socket connections only
local all all md5
# IPv4
local connections:
host all all 127.0.0.1/32 md5
host all all 192.0.0.1/32 md5
# IPv6
local connections:
#host all all ::1/128 ident
Con esto estamos habilitando toda la red 192, es decir
cualquier equipo que tenga una ip 192.*.*.* puede acceder a la base de datos.
Debemos de setear el pass del superusuario postgre
# su postgres -c psql postgres
postgres=# alter user postgres with password
'mi_contraseña';
postgres=# \q
Con reiniciar el servicio de postgre (o directamente el
equipo) quedaría todo pronto para acceder a nuestra base de datos postgreSQL
desde otro equipo que no sea el server.
martes, 12 de agosto de 2014
Show full processlist para postgresSQL
Me enfrente a un problema con una aplicación en postgreSQL y
lo primero que quise hacer es el conocido (por mi) show full processlist, para
detectar que consultas sql se están corriendo en el motor. En postgreSQL esto
no funciona entonces buscando un poco en internet encontré la forma de hacerlo.
La consulta que hay que correr es lo siguiente
select *
from pg_stat_activity;
esto se puede hacer de 2 formas, por ejemplo en pgAdmin
correrla con cualquier sql. O también podemos hacerlo con consola, entonces se
debe de seguir los siguientes pasos:
- # su postgres
- # [postgres@srv]$ psql
- postgres=# select * from pg_stat_activity;
Con esto se pueden ver las consultas igual que en MySql.
Suscribirse a:
Entradas (Atom)