O problema com FIFOs é que quando todo processo que está inserindo dados termina, ele sinaliza os processos que estão lendo (neste caso
mysql
) que é o fim dos dados, então termina. O truque é garantir que haja um processo que mantenha a entrada FIFO ativa o tempo todo. Você pode fazer isso executando um
sleep 999999999 > fifofile
no fundo. Exemplo:
#!/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
No final, encerramos o
sleep
processo para liberar a entrada FIFO completamente. Ele sinalizará mysql
que a entrada terminou e ela morrerá automaticamente em consequência. Existe também uma alternativa que não requer FIFOs, mas você precisará de dois scripts:
run.sh:
#!/bin/sh
./querygenerator.sh | mysql -B -uUSER -pPASSWORD
querygenerator.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 ...;"