Problemet med FIFO är att när varje process som matar in data avslutas, signalerar den processerna som läser (i det här fallet mysql
) att det är slutet på data, så det avslutas.
Tricket är att se till att det finns en process som håller FIFO-inmatningen vid liv hela tiden. Du kan göra det genom att köra en sleep 999999999 > fifofile
i bakgrunden.
Exempel:
#!/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
Till slut avslutar vi sleep
process för att frigöra FIFO-ingången helt. Det kommer att signalera mysql
att inmatningen har avslutats och den kommer automatiskt att dö i följd.
Det finns också ett alternativ som inte kräver FIFO, men du behöver två skript:
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 ...;"