数据库管理系统

数据库管理系统

我在运行 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 制作)

InnoDB 管道

FLUSH TABLES WITH READ LOCK;发出后仍有四个物体在移动:

  • 双写缓冲区
  • 插入缓冲区
  • 重做日志
  • 撤消日志

假设您启动FLUSH TABLES WITH READ LOCK;Robocopy,复制需要 5 分钟,这意味着在这 5 分钟内进行的任何物理更改都不会出现在备份中。更糟糕的是,文件更改不会来自单个时间点。这意味着可能有一些.ibd文件可能已更改或未更改,但保存其更改的事务尚未完全提交。

您必须将数据复制到另一台机器,启动 MySQL,并查看崩溃恢复(在 mysqld 启动、读取和处理这四个对象期间发生)是否使数据稳定且可用。

您最好使用mysqldump--single-transaction选项。

有关一些想法,请参阅我以前的 DBA StackExchange 帖子

相关内容