mysql– 将大型MyISAM表转换为InnoDB

mysql– 将大型MyISAM表转换为InnoDB,第1张

概述我有一个MyISAM表(10M行,3.5G,计划达到~80M),我总是无法将其转换为InnoDB.我试过了 :> ALTER TABLE - 2分钟后失去连接.也许我做错了.> mysqldump - 尝试创建转储,然后将ENGINE = MyISAM更改为ENGINE = InnoDB.它开始很好但随着新表中行数的增长(~3M),它变得越

我有一个MyISAM表(10M行,3.5G,计划达到~80M),我总是无法将其转换为InnoDB.

我试过了 :

> ALTER table – 2分钟后失去连接.也许我做错了.
> mysqldump – 尝试创建转储,然后将ENGINE = MyISAM更改为ENGINE = InnoDB.

它开始很好但随着新表中行数的增长(~3M),它变得越来越慢,最后几个小时后它超时(–reconnect为ON).

如果我将缓冲池大小增加到2G,它会在更多行(~6M)之后减慢,但机器会耗尽RAM.

在转储恢复期间的SHOW PROCESSList中,我看到许多查询在“查询结束”状态下停留了2-3分钟.从Google-ing无法理解是什么意思.

> INSERT INTO … SELECT * FROM – 创建了相同结构的表并尝试了这一点.在数百万行之后也会减速然后超时. (感谢@Ernestasstankevičius提醒我这个.)

服务器:

Aws EC2 4GB Ubuntu14.04

my.cnf文件:

wait_timeout=28800connect_timeout=28800innodb_lock_wait_timeout=28800net_read_timeout=7200net_write_timeout=7200innodb_buffer_pool_size=1Ginnodb_io_capacity=100 /*200 is heavy on the machine*/innodb_flush_log_at_trx_commit=0reconnect=1
最佳答案对于4GB的机器,innodb_buffer_pool_size = 2G可能是危险的.试试1500M.交换或耗尽内存比使用小缓存更糟糕.

从MySQL命令行工具运行ALTER,而不是某些UI. (UI可能有你要打的时间限制.

你在运行什么版本的MysqL?你有多少指数?请告诉我们SHOW CREATE table.删除所有辅助密钥,仅保留PRIMARY KEY.转换后添加其他索引; 5.6或后者可以做到“就地”.

如果您没有PRIMARY KEY,请创建一个; InnoDB确实需要一个.

这可能涵盖大多数情况:

CREATE table new liKE real;ALTER table new ENGINE=InnoDB,DROP ...,-- all the secondary keys    ADD PRIMARY (...),-- if needed    ENGINE=InnoDB;INSERT INTO new (...)    SELECT ... FROM real ORDER BY ... -- insert in PK orderALTER table new    ADD index ...;  -- rebuild secondary key(s) (see note)REname table real TO old,new TO real;DROP table old;

注意:如果您运行的是5.5或更早版本,请在一个ALTER中添加所有辅助密钥.如果您运行的是5.6或更高版本,请一次添加一个. 总结

以上是内存溢出为你收集整理的mysql – 将大型MyISAM表转换为InnoDB全部内容,希望文章能够帮你解决mysql – 将大型MyISAM表转换为InnoDB所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1168813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存