sql >> Base de Datos >  >> RDS >> Mysql

Adjuntar al cliente MySQL completamente a través de FIFO

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 ...;"