Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vollständig über FIFOs an den MySQL-Client anhängen

Das Problem mit FIFOs besteht darin, dass, wenn jeder Prozess, der Daten eingibt, beendet wird, dies den lesenden Prozessen signalisiert (in diesem Fall mysql ), dass es das Ende der Daten ist, also wird es beendet.

Der Trick besteht darin, sicherzustellen, dass es einen Prozess gibt, der die FIFO-Eingabe jederzeit aktiv hält. Sie können dies tun, indem Sie sleep 999999999 > fifofile ausführen im Hintergrund.

Beispiel:

#!/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

Am Ende beenden wir den sleep Prozess, um den FIFO-Eingang vollständig freizugeben. Es wird mysql signalisieren dass die Eingabe beendet ist und sie automatisch beendet wird.

Es gibt auch eine Alternative, die keine FIFOs benötigt, aber Sie benötigen zwei Skripte:

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 ...;"