下面是我做到的。它应该在所有情况下工作,因为它使用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