如何以块的形式将巨大的MyISAM表导出到InnoDB?

时间:2011-08-04 15:21:26

标签: mysql for-loop innodb myisam

我正在使用MySQL Workbench将一些巨大的(数百万行)MyISAM表改为InnoDB。我在克隆表后通过ALTER TABLE...INSERT INTO othertable SELECT * FROM mytable尝试了它,但似乎表格太大了。工作台退出时出现与服务器的连接丢失错误

所以我认为我可以怀疑一个SQL脚本,每隔10000个条目循环过多,并将MyISAM表的内容以块的形式复制到InnoDB表中。

由于似乎没有for循环SQL,我想知道是否有人建议如何实现这个?

INSERT INTO `latest`.`AUTHORS` (author_id, author_name)
SELECT
`author_names`.`author_name_id`,
`author_names`.`name`
FROM `pubmap_latest`.`dblp_author_names`;

这是我想要以块的形式运行的查询。 count(*) - 查询返回985330行。

2 个答案:

答案 0 :(得分:1)

我会使用mysqldump(命令行工具)从旧表中导出数据,然后将其导入新表。类似的东西:

mysqldump database table > file.sql

然后编辑表名并输入文件并:

mysql database < file.sql

答案 1 :(得分:0)

在MySQL中,您可以在LIMIT语句中使用SELECT关键字,定义要显示的结果行数。将此与偏移量相结合,您可以将表格分块。当然,在将表拆分为块时,应该使用order by子句来处理相同的结果集。

SELECT `author_names`.`author_name_id`, `author_names`.`name`
FROM `pubmap_latest`.`dblp_author_names`
ORDER BY  `author_names`.`author_name_id`
LIMIT 10000 OFFSET 0
INTO OUTFILE dblp_author_names_0.sql

对于偏移,您必须使用10000,20000,30000,...

使用

加载结果
LOAD DATA INFILE ...

请参阅MySQL 5.1 reference manual