我不确定这是否属实,但我记得如果您在 linux 中运行以下命令,我会阅读
mysqldump -u username -p database_name > backup_db.sql
在对数据库进行读取和写入时,转储可能包含错误。
命令中是否有特定选项mysqldump可确保在实时系统上安全地完成此操作?我可以在几秒钟内为我们的用户禁用读/写(数据库 <50MB)
mysqldump
这将为您提供数据的准确时间点快照:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction生成一个检查点,允许转储在接收传入更改时捕获检查点之前的所有数据。这些传入的更改不会成为转储的一部分。这确保了所有表的时间点相同。
--single-transaction
--routines转储所有存储过程和存储函数
--routines
--triggers为每个拥有它们的表转储所有触发器
--triggers
您将不得不施加全局读锁,执行 mysqldump,并释放全局锁
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" & sleep 5 mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'` echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql mysql -uuser -ppass -A < /tmp/kill_sleep.sql
试试看 !!!
由于您拥有 <50MB 的总数据,我还有另一个选择。与其在后台启动 SLEEP 命令以保持全局读取锁定 86400 秒(即 24 小时)只是为了获取进程 ID 并在外面杀死,让我们尝试在 mysql 中而不是在操作系统中设置 5 秒超时:
SLEEP_TIMEOUT=5 SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})" mysql -uuser -ppass -Ae"${SQLSTMT}" & mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
对于非常小的数据库,这是一种更简洁、更简单的方法。