复制 datadir 目录足以备份带有 InnoDB 表的数据库吗?

dat*_*.io 7 mysql innodb backup

我有一个包含 8000 万行的 innodb 表,它使用 mysqldump 非常慢,所以我正在考虑复制 datadir 目录以进行备份/传输。

我曾经在 Windows 版本的 MySQL 中仅使用 MyISAM 表复制数据库,并且它运行良好。现在我正在将混合了 InnoDB 和 MyISAM 表的数据库目录从 Linux 复制到 Windows,这种方法是否也有效?

我目前正在这样做,但我想知道我是否遗漏了什么?InnoDB 表数据不是分布在各个地方,例如在 ibdata1 中吗?我不必备份 ibdata1 或其他任何东西,对吗?

Vér*_*ace 5

告诉我您没有(甚至没有想到)在已启动并正在运行的数据库服务器上使用文件系统复制?这实际上肯定会导致您的副本损坏,使您的备份无用。您不会收到任何错误 - 当然,当您尝试恢复时除外:-)

您的帖子不是很清楚(如果我错了,请纠正我),但是您现在正在 Linux 上运行数据库?如果是这样,那么对您的 InnoDB 表使用 Percona 的XtraBackup。这个工具执行 InnoDB 表的非阻塞热备份。看看我的回答这里有一些 MySQL 备份选项。对于 MyISAM,如果 mysqldump 性能不佳,您可以查看MyDumper

如果您的服务器仍在 Windows 上,那么您就不走运了。XtraBackup 不能在 Windows 上运行,MyDumper (AFAIK) 也不能。你可以看看这个(免责声明 - 从未使用过)。

再说一次,我不完全清楚你在这里的意思。

现在我正在将混合了 InnoDB 和 MyISAM 表的数据库目录从 Linux 复制到 Windows,这种方法是否也有效?

如果您的意思是将 mysqldump 从 Linux 复制到 Windows,那么是的,这将与任何文件副本一样工作。另一方面,如果您的意思是在正在运行的服务器上复制(使用文件系统)数据文件并将这些副本从 Linux 传输到 Windows,那么您的“备份”在两个系统上都将毫无用处。

InnoDB 表数据不是分布在各个地方,例如在 ibdata1 中吗?我不必备份 ibdata1 或其他任何东西,对吗?

如果您使用 mysqldump 备份数据库,那么这就足够了。如果您只是将文件从一个正在运行的数据库服务器上的一个位置复制到另一个位置,那么您做什么或不做什么都没有关系,因为您的备份将毫无用处。

[编辑] 回应原发帖者的评论。

这里(正确答案)

mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql

只需将您的架构名称替换为 --all-databases。你说你的“表”是 InnoDB——其余的数据库/模式是 InnoDB?如果没有,你应该这样做。您似乎认为必须以某种形状或形式复制 datadir - 它没有。转储包含重建数据库所需的数据。

如果出现问题,您可以从上次备份(即转储)恢复数据库。还有其他允许 PITR(时间点恢复)的解决方案,但它们更复杂,复制也可以解决这个问题。

另请参阅这些帖子 ( 1 , 2 )。

我对这些帖子的内容(检查海报的声誉)的看法是,使用 InnoDB,上述命令将允许备份,同时允许读取和写入数据库 - 请注意,性能可能会受到影响。