lunes, 25 de febrero de 2013

Generar una tabla con números aleatorios #Postgresql

Generar una tabla con números aleatorios #Postgresql

Para generar una tabla con números aleatorios Postgresql, se puede hacer lo siguiente:

select id,random()*10000 as venta 
from (
    select * from generate_series(1,100) as id
) as x

jueves, 21 de febrero de 2013

Recuperar LVM sin Backup

Lo primero es hacer un auto-te lo dije, esto porque siempre he tenido pendiente que se debe respaldar la configuración del (los) volúmenes lógicos, pero usando como excusa una cosa y otra no lo hice; para hacer el cuento corto, me pasó.

Tenía un equipo Virtualizador con un raid1 y sobre este raid un LVM, uno de los discos comenzó a fallar pero como estaban en raid, estaba tranquilo, así que me dispuse a detener el disco y en ese momento todo fue cuesta a bajo, pues bien, cuando detuve el disco para sacarlo, el equipo se congeló (probablemente el disco estaba en corto, la verdad no lo sé)

Procedí a sacar el disco y reiniciar y mi sorpresa es que el equipo virtualizador no iniciaba, no me preocupé aún este punto, solo metí mi CD de debian, arranque en modo experto monte el raid, y un grub-install resolvió.

Reinicié el equipo y todo normal, a excepción de que una de las maquinas virtuales no arrancaba, por lo que me metí por vnc para ver que sucedía (en este punto es válido informar que a mi maquinas virtuales no les creo los discos usando archivos sino les entrego volúmenes LVM) mi sorpresa es que me dice que no encuentra los volúmenes lógicos para arrancar.

Respiro profundo y en la consola de initramfs hago un:

lvm
pvscan

Y me dice que encuentra el volumen pero que la metadata es inválida me comencé a preocupar.

Hago:

vgscan

Y me dice que no hay volúmenes lógicos definidos. Oficialmente preocupado.

Ya con esto comienzo a buscar en Internet y no encontré al menos de momento nada que me ayudara directamente. Salvo que personas con casos similares a los míos resolvieron volcando los primeros bits de la partición y de aquí sacaron el archivo de backup de lvm

Eso no funcionó para mi, pero si me orientó en el camino, ya que en esa página se asegura que el archivo de configuración se guarda al principio d ela partición, pero pensé que no necesariamente era mi caso, dado a que la partición la entrego desde el virtualizador en LVM y el a su vez esta partición la trabaja y la convierte a LVM. Tal véz el Journaling del virtualizador hizo su trabajo (solo especulo).

Así que hice lo siguiente:

  1. Cree un nuevo volúmen lógico en el virtualizador un tanto más grande que el volumen que deseaba restaurar y le dí formato ext2
  2. Le entregué este nuevo "disco" a la maquina virtual.
  3. Inicie la maquina virtual y esperé que saliera el initramfs
  4. Monte la partición en /target
  5. Hice un volcado completo del disco (en mi caso /dev/sda5 donde estaba creado el volumen en la maquina virtual) a un archivo (lo llame salida) en mi nuevo disco:

    dd if=/dev/sda5 of=salida.txt

  6. Apagué la maquina virtual y monté el disco en el virtualizador.

  7. Busqué en el archivo "salida.txt" la cadena "logical_volumes" y me hice una idea en que parte estaba las líneas que necesitaba (realmente en este punto fue suerte porque nunca había modificado el sistema de archivos y solo había una copia)

    grep -a -n -i logical_volumes salida.txt

  8. Con sed estraje ±100 líneas.

    sed -n -e '201200,201300p' -e '201300q' > tmp.txt

  9. En el nuevo archivo, con vim busque la cadena "#Generated" y al encontrarlo encontré la configuración, esta la pegue en un nuevo archivo llamado backup.conf

  10. Desmonté mi disco en el virtualizador e inicie la maquina virtual hasta que cayera de nuevo en el initramfs.
  11. Ahora mi nuevo problema, la metadata sigue mala. Por lo que cambié el uuid para que reparara la metadata

    pvchange -u /dev/sad5

  12. Al ejecutar vgcfgrestore me daba error (lógico, el uuid del pv no coincida con el uuid del sda5).

  13. Hice un pvdisplay y tome nota del nuevo uuid.
  14. Apague nuevamente mi maquina virtual monté el disco en el virtualizador, edité el archivo, cambio el uuid del pv0 para que cocindiera con el uuid de la maquina.
  15. Desmonté e inicie de nuevo la maquina virtual hasta el initramfs.
  16. Ejecute vgcfgrestore y funcionó.

    vgcfgrestore -vvv -f /target/backup.conf

  17. Reinicié la maquina virtual y arrancó sin problemas.

Mientras redacto este articulo me doy cuenta que los comandos sed y grep los pude haber ejecutado directamente sobre /dev/sda5, y de esta forma ahorrarme el volcado del disco, en fin, son cosas que se piensan luego con calma, si alguien lo puede probar.

Moraleja. Siempre sacar el archivo backup de la partición lvm y si es posible sacarlo del equipo.

Hay usuarios que cuando colocan en LVM toda la instalación de su distro, cambian la ubicación de los backups de los LVM para que lo haga en la partición sin LVM de arranque /boot esto es una alternativa. Ya que ante algún problema la partición se puede montar tranquilamente como un sistema de archivo.

jueves, 14 de febrero de 2013

Consultar estado de tablas de una base de datos #postgresql #Tips #Trucos

No voy a entrar en el tema de si es un error de aplicación de base de datos, solo digamos que por algún motivo tienes un abrazo mortal o bloqueo mutuo en una base de datos, y es necesario ver quienes son los interlocutores (probablemente te des cuenta porque al menos uno de ellos te va a llamar) que intervienen en dicho abrazo mortal.

miércoles, 13 de febrero de 2013

Cambiar TABLESPACE en #postgresql

Cambiar el TABLESPACE en postgresql

Luego de optimizar un poco mi servidor de base de datos siguiendo el articulo de phenobarbital, me encontré en la situación de como cambiar mi base de datos ya existente para que utilizara el nuevo TABLESPACE definido en otra partición del disco.
Buscando en Internet, vi usuarios que aplicaron complejos scripts en PHP y demás. realmente no me convencían mucho, pero es una alternativa, así que pensé en hacerlo de otra manera