这就是我的做法。它应该适用于所有情况,因为它使用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 !"
shellsleep
命令只是为了确保运行 mysql 锁定命令的后台任务在 mysqldump 启动之前执行。您可以将其减少到 1 秒,它应该仍然可以。将其增加到 30 秒并尝试在这 30 秒内从另一个客户端的任何表中插入一个值,您会看到它被锁定。
mysqldump
使用此手动后台锁定而不是使用选项--single-transaction
和有两个优点--lock-tables
:
- 如果您混合了 MyISAM/InnoDB 表,这将锁定所有内容。
- 除了
mysqldump
在同一锁定期间,您还可以运行其他命令。例如,当在主节点上设置复制时,它很有用,因为您需要SHOW MASTER STATUS;
在您创建的转储的确切状态下(在解锁数据库之前)获取二进制日志位置,以便能够创建复制从属节点。