sql >> Databasteknik >  >> RDS >> Mysql

Koppla till MySQL-klienten helt och hållet via FIFO

Problemet med FIFO är att när varje process som matar in data avslutas, signalerar den processerna som läser (i det här fallet mysql ) att det är slutet på data, så det avslutas.

Tricket är att se till att det finns en process som håller FIFO-inmatningen vid liv hela tiden. Du kan göra det genom att köra en sleep 999999999 > fifofile i bakgrunden.

Exempel:

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

Till slut avslutar vi sleep process för att frigöra FIFO-ingången helt. Det kommer att signalera mysql att inmatningen har avslutats och den kommer automatiskt att dö i följd.

Det finns också ett alternativ som inte kräver FIFO, men du behöver två skript:

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


  1. Matcha utbud med efterfrågan – lösningar, del 1

  2. importera fjärrdatabas till localhost

  3. MySQL FIND_IN_SET() fungerar inte som förväntat

  4. Hitta det sista indexet för en sträng i Oracle