有许多表使用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,而不需要长时间锁定表,而且表中没有主键?
考虑到这些限制,这里有一个解决方案:
-
创建第二个数据库服务器,并使用文件系统快照使其成为主数据库服务器的副本。
-
ALTER TABLE
将表转换为InnoDB。这将在副本上花费时间,但不会影响主副本,因为复制是异步的。 -
转换表后,应恢复复制。让复制迎头赶上,使复制副本相对于其主副本是最新的。
-
将所有应用程序和客户端切换为使用副本而不是主应用程序。
瞧!客户端现在使用同一个表,但它是InnoDB。
不要再给以前的初选写信了。