我在运行 Windows 7 的服务器上有一个 MySQL 数据库,我想创建一个快速(但安全!)的副本而不关闭任何服务器。我发出 FLUSH TABLES WITH READ LOCK,运行 Robocopy,然后发出 UNLOCK TABLES。问题是:如果我对 Robocopy 使用 /B 选项,它会打印很多消息,说“该进程无法访问该文件,因为它正在被另一个进程使用。”,并且只复制 MySql 数据目录中 535 个文件中的 209 个。如果我不使用 /B 选项,Robocopy 会报告所有文件都已复制。但现在我不确定。我猜 MySQL 即使在锁定时也会让表文件保持打开状态,而 Robocopy/B 决定备份它们不安全。如果没有 /B,Robocopy 会尽最大努力,这应该可以工作,因为 MySQL 没有进行任何 I/O,但我想听听比我更聪明的人的意见。谢谢!
答案1
数据库管理系统
如果您有一个全 MyISAM 数据库,那么这可以工作,因为所有 MyISAM 表在其标题中都有 0 文件句柄数。
数据库引擎InnoDB
如果您有任何 InnoDB 表,FLUSH TABLES WITH READ LOCK;
可能无法提供适当的数据完整性隔离。我早在 2012 年 11 月就在 DBA StackExchange 上写过这篇文章(如何在不关闭 MySQL 从属服务器的情况下使用 Linux/tar 运行冷备份?)
鉴于 InnoDB 架构(图片由 Percona CTO Vadim Tkechenko 制作)
FLUSH TABLES WITH READ LOCK;
发出后仍有四个物体在移动:
- 双写缓冲区
- 插入缓冲区
- 重做日志
- 撤消日志
假设您启动FLUSH TABLES WITH READ LOCK;
Robocopy,复制需要 5 分钟,这意味着在这 5 分钟内进行的任何物理更改都不会出现在备份中。更糟糕的是,文件更改不会来自单个时间点。这意味着可能有一些.ibd
文件可能已更改或未更改,但保存其更改的事务尚未完全提交。
您必须将数据复制到另一台机器,启动 MySQL,并查看崩溃恢复(在 mysqld 启动、读取和处理这四个对象期间发生)是否使数据稳定且可用。
您最好使用mysqldump
该--single-transaction
选项。
有关一些想法,请参阅我以前的 DBA StackExchange 帖子
Apr 17, 2011
:如何优化大型数据库的 mysqldump?Mar 14, 2014
:mysqldump 自动生成导出名称