Het probleem met FIFO's is dat wanneer elk proces dat gegevens invoert eindigt, het de processen die aan het lezen zijn signaleert (in dit geval mysql
) dat het het einde van de gegevens is, dus het eindigt.
De truc is om ervoor te zorgen dat er een proces is dat de FIFO-invoer te allen tijde levend houdt. U kunt dat doen door een sleep 999999999 > fifofile
. uit te voeren op de achtergrond.
Voorbeeld:
#!/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
Uiteindelijk beëindigen we de sleep
proces om de FIFO-invoer volledig vrij te geven. Het signaleert mysql
dat de invoer is beëindigd en als gevolg daarvan automatisch sterft.
Er is ook een alternatief waarvoor geen FIFO's nodig zijn, maar je hebt wel twee scripts nodig:
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 ...;"