以最小的停机时间改变MySQL InnoDB表

时间:2011-07-26 05:22:51

标签: mysql innodb alter-table downtime

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

我正在考虑如下事情:

  1. 创建新的分区表
  2. 使用“insert ... select ...”
  3. 将旧版数据中的所有数据插入此新表中
  4. 使服务器对客户端不可用
  5. 以某种方式同步第2步中使用新表发生在旧表中的更改
  6. 用新的表替换旧表
  7. 为客户提供服务器
  8. 主要问题是在步骤4中可以使用什么工具。问题是在步骤2中可能会对原始表进行大量更改:新插入,更新,删除 - 同步工具应该采取所有这些考虑到......

    我认为另一种可能的方式是:

    1. 设置复制从属服务器
    2. 将此从属服务器与主
    3. 同步
    4. 切换主/从角色并重新配置所有客户端以连接到新主服务器
    5. 改变前一个主人的表格
    6. 等待主/从同步
    7. 再次切换主/从角色,重新配置所有客户端
    8. 你会推荐哪一个?

1 个答案:

答案 0 :(得分:1)

我会选择主/从复制。如果主设备和从设备可以位于同一子网上,我还会向主设备添加新IP,将客户端更改为指向新IP。然后,当您即将切换到奴隶时,只需:

  1. 在主人身上停止mysql

  2. ifconfig关闭主人的额外IP

  3. ifconfig up new master上的额外IP

  4. 客户端只会在没有任何客户端重新配置的情况下连接到新主服务器。然后当你切换回原始主人时(如果你切换回来),你会做同样的事情。

    我建议一个slave总是与它的master相同的硬件,这样当它接管master时你就会发现它的速度太快以至于无法跟上并且你的整个系统都失败了。如果这样做,那么只需切换一次(从当前主设备切换到新主设备)。