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

Tilknyt MySQL-klienten udelukkende via FIFO'er

Problemet med FIFO'er er, at når hver proces, der indtaster data, afsluttes, signalerer den de processer, der læser (i dette tilfælde mysql ), at det er slutningen af ​​dataene, så det afsluttes.

Tricket er at sikre, at der er en proces, der holder FIFO-inputtet i live hele tiden. Du kan gøre det ved at køre en sleep 999999999 > fifofile i baggrunden.

Eksempel:

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

Til sidst afslutter vi sleep proces for at frigive FIFO-inputtet fuldstændigt. Det vil signalere mysql at inputtet er afsluttet, og det vil automatisk dø som følge heraf.

Der er også et alternativ, der ikke kræver FIFO'er, men du skal bruge to 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 ...;"


  1. optimizer_search_depth i Google Cloud SQL

  2. Laravel-tidsstempel bliver opdateret uden eksplicit opfordring til at gøre det

  3. MySQL ændre tabel og konvertere data fra tekst til datetime

  4. opbygning af rollebaseret applikation