Mysql
 sql >> Database >  >> RDS >> Mysql

Collegati al client MySQL interamente tramite FIFO

Il problema con le FIFO è che quando termina ogni processo che sta immettendo dati, segnala i processi che stanno leggendo (in questo caso mysql ) che è la fine dei dati, quindi termina.

Il trucco è assicurarsi che ci sia un processo che mantenga sempre attivo l'input FIFO. Puoi farlo eseguendo un sleep 999999999 > fifofile sullo sfondo.

Esempio:

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

Alla fine terminiamo il sleep processo per rilasciare completamente l'input FIFO. Segnala mysql che l'input è terminato e di conseguenza morirà automaticamente.

C'è anche un'alternativa che non richiede FIFO, ma avrai bisogno di due script:

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