Oto jak to zrobiłem. Powinien działać we wszystkich przypadkach, ponieważ używa FLUSH TABLES WITH READ LOCK
.
#!/bin/bash
DB=example
DUMP_FILE=export.sql
# Lock the database and sleep in background task
mysql -uroot -proot $DB -e "FLUSH TABLES WITH READ LOCK; DO SLEEP(3600);" &
sleep 3
# Export the database while it is locked
mysqldump -uroot -proot --opt $DB > $DUMP_FILE
# When finished, kill the previous background task to unlock
kill $! 2>/dev/null
wait $! 2>/dev/null
echo "Finished export, and unlocked !"
Skorupa sleep
komenda jest tylko, aby upewnić się, że zadanie tło uruchamiając polecenie blokowania mysql jest wykonywana przed rozpoczęciem mysqldump. Możesz zmniejszyć to do 1 sekundy i nadal powinno być dobrze. Zwiększ ją do 30 sekund i spróbuj wstawić wartości do dowolnej tabeli od innego klienta w ciągu tych 30 sekund, gdy zobaczysz, że jest zablokowana.
Istnieją 2 zalety korzystania z tej ręcznego blokowania tła, zamiast przy użyciu mysqldump
opcje --single-transaction
i --lock-tables
:
- Blokuje wszystko, jeśli mają mieszane tabel MyISAM/InnoDB.
- Możesz wykonywać inne polecenia oprócz
mysqldump
w tym samym okresie blokowania. Jest to użyteczne, na przykład, podczas konfigurowania replikacji na węźle głównym, ponieważ musisz uzyskać pozycję dziennika binarnego z SHOW MASTER STATUS;
dokładnie w stanie utworzonego zrzutu (przed odblokowaniem bazy danych), aby móc utworzyć urządzenie podrzędne replikacji .
'' -lock-tables' powinno zablokować wszystkie stoły do zrzucenia przed ich zrzuceniem. Co sprawia, że myślisz, że tego nie robi? – cdhowie
Mam test w mysql 5.1, kiedy używam --lock-tables w mysqldump, nadal mogę wstawić dane do tabeli bazy danych $ DB_NAME. – KeepZero