Проблемът с FIFO е, че когато всеки процес, който въвежда данни, приключи, той сигнализира за процесите, които четат (в този случай mysql
), че това е краят на данните, така че приключва.
Номерът е да се уверите, че има процес, поддържащ FIFO входа жив през цялото време. Можете да направите това, като стартирате sleep 999999999 > fifofile
във фонов режим.
Пример:
#!/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
В крайна сметка прекратяваме sleep
процес, за да освободите напълно FIFO входа. Той ще сигнализира за mysql
че въвеждането е приключило и след това автоматично ще умре.
Има и алтернатива, която не изисква FIFO, но ще ви трябват два скрипта:
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 ...;"