Tuesday, August 28, 2007

Compactar base de datos PostgreSQL

¿Porque necesito compactar una base de datos PostgreSQL?
PostgreSQL como la mayoria de los servidores de bases de datos no elimina los registros fisicamente de las tablas sino que los marca para ser eliminado posteriormente por razones de rendimiento del comando DELETE.
¿Que consecuencias tiene no compactar la base de datos?
Probablemente hayas llegado a este blog buscando la razon por la que la base de datos tiene un tamaño muy exagerado comparado con la cantidad de registros que tienes y el rendimiento de la base de datos en las instrucciones UPDATE, SELECT e INSERT se estan tardando demasiado en ejecutarse.
¿Cuales son y porque existen diferentes tipos de compactacion en PostgreSQL?
La compactacion en PostgreSQL se lleva a cabo usando el comando SQL VACUUM, sin embargo, este tiene varios modificadores o argumentos dependiendo de la necesidad o la ocasion, estas son las mas importantes:
VACUUM ANALIZE : Actualiza las estadisticas de almacenamiento de las tablas que son usadas por el motor de bases de datos para determinar la forma mas veloz de ejecutar una Consulta, sin embargo, este no bloquea la tabla de forma exclusiva y solo necesita un Cursor de Solo-Lectura, es decir, solo actualiza las estadisticas para mejorar los queries.
VACUUM FULL : Realiza una coleccion de registros eliminados completa reclamando espacio en la base de datos ocupado por registros marcados para ser eliminados. Este comando bloquea las tabla e impide que otras conexiones realicen operaciones sobre la tabla o las tablas afectadas.
Nota: para ambos comandos, el nombre de la tabla es opcional. Si no es especifica el nombre de la tabla, la operacion se realiza sobre la base de datos en la que la conexion donde se ejecuta el comando esta trabajando.
¿Cuando ejecutar cada tipo VACUUM?
Es recomendable realizar VACUUM ANALYZE despues de una considerable cantidad de modificaciones sobre una tabla y realizar VACUUM FULL cuando no exista utilizacion sobre la base de datos, por ejemplo en horas nocturnas fuera del horario de trabajo. pgAgent es un excelente ayudante para este tipo de trabajos programados.
¿Como ejecutar VACUUM en linea de comandos en el servidor?
Usando psql
Para esta tarea podemos usar la utilidad de terminal psql usando el usuario postgres, en ubuntu o debian podemos hacer esto usando los siguientes comandos:
$sudo su postgres
$psql
$VACUUM ;
NOTA: Para ver el progreso del comando puede utilizar el modificador VERBOSE
Para salir de la utilidad psql utilice \q
Usando pgAdminIII
Abre la conexion con el servidor de bases de datos usando pgAdminIII y selecciona en el arbol izquierdo el nombre de la base de datos que se compactara: Click Derecho y Seleccione "Mantenimiento" el cual le mostrara una ventana como la siguiente:

Monday, August 27, 2007

Porque migrar y programar en Linux?: Perspectiva de un Desarrollador

