【发布时间】:2011-10-13 03:03:34
【问题描述】:
我有一个巨大的 InnoDB 表(>5 亿行),我想通过哈希对其进行分区以减小索引大小。我想以最少的停机时间(例如 10 分钟是可以接受的)来实现这一点,有哪些可能的选择?
我在想如下的事情:
- 创建新的分区表
- 使用“insert ... select ...”将旧表中的所有数据插入到这个新表中
- 使服务器对客户端不可用
- 不知何故将第 2 步中发生在旧表上的更改与新表同步
- 用新表替换旧表
- 使服务器可供客户端使用
主要问题是在第 4 步中可以使用什么工具。问题是在第 2 步中可能会对原始表进行大量更改:新的插入、更新、删除 - 同步工具应该完成所有这些考虑到...
我相信另一种可能的方法是:
- 设置复制从属服务器
- 将此从服务器与主服务器同步
- 切换主/从角色并重新配置所有客户端以连接到新的主节点
- 更改前一个主服务器上的表
- 等待主/从同步
- 再次切换主/从角色,重新配置所有客户端
你会推荐哪个?
【问题讨论】:
-
两者都适用于此目的。我,我自己,关注第一个,但我们不会让网站不可用。复制表的目的是停止查询。
-
有时我们甚至会复制有限制的表格,例如
insert into table2 select * from table1 limit 0,100000等 -
所以你基本上把原始表设为只读,对吧?
-
两种方式都可以。如果您在切换之前无法找出必须同步的更改数据,那么在使用主/从副本时您可能不会那么头疼。这样你就可以让 MySQL 处理这个了。
-
Глаза боятся, руки делают ;-)
标签: mysql innodb alter-table downtime