6

我有一个巨大的 InnoDB 表(> 5 亿行),我想通过哈希对其进行分区以减小索引大小。我想以最少的停机时间(例如 10 分钟是可以接受的)来实现这一点,有哪些可能的选择?

我在想如下的事情:

  1. 创建新的分区表
  2. 使用“insert ... select ...”将旧表中的所有数据插入到这个新表中
  3. 使服务器对客户端不可用
  4. 以某种方式将步骤 2 中发生在旧表上的更改与新表同步
  5. 用新表替换旧表
  6. 使服务器可供客户端使用

主要问题是在第 4 步中可以使用什么工具。问题是在第 2 步中可能会对原始表进行大量更改:新的插入、更新、删除 - 同步工具应该将所有这些都考虑在内。 ..

我相信另一种可能的方法是:

  1. 设置复制从服务器
  2. 将此从服务器与主服务器同步
  3. 切换主/从角色并重新配置所有客户端以连接到新的主
  4. 更改前一个 master 上的 table
  5. 等待主从同步
  6. 再次切换主/从角色,重新配置所有客户端

你会推荐哪一个?

4

1 回答 1

1

我会选择主/从复制。如果主从可以在同一个子网上,我也会给主添加一个新的IP,改变客户端指向新的IP。然后当你要切换到从机时,只需:

  1. 在master上停止mysql

  2. ifconfig 关闭主服务器上的额外 IP

  3. ifconfig 在新的 master 上增加额外的 IP

客户端将只连接到新的主服务器,而无需重新配置任何客户端。然后,当您切换回原始主服务器时(如果您切换回),您会执行相同的操作。

我建议从属设备始终是与其主设备等效的硬件,这样当它接管主设备时,您不会发现它慢得多以至于无法跟上并且您的整个系统出现故障。如果你这样做,那么你只需要切换一次(从当前主控到新主控)。

于 2011-07-27T21:51:54.317 回答