<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IPCorp Blog &#187; Bases de Datos</title>
	<atom:link href="http://www.ipcorp.com.ar/blog/category/temas/bases-de-datos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ipcorp.com.ar/blog</link>
	<description>#pg_dump ideas &#62; blog.log</description>
	<lastBuildDate>Fri, 11 Nov 2011 20:18:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cocinando la Receta RGM (Ruby-GTK-MongDB) en FACENA</title>
		<link>http://www.ipcorp.com.ar/blog/2011/09/20/cocinando-la-receta-rgm-ruby-gtk-mongdb-en-facena/</link>
		<comments>http://www.ipcorp.com.ar/blog/2011/09/20/cocinando-la-receta-rgm-ruby-gtk-mongdb-en-facena/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 23:21:02 +0000</pubDate>
		<dc:creator>Roxana Pintos</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=1102</guid>
		<description><![CDATA[En el marco de las Jornadas de Presentación de Trabajos de Investigación y Desarrollo de Alumnos y Graduados L.S.I de FACENA, el día 24 de septiembre a las 11hs, Leandro Rodriguez y Carlos Mathiasen presentarán Cocinando la Receta RGM (Ruby-GTK-MongDB).
El objetivo de la charla es compartir la experiencia de utilizar la tecnología de:

Ruby: lenguaje de [...]]]></description>
			<content:encoded><![CDATA[<p>En el marco de las <em>Jornadas de Presentación de Trabajos de Investigación y Desarrollo de Alumnos y Graduados L.S.I de FACENA,</em> el día 24 de septiembre a las 11hs, Leandro Rodriguez y Carlos Mathiasen presentarán <em><strong>Cocinando la Receta RGM (Ruby-GTK-MongDB)</strong></em>.</p>
<p>El objetivo de la charla es compartir la experiencia de utilizar la tecnología de:</p>
<ul>
<li>Ruby: lenguaje de programación interpretado, reflexivo y orientado a objetos, creado por el japonés Yukihiro &#8220;Matz&#8221; Matsumoto. Combina una sintaxis inspirada en Python y Perl con características de programación orientada a objetos similares a Smalltalk.</li>
<li>GTK+ o The GIMP Toolkit: conjunto de bibliotecas multiplataforma para desarrollar interfaces gráficas de usuario (GUI). GTK+ se diseñó para permitir programar con lenguajes como C, C++, C#, Java, Ruby, Perl, PHP o Python.</li>
<li>MongoDB: sistema de base de datos multiplataforma orientado a documentos, de esquema libre. Se destaca su velocidad y su rico pero sencillo sistema de consulta de los contenidos de la base de datos.</li>
</ul>
<p>Los esperamos en el edificio de la FACENA ubicado por calle 9 de Julio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2011/09/20/cocinando-la-receta-rgm-ruby-gtk-mongdb-en-facena/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cursos de Verano 2011 Fa.C.E.N.A.</title>
		<link>http://www.ipcorp.com.ar/blog/2011/02/07/cursos-de-verano-2011-fa-c-e-n-a/</link>
		<comments>http://www.ipcorp.com.ar/blog/2011/02/07/cursos-de-verano-2011-fa-c-e-n-a/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 12:05:40 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=974</guid>
		<description><![CDATA[Al igual que en el 2010, este año se realizan los cursos de verano en la Facultad de Ciencias Exactas y Naturales y Agrimensura desde el 21/02/2011 hasta el 12/03/2011. Los cursos tienen como objetivo ofrecer a los profesionales y técnicos de la disciplina informática, la oportunidad de capacitación y actualización en herramientas orientadas al [...]]]></description>
			<content:encoded><![CDATA[<p>Al igual que en el 2010, este año se realizan los cursos de verano en la Facultad de Ciencias Exactas y Naturales y Agrimensura desde el 21/02/2011 hasta el 12/03/2011. Los cursos tienen como objetivo ofrecer a los profesionales y técnicos de la disciplina informática, la oportunidad de capacitación y actualización en herramientas orientadas al desarrollo de software. En esta oportunidad, <strong>IPCorp</strong> esta presente en el dictado de <strong>dos cursos</strong>. El primer curso es <strong>&#8220;Gestión de datos con PostgreSQL&#8221;</strong>, dictado por el <strong>Lic. Marcelo R. Diaz</strong> los días lunes, miércoles y viernes de 17 a 20 hs. y por otro lado, <strong>&#8220;Desarrollo Web Agil con Ruby on Rails&#8221;</strong>, desarrollado por el<strong> Lic. Carlos E. Barbiero</strong>, los martes y jueves de 18 a 22 hs.</p>
<p>Las inscripciones se realizan del 14 al 18 de febrero en el laboratorio de informática de 14 a 21 hs, o bien por correo electrónico a cursosveranofacena@gmail.com</p>
<p>Para más información de los contenidos de cada curso: <a href="http://exa.unne.edu.ar/docs/Informatica-Cursosdeverano2011-contenidos.pdf">http://exa.unne.edu.ar/docs/Informatica-Cursosdeverano2011-contenidos.pdf</a></p>
<p>Si querés obtener más información sobre los cursos dictados por el staff de IPCorp, podés enviar un email a contacto@ipcorp.com.ar, detallándonos tus consultas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2011/02/07/cursos-de-verano-2011-fa-c-e-n-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lo nuevo de PostgreSQL 9.0 ilustrado</title>
		<link>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 13:30:16 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=710</guid>
		<description><![CDATA[Esta nueva release de PostgreSQL tiene tantas mejoras que la comunidad de desarrolladores decidió saltear lo que sería la siguiente versión -PostgreSQL 8.5- pasando directamente a la 9.0, ya que se introdujeron más de 200 mejoras en dicha versión.
Para ir preparándonos y estar al tanto de todas estas mejoras, habilitaron en la wiki de PostgreSQL [...]]]></description>
			<content:encoded><![CDATA[<p>Esta nueva release de <a title="PostgreSQL" href="http://www.postgresql.org" target="_blank">PostgreSQL</a> tiene tantas mejoras que la comunidad de desarrolladores decidió saltear lo que sería la siguiente versión -PostgreSQL 8.5- pasando directamente a la 9.0, ya que se introdujeron más de 200 mejoras en dicha versión.</p>
<p>Para ir preparándonos y estar al tanto de todas estas mejoras, habilitaron en la wiki de PostgreSQL una sección especial donde se explican estos cambios con sus correspondientes ejemplos.</p>
<p>Entre los cambios más importantes tenemos la incorporación de características como:</p>
<ul>
<li><strong>Hot Standby:</strong> Esta característica nos permite crear una base de datos &#8216;Standby&#8217;. Esto es una segunda instancia de la base de datos: normalmente en un servidor separado a partir del log binario de la primera base de datos, permientiendo que el servidor standby esté disponible para consultas de sólo lectura.</li>
<li><strong>Streaming Replication:</strong> Es un complemento de Hot Standby. Si bien existen varias soluciones de replicación de terceros disponibles para PostgreSQL, ésta nueva versión trae una simple e integrada versión que probablemente será usada como default en la mayoría de las soluciones de High Availability de PostgreSQL.</li>
</ul>
<p>Más info de las características nuevas y ejemplos en <a title="What's new in PostgreSQL 9" href="http://wiki.postgresql.org/wiki/Illustrated_9_0" target="_blank">What&#8217;s new in PostgreSQL 9.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eligiendo que restaurar en Postgresql</title>
		<link>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:56:55 +0000</pubDate>
		<dc:creator>marcelo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=589</guid>
		<description><![CDATA[
Cuando se trabajan con grandes volúmenes de datos restaurar suele ser un trabajo que demanda muchas horas,para resolver esto Postgresql creo una manera sencilla de editar los dumps que lo veremos en este Post.

Como en todo proceso de backup lo primero que existe es el  dump de la base, por ejemplo:

#pg_dump  -U postgres [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;">Cuando se trabajan con grandes volúmenes de datos restaurar suele ser un trabajo que demanda muchas horas,para resolver esto Postgresql creo una manera sencilla de editar los dumps que lo veremos en este Post.</p>
<p><span id="more-589"></span></p>
<p>Como en todo proceso de backup lo primero que existe es el  dump de la base, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#pg_dump  -U postgres -Fc  -f archivo_dump.txt base</span></pre></div></div>

<p style="margin-bottom: 0cm;">Donde  el  archivo_dump.txt es el resultante del proceso.</p>
<p style="margin-bottom: 0cm;">Ahora bien si ese archivo (archivo_dump.txt) contiene tablas de unos miles de registros  no hay problema,pero la cosa se complica cuando trabajamos con tablas de millones de registros y a su vez índices asociados a estas;es un hecho que demandara un tiempo importante de restauración. En mi caso en particular con tablas de miles de millones de registros el tiempo aproximado de restauración es de 18 a 24 horas.</p>
<p>Ahora bien como resuelvo que restaurar y que no del archivo: archivo_dump.txt, veamos el siguiente ejemplo. Primero creo un archivo legible para la raza humana de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#pg_restore -l archivo_dump.txt  &gt; archivo.lista</span></pre></div></div>

<p>El resultado del archivo.lista sera algo como lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="basha" style="font-family:monospace;">; Archive created at Fri Jan 22 22:28:36 2010
; dbname: ipcorp
; TOC Entries: 74
; Compression: 0
; Dump Version: 1.4-0
; Format: CUSTOM
;
;
; Selected TOC Entries:
;
2; 145344 TABLE species postgres
3; 145344 ACL species
4; 145359 TABLE nt_header postgres
5; 145359 ACL nt_header
6; 145402 TABLE species_records postgres
7; 145402 ACL species_records
8; 145416 TABLE ss_old postgres</pre></div></div>

<p style="margin-bottom: 0cm;">Las primeras lineas son una serie de referencias acerca del nombre de la base de datos, fecha del dump, mas abajo encontramos números de linea asociados a tablas, funciones e índices; esto ultimo puede ser comentado mediante &#8220;;&#8221; o también se puede eliminarlos directamente.</p>
<p>Entonces una vez que tenemos nuestro archivo de lista modificado con los elementos que realmente nos interesa, restauramos de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># pg_restore -Fc -d base -L archivo.lista &lt; file_dump.txt</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo resolver un split brain en DRBD</title>
		<link>http://www.ipcorp.com.ar/blog/2009/10/05/como-resolver-un-split-brain-en-drbd/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/10/05/como-resolver-un-split-brain-en-drbd/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 13:50:42 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[split brain]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=410</guid>
		<description><![CDATA[En un post anterior vimos cómo crear un cluster de servidores PostgreSQL con Hearbeat y DRBD. Un problema que podemos llegar a tener es que se corte la comunicación entre los nodos del cluster: cada uno de los nodos cree que el otro cayó y por lo tanto levanta los servicios que tiene asignado. Cuando [...]]]></description>
			<content:encoded><![CDATA[<p>En un post anterior vimos cómo crear un <a href="http://ipcorp.com.ar/blog/2009/10/01/cluster-de-alta-disponibilidad-de-servidores-postgresql-con-drbd/" target="_blank">cluster de servidores PostgreSQL con Hearbeat y DRBD</a>. Un problema que podemos llegar a tener es que se corte la comunicación entre los nodos del cluster: cada uno de los nodos cree que el otro cayó y por lo tanto levanta los servicios que tiene asignado. Cuando el enlace vuelve a levantarse los nodos no saben qué hacer porque son todos nodos primarios. Esto se llama split brain o cerebros divididos.</p>
<p><span id="more-410"></span></p>
<p>Este tipo de error requiere de nuestra intervención ya que tenemos que decidir en qué nodos vamos a descartar los cambios que se produjeron durante el split brain.</p>
<p>En el nodo primario más joven, donde queremos eliminar los cambios, hacemos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">server2~<span style="color: #666666; font-style: italic;"># drbdadm secondary all</span>
server2~<span style="color: #666666; font-style: italic;"># drbdadm disconnect all</span>
server2~<span style="color: #666666; font-style: italic;"># drbdadm -- --discard-my-data connect all</span></pre></div></div>

<p>Luego, en el nodo primario con los datos correctos, hacemos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">server1~<span style="color: #666666; font-style: italic;"># drbdadm connect all</span></pre></div></div>

<p>Hay que tener mucho cuidado a la hora de hacer esto y si tienen alguna duda les recomiendo hacer un backup. Esto va a evitar que hagan la resincronización en la dirección opuesta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/10/05/como-resolver-un-split-brain-en-drbd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ya está disponible Groovy 1.6.5</title>
		<link>http://www.ipcorp.com.ar/blog/2009/10/05/ya-esta-disponible-groovy-1-6-5/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/10/05/ya-esta-disponible-groovy-1-6-5/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 12:02:24 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=412</guid>
		<description><![CDATA[El equipo de desarrollo de Groovy liberó el viernes pasado la versión 1.6.5 de este magnífico lenguaje que corre sobre la JVM.
Tal como ellos dicen, esta no es una versión con nuevas características de relevancia, sino que es una versión que principalmente integra bug-fixes.
La nueva versión puede ser descargada desde el lugar habitual.
Vía javamexico.org
]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="http://ipcorp.com.ar/blog/wp-content/uploads/2009/10/medium.png" alt="medium" width="203" height="100" />El equipo de desarrollo de <a href="http://groovy.codehaus.org/">Groovy</a> liberó el viernes pasado la versión 1.6.5 de este magnífico lenguaje que corre sobre la JVM.</p>
<p>Tal como ellos dicen, esta no es una versión con nuevas características de relevancia, sino que es una versión que principalmente integra bug-fixes.</p>
<p>La nueva versión puede ser descargada <a href="http://groovy.codehaus.org/Download">desde el lugar habitual</a>.</p>
<p>Vía <a href="http://www.javamexico.org/" target="_blank">javamexico.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/10/05/ya-esta-disponible-groovy-1-6-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cluster de Alta Disponibilidad de Servidores PostgreSQL con DRBD y Heartbeat</title>
		<link>http://www.ipcorp.com.ar/blog/2009/10/01/cluster-de-alta-disponibilidad-de-servidores-postgresql-con-drbd/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/10/01/cluster-de-alta-disponibilidad-de-servidores-postgresql-con-drbd/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 12:58:55 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[alta disponibilidad]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[replicacion]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=353</guid>
		<description><![CDATA[En este post vamos a ver cómo armar un cluster de alta disponibilidad de servidores PostgreSQL, con DRBD y Heartbeat.
Como en IPCorp nos gusta dormir tranquilos toda la solución va a estar soportada por GNU/Linux y en este ejemplo utilizaremos Ubuntu Server 9.04.

Requisitos
Se necesitan dos servidores o máquinas de similares características. En ambas es necesario [...]]]></description>
			<content:encoded><![CDATA[<p>En este post vamos a ver cómo armar un <a title="Cluster de Alta Disponibilidad" href="http://es.wikipedia.org/wiki/Cluster_de_alta_disponibilidad" target="_blank">cluster de alta disponibilidad</a> de servidores <a title="PostgreSQL" href="http://postgresql.org" target="_blank">PostgreSQL</a>, con <a title="DRBD" href="http://en.wikipedia.org/wiki/DRBD" target="_blank">DRBD</a> y <a href="http://www.linux-ha.org/">Heartbeat</a>.</p>
<p>Como en IPCorp nos gusta dormir tranquilos toda la solución va a estar soportada por GNU/Linux y en este ejemplo utilizaremos Ubuntu Server 9.04.</p>
<p><span id="more-353"></span></p>
<h2>Requisitos</h2>
<p>Se necesitan dos servidores o máquinas de similares características. En ambas es necesario tener una partición sin montar y sin formatear para el <strong>DRBD</strong>.</p>
<p>La capacidad de almacenamiento reservado en estas particiones permitirá almacenar como máximo la capacidad de la partición más chica.</p>
<p>Para el propósito de este instructivo denominaremos a los servidores: <strong>server1</strong> y <strong>server2</strong>. Ambos equipos necesitan ser capaces de resolver los <strong>hostnames</strong> entre ellos, así que se debemos tener configurado algún servidor de <strong>DNS</strong> o agregar los nombres de hosts y sus IPs directamente en <em>/etc/hosts</em>. Ambos servidores deberían tener direcciones IP estáticas.</p>
<p>Vamos a suponer que cada servidor tiene un disco de 320Gb de los cuales particionaremos sin LVM, dejando un espacio libre para el volúmen compartido a través de la red. Esto depende del cálculo del tamaño estimado de la base de datos que vamos a replicar.</p>
<table border="0">
<tbody>
<tr>
<th>Hostname</th>
<th>Dirección IP</th>
<th>Partición para DRBD</th>
</tr>
<tr>
<td>server1</td>
<td>10.0.0.2</td>
<td>/dev/sda3</td>
</tr>
<tr>
<td>server2</td>
<td>10.0.0.3</td>
<td>/dev/sda3</td>
</tr>
</tbody>
</table>
<p>Los clientes de la base de datos se comunicarán a la IP Virtual <strong>10.0.0.1</strong>, además vamos a necesitar los siguientes paquetes instalados, necesarios para poder configurar correctamente el servidor:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> hearbeat drbd8-utils build-essential libreadline5-dev zlib1g-dev</pre></div></div>

<h2>Configuración de DRBD</h2>
<p>Primero vamos a guardar una copia del archivo de configuración original:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>drbd.conf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>drbd_backup.conf</pre></div></div>

<p>Editamos el archivo /etc/drbd.conf y reemplazamos su contenido por:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">global <span style="color: #7a0874; font-weight: bold;">&#123;</span>usage-count no;<span style="color: #7a0874; font-weight: bold;">&#125;</span>
common <span style="color: #7a0874; font-weight: bold;">&#123;</span> syncer <span style="color: #7a0874; font-weight: bold;">&#123;</span>rate 100M;<span style="color: #7a0874; font-weight: bold;">&#125;</span> <span style="color: #7a0874; font-weight: bold;">&#125;</span>
resource pg <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        protocol C;
        startup <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                wfc-timeout <span style="color: #000000;">15</span>;
                degr-wfc-timeout <span style="color: #000000;">60</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
        on server1 <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                device <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>drbd0;
                disk <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda3;
                address 10.0.0.2:<span style="color: #000000;">7788</span>;
                meta-disk internal;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
        on server2 <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                device <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>drbd0;
                disk <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda3;
                address 10.0.0.3:<span style="color: #000000;">7788</span>;
                meta-disk internal;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Ahora copiamos este archivo en el servidor secundario e iniciamos el servicio en ambas máquinas. Posteriormente creamos el recurso compartido en ambas máquinas:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>drbd start
<span style="color: #c20cb9; font-weight: bold;">sudo</span> drbdadm create-md pg</pre></div></div>

<p>Dónde <em>&#8220;pg&#8221;</em> es el mismo nombre que le pusimos al tag <em>&#8220;resource&#8221;</em> en el archivo de configuración del <em>&#8220;drbd&#8221;</em>.</p>
<p>Ahora es necesario establecer el nodo primario del cluster. Para este ejemplo elegimos el server1 por lo que en ésta máquina ejecutamos el siguiente comando y luego damos formato a la partición compartida:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> drbdadm <span style="color: #660033;">--</span> <span style="color: #660033;">--overwrite-data-of-peer</span> primary all
<span style="color: #c20cb9; font-weight: bold;">sudo</span> mke2fs <span style="color: #660033;">-j</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>drbd0</pre></div></div>

<p>Con el siguiente comando podemos ver el estado actual de la sincronización de los recursos del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>drbd</pre></div></div>

<p>Si todo salió bien, vamos a ver algo parecido a esto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">version: 8.3.0 <span style="color: #7a0874; font-weight: bold;">&#40;</span>api:<span style="color: #000000;">88</span><span style="color: #000000; font-weight: bold;">/</span>proto:<span style="color: #000000;">86</span>-<span style="color: #000000;">89</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by ivoks<span style="color: #000000; font-weight: bold;">@</span>ubuntu, <span style="color: #000000;">2009</span>-01-<span style="color: #000000;">17</span> 07:<span style="color: #000000;">49</span>:<span style="color: #000000;">56</span>
<span style="color: #000000;">0</span>: cs:Connected ro:Primary<span style="color: #000000; font-weight: bold;">/</span>Secondary ds:UpToDate<span style="color: #000000; font-weight: bold;">/</span>UpToDate C r---
    ns:<span style="color: #000000;">82020</span> nr:<span style="color: #000000;">1188</span> dw:<span style="color: #000000;">82916</span> dr:<span style="color: #000000;">5438</span> al:<span style="color: #000000;">27</span> bm:<span style="color: #000000;">18</span> lo:<span style="color: #000000;">0</span> pe:<span style="color: #000000;">0</span> ua:<span style="color: #000000;">0</span> ap:<span style="color: #000000;">0</span> ep:<span style="color: #000000;">1</span> wo:b oos:<span style="color: #000000;">0</span></pre></div></div>

<h2>Instalación de la base de datos PostgreSQL</h2>
<p>La instalación de PostgreSQL será a través de la compilación del código fuente porque debemos hacer algunas modificaciones al programa <strong>pg_ctl</strong> para que todo funcione correctamente.</p>
<p>Luego de bajar los fuentes del PostgreSQL descomprimimos, y modificamos el código de la aplicación <strong>pg_ctl</strong>, más precisamente buscamos la leyenda <strong>“no server runnig”</strong> dentro del código y reemplazamos la palabra <strong>&#8220;runnig&#8221;</strong> por cualquier otra.</p>
<p>Esto tiene una explicación y es que Heartbeat verifica si un servicio está corriendo o no buscando la cadena &#8220;running&#8221; u &#8220;ok&#8221; al pedir su status, entonces cuando heartbeat le pregunta a PostgreSQL si está ejecutándose correctamente él responde &#8220;no server running&#8221; y heartbeat supone que todo está bien aunque realmente no sea así.</p>
<p>El archivo fuente de esta aplicación esta en <strong>postgresql-8.X.XX/src/bin/pg_ctl/</strong> y se llama <strong>pg_ctl.c</strong>.</p>
<p>Un vez hecho este pequeño parche sólo nos falta compilarlo e instalarlo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> postgresql-8.X.XX
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Siguiendo el procedimiento regular de instalación, el próximo paso necesario es crear el usuario <strong>postgres</strong>. Agregamos la ruta <strong>/usr/local/pgsql/bin</strong> al path del sistema, y debemos crear la carpeta donde se van a alojar los datos y darle los permisos de esa carpeta al usuario postgres:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">adduser postgres</pre></div></div>

<p>Todos los pasos anteriores debemos hacerlo en ambos nodos, los que siguen sólo en el nodo principal:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span>data
<span style="color: #c20cb9; font-weight: bold;">chown</span> postgres.postgres <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span>data</pre></div></div>

<p>La ruta &#8220;/opt/postgresql/data&#8221; es el lugar donde quiero alojar los datos y queda a criterio de cada uno. Para inicializar la base de datos es necesario estar logueado como el usuario postgres y hacer:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">initdb <span style="color: #660033;">-D</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span>data</pre></div></div>

<h2>Configuración de Heartbeat</h2>
<p>En el nodo primario copiamos los archivos de configuración de ejemplo o simplemente creamos archivos nuevos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>doc<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>authkeys <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>doc<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>ha.cf.gz <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>doc<span style="color: #000000; font-weight: bold;">/</span>heartbeat<span style="color: #000000; font-weight: bold;">/</span>haresources.gz <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #660033;">-d</span> ha.cf.gz
<span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #660033;">-d</span> haresources.gz</pre></div></div>

<p>Editamos el archivo <strong>authkeys</strong> y ponemos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auth <span style="color: #000000;">2</span>
<span style="color: #000000;">2</span> sha1 mipasswordsecreta</pre></div></div>

<p><strong>“mipasswordsecreta”</strong> es la password para que los nodos se puedan comunicar con cierto nivel de seguridad. Ahora es necesario darle permisos sólo a root por cuestiones de seguridad:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">600</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>authkeys</pre></div></div>

<p>y en el archivo <strong>ha.cf</strong> comentamos todo y agregamos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">logfile <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>ha-log
logfacility local0
keepalive <span style="color: #000000;">2</span> <span style="color: #666666; font-style: italic;">#cada cuanto segundos verifica que este vivo</span>
deadtime <span style="color: #000000;">30</span> <span style="color: #666666; font-style: italic;">#cuantos segundos espera hasta que lo considera muerto</span>
initdead <span style="color: #000000;">120</span> <span style="color: #666666; font-style: italic;"># este valor es para cuando no bootean los dos juntos, en ese caso espera 120 segundos para empezar el proceso</span>
bcast eth0 <span style="color: #666666; font-style: italic;"># placa de red por la que verifica el estado de los otros nodos</span>
udpport <span style="color: #000000;">694</span> <span style="color: #666666; font-style: italic;"># puerto UDP por el que se va a enviar el latido</span>
auto_failback on
node server1 <span style="color: #666666; font-style: italic;"># nodo que participa</span>
node server2 <span style="color: #666666; font-style: italic;"># nodo que participa</span></pre></div></div>

<p>y por último debemos modificar el archivo <strong>haresources.</strong> Ahí declaramos los servicios que queremos monitorear y que deben estar siempre disponibles. El equipo <strong>server1</strong> es el servidor principal y los otros van a verificar que no caiga. En cuanto caiga una máquina, la otra tomará el control levantando los servicios monitoreados y tomando la IP Virtual. Dentro de <strong>haresources</strong> ingresamos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">server1 IPaddr::10.0.0.1 drbddisk::pg Filesystem::<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>drbd0::<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>postgresql::ext3::defaults postgresql</pre></div></div>

<p>Les voy a explicar que significa cada parte de este archivo. En primer lugar definimos cuál va a ser el nodo principal en este caso <em>server1</em>. IPaddr::10.0.0.1 es el script que asigna la IP virtual que tendrá el cluster y el cual será el punto de acceso, con  <em>drbddisk::pg</em> le decimos que recurso DRBD queremos brindar, luego con <em>Filesystem::/dev/drbd0::/opt/postgresql::ext3::defaults</em> montamos el dispositivo virtual <em>drbd0</em> en la carpeta /<em>opt/postgresql</em> y por último decimos que arranque <em>postgresql</em>.</p>
<p>En indispensable copiar el archivo de arranque de PostgreSQL a <strong>/etc/ha.d/resources.d</strong> y modificar la variable de entorno PGDATA para que apunte a la carpeta <strong>/opt/postgresql/data</strong> que es el lugar donde van a residir las bases de datos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> postgresql-8.x.xx<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>start-scripts<span style="color: #000000; font-weight: bold;">/</span>linux <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>resources.d<span style="color: #000000; font-weight: bold;">/</span>postgresql
<span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>resources.d<span style="color: #000000; font-weight: bold;">/</span>postgresql</pre></div></div>

<p>Luego copiamos los archivos de configuración a todos los nodos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">scp</span> <span style="color: #660033;">-r</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span> root<span style="color: #000000; font-weight: bold;">@</span>server2:<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Ahora es cuestión de levantar los servicios en todos los nodos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>heartbeat start</pre></div></div>

<h2>Comprobación</h2>
<p>Ya estamos en condiciones de levantar el motor de base de datos mediante la siguiente sentencia:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ha.d<span style="color: #000000; font-weight: bold;">/</span>resources.d<span style="color: #000000; font-weight: bold;">/</span>postgresql start</pre></div></div>

<p>Y sólo resta crear la base de datos y restaurar desde un backup anterior o empezar a crear las tablas, índices, vistas, etc., desde cero.</p>
<p>Luego para probar que se estén replicando correctamente los datos, en el nodo secundario ejecutamos el comando “watch cat /proc/drbd” mientras que en el nodo principal bajamos el servicio de hearbeat. Antes de bajar el servicio en el nodo secundario deberíamos tener la siguiente salida:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">version: 8.3.0 <span style="color: #7a0874; font-weight: bold;">&#40;</span>api:<span style="color: #000000;">88</span><span style="color: #000000; font-weight: bold;">/</span>proto:<span style="color: #000000;">86</span>-<span style="color: #000000;">89</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by ivoks<span style="color: #000000; font-weight: bold;">@</span>ubuntu, <span style="color: #000000;">2009</span>-01-<span style="color: #000000;">17</span> 07:<span style="color: #000000;">49</span>:<span style="color: #000000;">56</span>
<span style="color: #000000;">0</span>: cs:Connected ro:Secondary<span style="color: #000000; font-weight: bold;">/</span>Primary ds:UpToDate<span style="color: #000000; font-weight: bold;">/</span>UpToDate C r---
    ns:<span style="color: #000000;">1188</span> nr:<span style="color: #000000;">82020</span> dw:<span style="color: #000000;">83208</span> dr:<span style="color: #000000;">3313</span> al:<span style="color: #000000;">15</span> bm:<span style="color: #000000;">17</span> lo:<span style="color: #000000;">0</span> pe:<span style="color: #000000;">0</span> ua:<span style="color: #000000;">0</span> ap:<span style="color: #000000;">0</span> ep:<span style="color: #000000;">1</span> wo:b oos:<span style="color: #000000;">0</span></pre></div></div>

<p>Luego bajamos a heartbeat:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>hearbeat stop</pre></div></div>

<p>Y deberíamos ver lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">version: 8.3.0 <span style="color: #7a0874; font-weight: bold;">&#40;</span>api:<span style="color: #000000;">88</span><span style="color: #000000; font-weight: bold;">/</span>proto:<span style="color: #000000;">86</span>-<span style="color: #000000;">89</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by ivoks<span style="color: #000000; font-weight: bold;">@</span>ubuntu, <span style="color: #000000;">2009</span>-01-<span style="color: #000000;">17</span> 07:<span style="color: #000000;">49</span>:<span style="color: #000000;">56</span>
<span style="color: #000000;">0</span>: cs:Connected ro:Primary<span style="color: #000000; font-weight: bold;">/</span>Secondary ds:UpToDate<span style="color: #000000; font-weight: bold;">/</span>UpToDate C r---
    ns:<span style="color: #000000;">1328</span> nr:<span style="color: #000000;">82280</span> dw:<span style="color: #000000;">83608</span> dr:<span style="color: #000000;">3542</span> al:<span style="color: #000000;">15</span> bm:<span style="color: #000000;">17</span> lo:<span style="color: #000000;">0</span> pe:<span style="color: #000000;">0</span> ua:<span style="color: #000000;">0</span> ap:<span style="color: #000000;">0</span> ep:<span style="color: #000000;">1</span> wo:b oos:<span style="color: #000000;">0</span></pre></div></div>

<p>El agregado de nuevos nodos al cluster diría que es casi trivial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/10/01/cluster-de-alta-disponibilidad-de-servidores-postgresql-con-drbd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mejorando la performance de PostgreSQL con índices parciales</title>
		<link>http://www.ipcorp.com.ar/blog/2009/09/28/mejorando-la-performance-de-postgresql-con-indices-parciales/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/09/28/mejorando-la-performance-de-postgresql-con-indices-parciales/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 11:31:04 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[indexes]]></category>
		<category><![CDATA[índices]]></category>
		<category><![CDATA[indices parciales]]></category>
		<category><![CDATA[partial indexes]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=289</guid>
		<description><![CDATA[Una característica poco conocida pero muy útil de PostgreSQL es la posibilidad de crear índices parciales, la mayor motivación de estos índices es evitar indexar valores comunes, esto reduce su tamaño lo cual acelerará las búsquedas que usen el índice. También acelerará muchas operaciones de actualización porque el índice no necesita ser actualizado en todos los casos.


Tomemos un [...]]]></description>
			<content:encoded><![CDATA[<p><span style="background-color: #ffffff">Una característica poco conocida pero muy útil de <a href="http://postgresql.org" target="_blank">PostgreSQL</a> es la posibilidad de crear <strong>índices parciales</strong>, la mayor motivación de estos índices es evitar indexar valores comunes, esto reduce su tamaño lo cual acelerará las búsquedas que usen el índice. También acelerará muchas operaciones de actualización porque el índice no necesita ser actualizado en todos los casos.<br />
</span></p>
<p><span id="more-289"></span></p>
<p>Tomemos un ejemplo simplificado de la vida real, supongamos que tenemos una tabla de afiliados de una obra social. En esta tabla tenemos a los titulares y a los familiares de los titulares, los cuales acceden a los mismos servicios que los titulares. Si suponemos que cada titular tiene en promedio 2 o 3 familiares asociados y si nuestras búsquedas se realizan principalmente sobre los titulares, probablemente no necesitemos indexar a los familiares.</p>
<p>Asumimos que tenemos la siguiente tabla:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> afiliados <span style="color: #66cc66;">&#40;</span>
    id SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
    nombre VARCHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    tipo_afiliado VARCHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    monto_cuota REAL<span style="color: #66cc66;">,</span>
    monto_deuda REAL<span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">.....</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Siguiendo con el ejemplo para crear un índice solo para los afiliados titulares, usamos la siguientes sentencia</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> idx_afiliados_titulares
<span style="color: #993333; font-weight: bold;">ON</span> afiliados<span style="color: #66cc66;">&#40;</span>tipo_afiliado<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> tipo_afiliado <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Titular'</span>;</pre></div></div>

<p>Una típica consulta que utilizará este índice es:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> nombre <span style="color: #993333; font-weight: bold;">FROM</span> afiliados <span style="color: #993333; font-weight: bold;">WHERE</span> tipo_afiliado <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Titular'</span>;</pre></div></div>

<p>Ahora veamos otro ejemplo, si habitualmente consultamos aquellos afiliados que pagan una cuota superior a $50 para brindarle promociones o precios diferenciales podemos crear el siguiente índice parcial:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> idx_afiliados_buenos_afiliados
<span style="color: #993333; font-weight: bold;">ON</span> afiliados<span style="color: #66cc66;">&#40;</span>monto_couta<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> monto_couta &amp;gt;<span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">50</span>;</pre></div></div>

<p>La siguiente es una consulta que utilizará el índice parcial:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> nombre <span style="color: #993333; font-weight: bold;">FROM</span> afiliados <span style="color: #993333; font-weight: bold;">WHERE</span> monto_cuota <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">55</span>;</pre></div></div>

<p>Para más información y ejemplos podemos ver la <a href="http://www.postgresql.org/docs/8.0/static/indexes-partial.html" target="_blank">documentación oficial de PostgreSQL</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/09/28/mejorando-la-performance-de-postgresql-con-indices-parciales/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tip #1: exportar rápidamente las consultas en MySQL</title>
		<link>http://www.ipcorp.com.ar/blog/2009/09/24/tip-1-exportar-rapidamente-las-consultas-en-mysql/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/09/24/tip-1-exportar-rapidamente-las-consultas-en-mysql/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 16:14:27 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[exportar]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=254</guid>
		<description><![CDATA[El motor de base de datos MySQL tiene incorporado de manera nativa un opción para volcar los datos de una consulta a un archivo, esto se puede hacer mediante la directiva &#8220;SELECT &#8230; INTO OUTFILE&#8221;, sin embargo esta manera tiene una desventaja importante y es que guarda el archivo de salida en el servidor debiendo [...]]]></description>
			<content:encoded><![CDATA[<p>El motor de base de datos <a href="http://www.mysql.com">MySQL</a> tiene incorporado de manera nativa un opción para volcar los datos de una consulta a un archivo, esto se puede hacer mediante la directiva <strong><em>&#8220;SELECT &#8230; INTO OUTFILE&#8221;</em></strong>, sin embargo esta manera tiene una desventaja importante y es que guarda el archivo de salida en el servidor debiendo tener los permisos necesarios en el server como para poder realizar la operación, la otra desventaja es que no podemos hacerlo conectados desde un cliente.<br />
Una manera rápida resolver es usar la opción <strong>&#8220;-e&#8221;</strong> del cliente de consulta de mysql.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ mysql <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;SELECT * FROM clientes ORDER BY dni&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> clientes.txt</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/09/24/tip-1-exportar-rapidamente-las-consultas-en-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Bases de Datos Microsoft Access en Linux</title>
		<link>http://www.ipcorp.com.ar/blog/2009/09/21/usando-bases-de-datos-microsoft-access-en-linux/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/09/21/usando-bases-de-datos-microsoft-access-en-linux/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 00:37:20 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[jet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mdb tools]]></category>
		<category><![CDATA[mdbtools]]></category>
		<category><![CDATA[ms access]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://ipcorp.com.ar/blog/?p=234</guid>
		<description><![CDATA[
Existen en la actualidad una amplia gama de sistemas legacy que utilizan MS Access como repositorio de datos, si bien hay un sinnúmero de razones por las cuales se desaconseja utilizar MS Access como aplicación de base de datos, es cierto que hay que tener en cuenta que MS Access fué diseñado a medidados de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-246 alignright" src="http://ipcorp.com.ar/blog/wp-content/uploads/2009/09/microsoft_access_2002-235x300.jpg" alt="microsoft_access_2002" width="132" height="168" /><br />
Existen en la actualidad una amplia gama de sistemas <em>legacy</em> que utilizan <a href="http://es.wikipedia.org/wiki/Microsoft_Access" target="_blank">MS Access</a> como repositorio de datos, si bien hay un sinnúmero de razones por las cuales se desaconseja utilizar MS Access como aplicación de base de datos, es cierto que hay que tener en cuenta que MS Access fué diseñado a medidados de los 90 para hardware i386 y que todavía existe muchas aplicaciones bien escritas que todavía lo utilizan.</p>
<p>Hoy les voy a presentar un conjunto de herramientas y librerías que permiten la  interacción con bases de datos MS Access desde Linux, estas herramientas están agrupadas dentro del proyecto <a href="http://mdbtools.sourceforge.net/" target="_blank">MDB Tools</a>.</p>
<h2>Requisitos</h2>
<p>Para este pequeño tutorial vamos a utilizar un base de datos de ejemplo: <a href="http://office.microsoft.com/en-us/templates/TC010186291033.aspx?CategoryID=CT102144001033" target="_blank">Music Collection Database</a> disponible para descargarse en el sitio de Microsoft, este archivo viene en formato <em>.cab</em> así que vamos a instalar una aplicación para poder descomprimirlo.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> cabextract
cabextract 01018629.cab</pre></div></div>

<p>Luego instalamos el paquete <strong>mdbtools</strong>, el cual consta también con una herramienta gráfica lo suficientemente amigable como para que no necesite un post dedicado a la GUI, para este ejemplo nos vamos a centrar en las herramientas de líneas de comando, primero instalamos <strong>mdbtools</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> mdbtools</pre></div></div>

<h2>Visualizar las tablas de una base de datos</h2>
<p>Para listar todas las tablas de una base de datos utilizamos el comando <strong>mbd-tables</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mdb-tables 01018629.mdb
Music Categories Recording Artists Recordings Switchboard Items Tracks</pre></div></div>

<p>Es una práctica común cuando se diseñan bases de datos en MS Access es la utilización de nombres de tablas con espacios intermedios, <strong>mdb-tables</strong> nos permite determinar un separador al listar las tablas para ver bien los nombres de las tablas:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&gt;</span>mdb-tables <span style="color: #660033;">-d</span> <span style="color: #ff0000;">'|'</span> 01018629.mdb
Music Categories<span style="color: #000000; font-weight: bold;">|</span>Recording Artists<span style="color: #000000; font-weight: bold;">|</span>Recordings<span style="color: #000000; font-weight: bold;">|</span>Switchboard Items<span style="color: #000000; font-weight: bold;">|</span>Tracks<span style="color: #000000; font-weight: bold;">|</span></pre></div></div>

<h2>Obteniendo el DDL de la base de datos</h2>
<p>Para obtener el <a href="http://es.wikipedia.org/wiki/Lenguaje_de_definición_de_datos" target="_blank">DDL (Data Definition Language)</a> de una tabla o de toda la base de datos podemos utilizar <strong>mdb-schema</strong>, esto será de suma utilidad si queremos migrar la base de datos a otro entorno como <a href="http://www.mysql.com" target="_blank">MySQL</a> o <a href="http://postgresql.org">PostgreSQL</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mdb-schema <span style="color: #660033;">-T</span> <span style="color: #ff0000;">'Recording Artists'</span> 01018629.mdb
DROP TABLE Recording Artists;
CREATE TABLE Recording Artists
<span style="color: #7a0874; font-weight: bold;">&#40;</span>
RecordingArtistID	 Long Integer,
RecordingArtistName	 Text <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">100</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>,
Photograph	 OLE <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">255</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>,
Birthdate	 DateTime <span style="color: #7a0874; font-weight: bold;">&#40;</span>Short<span style="color: #7a0874; font-weight: bold;">&#41;</span>,
Birthplace	 Text <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">100</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>,
DateofDeath	 DateTime <span style="color: #7a0874; font-weight: bold;">&#40;</span>Short<span style="color: #7a0874; font-weight: bold;">&#41;</span>,
Notes	 Memo<span style="color: #000000; font-weight: bold;">/</span>Hyperlink <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">255</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre></div></div>

<h2>Exportando los datos</h2>
<p><strong>mbd-export</strong> nos sirve para exportar a formato <a href="http://es.wikipedia.org/wiki/CSV" target="_blank">CSV</a> los datos de una tabla:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mdb-export 01018629.mdb <span style="color: #ff0000;">'Recording Artists'</span>
RecordingArtistID,RecordingArtistName,Photograph,Birthdate,Birthplace,DateofDeath,Notes
<span style="color: #000000;">1</span>,<span style="color: #ff0000;">&quot;Karen Archer&quot;</span>,,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;Greenville, SC&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #000000;">2</span>,<span style="color: #ff0000;">&quot;Deborah Poe&quot;</span>,,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;New Orleans, LA&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #000000;">3</span>,<span style="color: #ff0000;">&quot;George Jiang&quot;</span>,,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;Traveler's Rest, SC&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #000000;">4</span>,<span style="color: #ff0000;">&quot;Stefan Delmarco&quot;</span>,,<span style="color: #ff0000;">&quot;03/15/65 00:00:00&quot;</span>,<span style="color: #ff0000;">&quot;Ann Arbor, MI&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span></pre></div></div>

<p>Si ejecutamos <strong>mbd-export</strong> sin parámetros podemos ver más opciones de exportación.</p>
<h2>Seleccionando y manipulando datos de la base de datos</h2>
<p>Si lo que necesitamos es filtrar datos de la base de datos con <strong>mdb-sql</strong> podremos realizar consultas en SQL a la base de datos de manera dinámica a través de una consola. La consulta luego de ingresar la sentencia <strong>GO</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mdb-sql 01018629.mdb
<span style="color: #000000;">1</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">select</span> RecordingArtistName from <span style="color: #ff0000;">&quot;Recording Artists&quot;</span> where Birthplace like <span style="color: #ff0000;">'New%'</span>
<span style="color: #000000;">2</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> go
+----------------------------------+
<span style="color: #000000; font-weight: bold;">|</span>RecordingArtistName              <span style="color: #000000; font-weight: bold;">|</span>
+----------------------------------+
<span style="color: #000000; font-weight: bold;">|</span>Deborah Poe                       <span style="color: #000000; font-weight: bold;">|</span>
+----------------------------------+
<span style="color: #000000;">1</span> Row retrieved
<span style="color: #000000;">1</span> =<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/09/21/usando-bases-de-datos-microsoft-access-en-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

