下面是我做到的。它應該在所有情況下工作,因爲它使用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 !"
外殼sleep
命令直接確保了mysqldump的開始之前執行運行mysql的鎖定命令的後臺任務。你可以減少到1秒,它應該仍然很好。將其增加到30秒,然後嘗試在這30秒內將值插入另一個客戶端的任何表中,您將看到它被鎖定。
有2分優勢,在使用本手冊背景鎖定,而不是使用mysqldump
選項--single-transaction
和--lock-tables
:
- 這一切鎖定,如果您有混合的MyISAM/InnoDB表。
- 您可以在同一鎖定期間運行除
mysqldump
之外的其他命令。例如,在主節點上設置複製時很有用,因爲您需要將SHOW MASTER STATUS;
作爲您創建的轉儲的確切狀態(在解鎖數據庫之前)獲取二進制日誌位置,以便能夠創建複製從服務器。
'--lock-tables'應該在轉儲之前鎖定所有要轉儲的表。是什麼讓你覺得它沒有這樣做? – cdhowie
我在MySQL 5.1中測試過,當我在mysqldump中使用--lock-tables時,我仍然可以將數據插入到$ DB_NAME數據庫的表中。 – KeepZero