El problema con FIFO es que cuando termina cada proceso que está ingresando datos, señala los procesos que están leyendo (en este caso mysql
) que es el final de los datos, por lo que termina.
El truco es asegurarse de que haya un proceso que mantenga viva la entrada FIFO en todo momento. Puede hacerlo ejecutando un sleep 999999999 > fifofile
en segundo plano.
Ejemplo:
#!/bin/sh
mkfifo /tmp/sqlpipe
sleep 2147483647 > /tmp/sqlpipe &
PID=$!
mysql -B -uUSER -pPASSWORD < /tmp/sqlpipe &
# all set up, now just push the SQL queries to the pipe, exemple:
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
cat "mysqldump.sql" > /tmp/sqlpipe
echo "DELETE FROM table WHERE ...;" > /tmp/sqlpipe
# done! terminate pipe
kill -s SIGINT $PID
rm /tmp/sqlpipe
Al final terminamos el sleep
proceso para liberar completamente la entrada FIFO. Señalará mysql
que la entrada ha terminado y morirá automáticamente en consecuencia.
También hay una alternativa que no requiere FIFO, pero necesitará dos scripts:
ejecutar.sh:
#!/bin/sh
./querygenerator.sh | mysql -B -uUSER -pPASSWORD
generador de consultas.sh:
#!/bin/sh
echo "INSERT INTO table VALUES (...);"
echo "INSERT INTO table VALUES (...);"
echo "INSERT INTO table VALUES (...);"
cat "mysqldump.sql"
echo "DELETE FROM table WHERE ...;"