Le problème avec les FIFO est que lorsque chaque processus qui entre des données se termine, il signale les processus qui lisent (dans ce cas mysql
) que c'est la fin des données, donc ça se termine.
L'astuce consiste à s'assurer qu'il existe un processus qui maintient l'entrée FIFO active à tout moment. Vous pouvez le faire en exécutant un sleep 999999999 > fifofile
en arrière-plan.
Exemple :
#!/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
À la fin, nous mettons fin au sleep
processus pour libérer complètement l'entrée FIFO. Il signalera mysql
que l'entrée est terminée et qu'elle mourra automatiquement en conséquence.
Il existe également une alternative qui ne nécessite pas de FIFO, mais vous aurez besoin de deux 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 ...;"