Soy usuario de Windows desde los 9 años, desarrollo aplicaciones para Windows desde los 17 años: ¿Porque usar y programar en Linux? Existen cientos de razones que la comunidad de Linux pero para mi la mas importante es la seguridad: Seguridad La seguridad de Windows es un tema muy extenso, pero puedo resumir el problema en dos factores: Windows esta basado(toma comportamiento) en MS-DOS, un sistema de 1 Usuario y Tarea concurrente que luego fue transformado de version en version en lo que hoy se conoce como Windows. Debido a que Microsoft mantiene todo el Legacy posible con sus versiones anteriores orientadas al usuario final, la seguridad en ambientes Multi-usuario no es prioridad de programacion o configuracion del Sistema Operativo Windows dejando su punto mas debil en su FileSystem(Fat, Fat32 o NTFS) hasta el punto que Windows no se puede operara conectado a internet sin un Antivirus Preinstalado, asi mismo los desarrolladores de sus aplicaciones como Internet Explorer, Outlook, Live Messenger tienen muy baja seguridad. Eso tiene muchas formas de verse: estrategia comercial, despreocupacion por la seguridad o la razon mas aceptada entre desarrolladores de linux: facilidad de uso al usuario final. Economia Microsoft utiliza un modelo de Licenciamiento y Ventas de Servicio de sus productos que le ha dado su exito economico y dado a su facilidad de uso es la primera opcion para grandes empresas con gran poder adquisitivo ya que existen muchos mas desarrolladores que realicen tareas comunes como aplicaciones de mandejo de datos cediendo conocimientos solidos en seguridad de sistemas. Sin embargo para mi ya no es una opcion vivir pagando mas de 3000 $ USD para poder "mantener" estacion de trabajo con la ultima version de Windows, Office, Visual Studio, SQL Server y Antivirus porque en Linux eso me cuesta 0$ con software libre. ¿Como como puedo yo realizar las mismas tareas cotidiandas de Oficina y Programacion de Windows en Linux? La facilidad es relativa y es un completo mito para los programadores de Windows que escuchan hablar de desarrollos en Linux y todo se debe a su desconocimiento, a continuacion presento una tabla comparativa entre los productos de desarrollo que actualmente ofrece Microsoft por unos miles de dolares y que estan disponibles en Linux completamente gratis. Del lado izquierdo presento el producto de Microsoft o alguna empresa que vende software propietario y del lado derecho el software libre: Microsoft Office 2003 -> OpenOffice 2 o Gnome Office Microsoft Visual Studio 2005 y .NET -> MonoDevelop y Mono Microsoft SQL Server 2005 -> PostgreSQL Server 8 Antivirus -> No es necesario. VMWare Workstation -> VirtualBox Nota: Aunque MySQL es la opcion mas famosa de bases de datos, no es tan estable en almacenamiento como PostgreSQL. Si eres como yo, programador en Tecnologia .NET, el proyecto Mono es tu mejor eleccion para implantar aplicaciones en Linux. Apoyado por el IDE MonoDevelop, Mono Framework posee las siguientes tecnologias: XSP: Permite crear y ejecutar aplicaciones ASP.NET 2.0 creadas con o sin Visual Studio sobre Apache Web Server. ADO.NET: Mono tiene una implementacion completa del namespace System.Data permitiendo conectarse con diferences conectores como el de PostgreSQL, MySQL, Microsoft SQL Server, SqlLite y Oracle todos ellos incluidos en los paquetes de instalacion de Mono. GTK#: Permite crear interfaces graficas que se ajustan al aspecto visual del sistema operativo basadas en las librerias multiplataforma GTK, ideal para aplicaciones de Escritorio en entorno Gnome. WindowsForms: Permite ejecutar aplicaciones creadas en las librerias WinForms para Windows sobre Linux. Recuerda que en las listas de correo de MonoHispano y su canal de chat IRC #mono-hispano en el servidor irc.gimp.org estamos muchos usuarios de habla hispana dispuesto a ayudarte y orientarte en la plataforma Mono.

Tuesday, August 21, 2007

Conexion remota PostgreSQL y Firewall iptables

En estos dias tenia un problema con postresql 8.1, no me podia conectar remoto fuera de la red local y la solucion es modificar el postgresql y agregar unas reglas al iptables. Esto fue lo que hice para permitir la conexion remota: Nota: todos las rutas a los archivos de configuracion excepto el comando para modificar las reglas del iptables estan adaptadas a Debian/Ubuntu. 1. Archivo /etc/postgresql/8.1/main/postgresql.conf: La propiedad listen_addresses y port deben estar de la siguiente forma: listen_addresses = '*' port = 5432 2. En el archivo /etc/postgresql/8.1/main/pg_hba.conf quite el comentario(#) a la siguiente linea en la seccion IPv4: host all all 0.0.0.0/0 md5 3. Ejecute los siguientes comandos en la terminal sudo iptables -t filter -A OUTPUT -p tcp --sport 5432 -j ACCEPT sudo iptables -t filter -A INPUT -p tcp --sport 5432 -j ACCEPT 4. Reiniciar el postgresql sudo /etc/init.d/postgresql-8.1 restart Si no existe un DROP en el iptables que contrareste el efecto de la nueva regla aplicada, ya deberias poder conectarte de forma remota.

Saturday, August 18, 2007

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint. WTF?

Estoy desarrollando mi Sitio Web Personal(unleash-dev) en ASp.NET 2.0 y MS SQL 2005 pero sinceramente he empezado a extrañar mucho PostgreSQL. ¿Porque? Analicemos el siguiente error: "The ALTER TABLE statement conflicted with the FOREIGN KEY constraint " WTF?. ¿Como he logrado que me de este error tan abstracto y indepurable? Ja!. He creado una tabla con una columna NOT NULL y DEFAULT VALUE, cuando intente crear un foreign key desde esta columna local a una tabla remota(donde se supone que deberia estar creado el valor por defecto) ocurre el error. Ahora: ¿Porque Microsoft SQL Server Team, con tantas demoras entre versiones, no puedes colocar un mensaje mas explicativo? Shit! Mi ingles no es bueno, pero les dare unas recomendaciones: A) "The ALTER TABLE statement conflicted with the FOREIGN KEY constraint because column DEFAULT VALUE violates referential integrity" B) "local column DEFAULT VALUE conflicted ALTER TABLE ADD CONSTRAINT Statement" C) "Your fucking local column Default value is freaking out the referencing table in you ADD CONSTRAINT Statement" Pick one Microsoft, Just pick one! :@ Aprovecho para mencionar que la paginacion de SQL Server 2005 Apesta! y ni hablar de la de SQL 2000. Necesito mi LIMIT y OFFSET.

Interactive Linux Kernel Map

Asombroso mapa del Kernel de Linux, no dejen de consultarlo. Estoy seguro que Windows no tiene uno ya que Windows no es OpenSource -:) http://www.linuxdriver.co.il/kernel_map