Actulizacion de base de datos mediante script

Forums: 

Se tiene una base de datos en produccion con Postgres.

Se realizaron cambios a la base de datos y se desea crear un "instalador" que se encargue de actulizar la base de datos existente.

Normalmente se realizaba la actilizacion de la base de datos ejecutando un por uno los Scripts .SQL que la actulizan. Esto se convirtio un proceso engorroso y que hace perder mucho tiempo.

Super la base de datos se llama ==> "DB_ECUALUG" Y se desea correr 30 scripts que actualizan dicha base de datos. Los scritps tienen el siguiente nombre ==> 1.parche.sql, 2.parche.sql, 3.parche.sql, ...

Los scripts se correr de la siguiente manera

psql -d DB_ECUALUG -f 1.parche.sql -o O_1.parche.sql.TXT > E_1.parche.sql.TXT 2>&1

Tendria la siguiente opcion
Crear un .sh que corra uno por uno y leea, pero Mire la si los archivos de salida E_ y verique que no tenga errores y si los tiene que detenga el script.

El tema es que no soy muy bueno en bash, entonces me gustaria recibir sugerencias ?

Primera sugerencia; trata de

Imagen de deathUser

Primera sugerencia; trata de escribir las cosas de una manera que se puedan entender:
[quote]que corra uno por uno y leea, pero Mire la si los archivos de salida E_ [/quote]

Mire la que ...???

Segunda sugerencia; para mirar en los archivos de salida, puedes usar grep, buscando algún patrón y actuar dependiendo del resultado de la búsqueda ...

Si das más detalles, quizás te puedan ayudar mejor ...

bye
;)

GRacias por la respuesta. La

GRacias por la respuesta.

La siguiente linea


psql -d DB_ECUALUG -f 1.parche.sql -o O_1.parche.sql.TXT > E_1.parche.sql.TXT 2>&1

Genera un archivo de nombre E_1.parche.sql Si al ejecutar el script se tienen errores se guardan en dicho archivo.

Si con grep me parece bien.

Bien tratare de explicarme mejor.

Ya existe una base de datos. Esa base de datos tuvo unos nuevos diseños en tablas y relaciones etc. Esos diseños estan en unos script .SQL los cuales son 30 script.

Se desea realizar una especie de "INSTALADOR o ACTULIZADOR" tanto para el sitio en PHP como para la base de datos. Para el sitio en PHP ya lo hice, ahora me falta el ACTUALIZAR para la base de datos. La idea es que sea lo mas automatico posible para que el CLIENTE no tenga inconvenientes.

Se tiene pensado que cuando lance un script .SH actualice el sitio en PHP y tambien actualice la base de datos. La idea es que el actualizador copie los 30 scritps SQL dentro de la carpeta /usr/local/pgsql y empiece a ejecutar UNO por UNO y su respectivo orden pero, al terminar de correr un script se produjeron errores detenga la ejecucion de la actulizacion de la base de datos.

Realmente pienso que es sencillo, y me he hecho muy extenso en el mensaje.

Gracias

Pues se ve sencillo ... cp de

Imagen de deathUser

Pues se ve sencillo ...

cp de los archivos al lugar de destino
luego ejecutas cada script (puede ser en un for si es que los chequeos son los mismos)
luego si en los archivos van solo errores podrías usar wc para contar el número de líneas y si es mayor que cero, pues reportas el error algo como:


LINEAS_ERROR=`wc -l E_xxxxx`
if [ $LINEAS_ERROR -gt 0 ]; then
echo "Reportar error ;)";
exit 1;
fi

Algo así, muy a groso modo ...

Suerte ...

bye
;)

Bueno para ejecutar cada uno

Bueno para ejecutar cada uno de los 24 archivos SQL. Los nombre con una expresion regular

1_parche.sql 2_parche.sql 3_parche.sql ...etc

El siguiente script funciona, y ejecuta cada uno de los 24 archivos SQL y genera por cada uno dos archivos, es decir para el archivo 1.parche.sql genera ---> O_1_parche.sql.TXT > E_1_parche.sql.TXT


#!/bin/bash
i=1

Parche=_parche.sql

while [ $i -le 24 ]; do
echo "Ejecutando" $i$Parche
echo "ESPERE UN MOMENTO POR FAVOR"
psql -d DB_ECUALUG -f $i$Parche -o O_$i$Parche.TXT > E_$i$Parche.TXT 2>&1
let i=i+1
done

echo "Fin de la actulizacion"

Lo que mas me interesan son los archivos que inician en E. Entonces para analizarlos utilizo el siguiente script, basado en lo que sugirio deathUser


#!/bin/sh
i=1
Parche=_parche.sql
while [ $i -le 24 ]; do
LINEAS_ERROR=$(wc -l E_$i$Parche.TXT 2>&1)
if [ $LINEAS_ERROR -gt 0 ]; then
echo "Reportar error ;)";
exit 1;
fi
let i=i+1
done

Pero me sale el siguiente error -->repotar.sh: line 7: [: too many arguments

Y probe el comando desde la consola


wc -l E_18_parche.sql.TXT

y retorna 2 E_18_parche.sql.TXT

Gracias

Prueba

Imagen de deathUser

Prueba con:


#!/bin/sh
i=1
Parche=_parche.sql
while [ $i -le 24 ]; do
LINEAS_ERROR=$(wc -l E_$i$Parche.TXT | awk '{print $1}' 2>&1)
if [ $LINEAS_ERROR -gt 0 ]; then
echo 'Reportar error ;)';
exit 1;
fi
let i=i+1
done

Ojo en los cambios en el seteo de LINEAS_ERROR.

bye
;)

Hmm, se me olvido mencionar

Hmm, se me olvido mencionar algo, ya el script funciona pero haciendo la siguiente modificacion


LINEAS_ERROR=$(wc -l E_$i$Parche.TXT | awk '{print $1}' 2>&1)

La modificacion esta en el simbolo {

Bueno el tema es que los archivos no estan vacios, es decir en los E_1_parche.sql.TXT por ejemplo tiene la siguiente linea adentro

psql:1_parche.sql:9: NOTICE: CREATE TABLE will create implicit sequence

Luego esto lo esta tomando como error, cuando no lo es. El tema segun parece debe ser con GREP pero NO se como usarlo.

Digamos que cuando haya un

Imagen de deathUser

Digamos que cuando haya un error, la palabra "ERROR" aparecerá en el archivo, así que haría algo como:


LINEAS_ERROR=$(grep -i "error" E_$i$Parche.TXT | wc -l 2>&1)

Con eso debería funcionar, si tienes una expresión más compleja, podrías probar con egrep o fgrep.

bye
;)