Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将大型MyISAM转换为InnoDB_Mysql_Database_Innodb - Fatal编程技术网

Mysql 将大型MyISAM转换为InnoDB

Mysql 将大型MyISAM转换为InnoDB,mysql,database,innodb,Mysql,Database,Innodb,我正在尝试将一个1000万行MySQL MyISAM表转换为InnoDB。 我尝试了altertable,但是这让我的服务器卡住了,所以我手动关闭了mysql。推荐的方法是什么 我考虑过的选项: 1.创建一个新的InnoDB表,每次插入部分数据。 2.将表格转储到文本文件中,然后执行加载文件 3.再试一次,让服务器保持无响应,直到他完成(我试了两个小时,服务器是生产服务器,所以我更愿意让它运行) 4.复制表,删除其索引,然后转换,然后添加索引您是否尝试过先按主键排序数据?e、 g: ALTER

我正在尝试将一个1000万行MySQL MyISAM表转换为InnoDB。
我尝试了
altertable
,但是这让我的服务器卡住了,所以我手动关闭了mysql。推荐的方法是什么

我考虑过的选项:
1.创建一个新的InnoDB表,每次插入部分数据。
2.将表格转储到文本文件中,然后执行加载文件

3.再试一次,让服务器保持无响应,直到他完成(我试了两个小时,服务器是生产服务器,所以我更愿意让它运行)

4.复制表,删除其索引,然后转换,然后添加索引

您是否尝试过先按主键排序数据?e、 g:

ALTER TABLE tablename ORDER BY PK_column;

应该可以加快转换速度。

更改表的引擎需要重写表,这就是为什么表无法长期使用的原因。删除索引,然后转换,再添加索引,可能会加快初始转换的速度,但添加索引会在表上创建一个读锁,因此最终的效果是相同的。制作新表并传输数据是一条可行的途径。这通常分两部分完成-首先复制记录,然后重放在复制记录时所做的任何更改。如果您可以在保留读取的同时禁用表中的插入/更新,那么这不是问题。如果没有,有几种可能的解决方案。其中之一就是使用facebook的工具。另一个选项是将应用程序设置为在迁移记录时写入两个表,而不是仅切换到新记录。这取决于应用程序代码,关键部分是处理唯一键/重复项,因为在旧表中可以更新记录,而在新表中需要插入记录。(在这里,事务隔离级别也可能发挥关键作用,尽可能降低它)。“经典”的方法是使用复制,据我所知,复制也分为两部分——开始复制,记录主位置,然后在第二台服务器中导入数据库转储,然后作为从属服务器启动数据库以跟上更改。

您能解释一下为什么这会有帮助吗?ORDER BY在INNODB中对我的Table进行查询感觉相当困难。我相信PK是一个聚集索引(数据和索引存储在b树中),因此通过对其进行预排序,可以更轻松地创建结构。#1看起来不错,但您需要锁定表以防止写入。