sql >> Database >  >> RDS >> Mysql

Volledig via FIFO's aan MySQL-client koppelen

Het probleem met FIFO's is dat wanneer elk proces dat gegevens invoert eindigt, het de processen die aan het lezen zijn signaleert (in dit geval mysql ) dat het het einde van de gegevens is, dus het eindigt.

De truc is om ervoor te zorgen dat er een proces is dat de FIFO-invoer te allen tijde levend houdt. U kunt dat doen door een sleep 999999999 > fifofile . uit te voeren op de achtergrond.

Voorbeeld:

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

Uiteindelijk beëindigen we de sleep proces om de FIFO-invoer volledig vrij te geven. Het signaleert mysql dat de invoer is beëindigd en als gevolg daarvan automatisch sterft.

Er is ook een alternatief waarvoor geen FIFO's nodig zijn, maar je hebt wel twee scripts nodig:

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. Codeigniter:Fout in ORDER BY CASE-query

  2. Uitvoeren van toestemming voor xp_cmdshell

  3. MySQL-database migreren van Amazon RDS naar DigitalOcean

  4. Kan privilegetabellen niet openen en vergrendelen:Tabel 'mysql.user' bestaat niet