如何在没有锁定表的情况下将MyISAM在线更改为InnoDB



有许多表使用MyISAM。我不得不把他们的引擎改成InnoDB;但也存在以下困难:

1、 这些表没有主键或唯一键,所以大多数工具无法添加触发器来更改它

2、 当他们使用MyISAM时,如果我使用

"Alter table table_name ENGINE=InnoDB">

或"ADD COLUMN id bigint(10(NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY(id(",

该表将被锁定很长一段时间,而使一些功能在线不起作用

PS:MySQL版本为6.5.17

您有两个选项来完成相同的迁移。例如:

  • 像旧表一样创建新表
  • 根据需要修改新表
  • 在新表和旧表之间同步数据
  • 切换重命名表
  • 再次重新同步表

您需要一种方法将MyISAM转换为InnoDB,而不需要长时间锁定表,而且表中没有主键?

考虑到这些限制,这里有一个解决方案:

  1. 创建第二个数据库服务器,并使用文件系统快照使其成为主数据库服务器的副本。

  2. ALTER TABLE将表转换为InnoDB。这将在副本上花费时间,但不会影响主副本,因为复制是异步的。

  3. 转换表后,应恢复复制。让复制迎头赶上,使复制副本相对于其主副本是最新的。

  4. 将所有应用程序和客户端切换为使用副本而不是主应用程序。

瞧!客户端现在使用同一个表,但它是InnoDB。

不要再给以前的初选写信了。

最新更新