仅备份 myIsam .MYD

Backup myIsam .MYD only

是否可以只备份.MYD文件? (并重建 .MYI if/when 出现灾难性故障)


我想在异地备份相当大的表,同时尽量减少带宽使用。数据很重要,索引文件(5G+)不是。这个想法是 运行 定期备份 .frm 和 .myd 文件并在发生灾难性故障时重建索引(即本地备份被火烧毁或被盗)。

用 .frm 和 .myd 修复只给我一条错误消息。有简单的解决方法吗?

没有。您还必须转储 .frm 以便捕获架构。是的,可以重新创建 .MYI。是的,"repair with .frm and .MYD" 应该可以;我从来没有测试过它。您可以通过停止 MySQL、将这两个文件复制到不同的数据库,然后尝试修复来测试它。

MyISAM 不仅被弃用,而且从下一个版本 (8.0) 中也消失了。将来基本上没有使用 MyISAM 的正当理由。还有很多不使用它的原因。

如果 .MYI 文件大于 .MYD 文件,您可能做错了什么。一小部分表的索引确实比数据多,但这种情况很少见。当有人说"I indexed every column",那我就知道他是新手,不懂:

  • 标志(和其他 low-cardinality 列)上的索引可能永远不会被使用。
  • "Composite" 索引通常很有用。
  • MySQL很少在同一个SELECT.
  • 中使用两个索引

如果您想尽量减少带宽使用,我可以建议一些其他可能的策略:

  • 使用mysqldump,因为输出只包含数据,没有索引内容。恢复转储时将重新创建索引。

  • 压缩备份,然后传输压缩文件。它可能是未压缩备份大小的 1/10。

  • 使用复制,因此只有对数据库的增量更改才会传输到您的其他站点。然后 运行 在副本上备份。

将文件从数据目录中复制出来 "backups" 对您的数据完整性来说是不安全的。您应该使用像 mysqldump 这样的备份工具。

要在没有 .MYI 的情况下完全恢复 MyIsam table(即仅来自 .frm 和 .myd 文件),运行:

REPAIR tableName USE_FRM;


要对结构+数据进行快速紧凑的备份,运行:

FLUSH TABLES tableName WITH READ LOCK;

[复制 .frm 和 .myd 文件。无需复制 .myi]

UNLOCK TABLES

对于大型 tables,复制 .myd 文件比使用 mysqldump 提供更快的备份。我 运行 进行了快速测试,6G table 使用 mysqldump 进行备份需要 6 分钟,而直接复制需要 5 秒。 mysqldump 文件是 myd+myi 文件的组合大小。 .myd 文件 can/should 被压缩(我使用 7z)。

直接复制是MySQL官方documentation

讨论的几种备份方式之一

另一种方法是创建一个空的 table,就像要保护的那样。

对于备份:

1) 创建一个空 table 像原来的
2) 备份原来的.frm & .MYD
3) 在备份集中包含空的.MYI
4) 删除空 table


恢复步骤:

1) 还原table(原来的.frm & .MYD 和空的.MYI 还原到与.frm & .MYD 相同的数据库)
2) 锁定 table 以防止其被使用
3) 运行 myisamchk(我更喜欢 OS 中的 运行 - 索引重新生成可以并行化并分析优化器统计信息)
4) flush table table (如果从 OS 修复需要)
5) 解锁table
6) 分析 table(如果需要收集优化器统计信息)