【问题标题】:Altering MySQL InnoDB table with minimal downtime以最少的停机时间更改 MySQL InnoDB 表
【发布时间】:2011-10-13 03:03:34
【问题描述】:

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

我在想如下的事情:

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

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

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

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

你会推荐哪个?

【问题讨论】:

  • 两者都适用于此目的。我,我自己,关注第一个,但我们不会让网站不可用。复制表的目的是停止查询。
  • 有时我们甚至会复制有限制的表格,例如insert into table2 select * from table1 limit 0,100000
  • 所以你基本上把原始表设为只读,对吧?
  • 两种方式都可以。如果您在切换之前无法找出必须同步的更改数据,那么在使用主/从副本时您可能不会那么头疼。这样你就可以让 MySQL 处理这个了。
  • Глаза боятся, руки делают ;-)

标签: mysql innodb alter-table downtime


【解决方案1】:

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

  1. 在主服务器上停止 mysql

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

  3. ifconfig up the extra IP on the new master

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

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

【讨论】:

  • 感谢虚拟ip提示
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2015-02-14
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多