在具有活动读写的实时系统上执行 mysqldump 的最安全方法?

use*_*637 99 mysql mysqldump backup linux

我不确定这是否属实,但我记得读过你是否在 linux 中运行以下命令

mysqldump -u username -p database_name > backup_db.sql
Run Code Online (Sandbox Code Playgroud)

在对数据库进行读取和写入时,转储可能包含错误。

命令中是否有特定选项mysqldump可确保在实时系统上安全完成此操作?我可以对我们的用户禁用读/写几秒钟(数据库 <50MB)

Rol*_*DBA 106

所有数据都是 InnoDB

这将为您提供数据的准确时间点快照:

mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Run Code Online (Sandbox Code Playgroud)

--single-transaction生成一个检查点,允许转储在接收传入更改时捕获检查点之前的所有数据。这些传入的更改不会成为转储的一部分。这确保了所有表的相同时间点。

--routines 转储所有存储过程和存储函数

--triggers 转储具有它们的每个表的所有触发器

所有数据都是 MyISAM 或 InnoDB/MyISAM 的混合

您将不得不施加全局读锁,执行 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
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

更新 2012-06-22 08:12 EDT

由于您的总数据少于 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
Run Code Online (Sandbox Code Playgroud)

对于非常小的数据库,这是一种更清晰、更简单的方法。


小智 6

  • 对于 InnoDB 表,您应该使用该--single-transaction选项,如另一个答案中所述。
  • 对于 MyISAM,有--lock-tables.

这里查看官方文档