sql >> Databáze >  >> RDS >> Mysql

Připojte se ke klientovi MySQL zcela přes FIFO

Problém s FIFO je v tom, že když každý proces, který zadává data, skončí, signalizuje to procesům, které čtou (v tomto případě mysql ), že je to konec dat, takže skončí.

Trik spočívá v tom, že se ujistíte, že existuje proces, který neustále udržuje vstup FIFO naživu. Můžete to udělat spuštěním sleep 999999999 > fifofile na pozadí.

Příklad:

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

Nakonec ukončíme sleep proces pro úplné uvolnění vstupu FIFO. Bude to signalizovat mysql že vstup skončil a v důsledku toho automaticky zemře.

Existuje také alternativa, která nevyžaduje FIFO, ale budete potřebovat dva skripty:

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. Jak vypočítat věk (v letech) na základě data narození a getDate()

  2. Jak funguje SQLite Total()

  3. Psycopg2 nemá rád názvy tabulek, které začínají malým písmenem

  4. Jak zabránit vytváření záznamů, kde je hodnota dvou polí stejná?