Mysql
 sql >> Base de données >  >> RDS >> Mysql

Attachez-vous au client MySQL entièrement via des FIFO

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