Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Anexar ao cliente MySQL inteiramente via FIFOs


O problema com FIFOs é que quando todo processo que está inserindo dados termina, ele sinaliza os processos que estão lendo (neste caso mysql ) que é o fim dos dados, então termina.

O truque é garantir que haja um processo que mantenha a entrada FIFO ativa o tempo todo. Você pode fazer isso executando um sleep 999999999 > fifofile no fundo.

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

No final, encerramos o sleep processo para liberar a entrada FIFO completamente. Ele sinalizará mysql que a entrada terminou e ela morrerá automaticamente em consequência.

Existe também uma alternativa que não requer FIFOs, mas você precisará de dois 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 ...;"