我目前正在我的表(20M个条目)上运行一个alter查询,以添加索引。它已经运行了3天以上(停留在“复制到tmp表”中)。
有什么办法可以查看查询的进度,换句话说,有没有办法可以估计完成时间?
谢谢。
SHOW CREATE TABLE tblname\G
在桌子上告诉我们您要制作的索引。
我目前正在我的表(20M个条目)上运行一个alter查询,以添加索引。它已经运行了3天以上(停留在“复制到tmp表”中)。
有什么办法可以查看查询的进度,换句话说,有没有办法可以估计完成时间?
谢谢。
SHOW CREATE TABLE tblname\G
在桌子上告诉我们您要制作的索引。
Answers:
当mysql更改一个表时,它实际上会复制它,然后交换该副本。这样,如果您在中间取消更新,则该表仍处于稳定状态。因此,您可以在mysql数据目录(/ var / lib / mysql /?)中查看新文件的大小,这将告诉您文件的长度。对于Innodb,这有点困难,但是在某个地方创建了一个tmp表。
通过增加排序缓冲区变量(myisam_sort_buffer_size,sort_buffer_size),可以显着减少索引花费的时间。利用您的内存使这些尽可能大。您可以将修改时间减少几天,甚至可以减少到几个小时,具体取决于您有多少内存。我在大约3个小时内完成了150M记录表。
由于innodb_fle_per_table为OFF,因此您无法看到该表并无法衡量进度。
我之前发表了一篇有关如何为MyISAM执行此操作的帖子。仅当启用innodb_file_per_table并且重新构造InnoDB基础结构时,才能对InnoDB执行此操作。仍然需要在操作系统中查看相关文件的大小。
完全实现InnoDB清理并启用innodb_file_per_table后,您可能需要执行以下索引更新:
示例您有以下内容
db.lotsofdata
用2000万个名字调用的InnoDB表:该表如下所示:
CREATE TABLE db.lotsofdata
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30),
PRIMARY KEY (id)
) ENGINE=InnoDB;
假设您要创建一个名称索引。你可以这样做:
CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;
INSERT运行时,您进入操作系统并运行以下命令:
cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd
这将为您提供当前大小的清单lotsofdata_new.ibd
。当它变得大于时lotsofdata.ibd
,您就知道您即将完成。
没有可靠的方法来查看索引创建的进度。如果启用了innodb-per-per-table,则可以通过查看在数据目录中创建的临时.ibd文件并将其与当前文件的大小进行比较来获得一些提示,但这不是非常好可靠,因为您当前的数据文件可能会由于删除/碎片而膨胀,并且新数据文件将具有您以前的数据文件没有的其他索引。
听起来您正在使用未安装InnoDB插件的MySQL版本。InnoDB插件具有快速的索引创建功能,不需要为索引添加和删除而完全重建表。InnoDB插件默认在MySQL 5.5中启用,并且在5.1.38及更高版本中具有配置设置。
Percona Server在相当程度上(5.5之前)支持默认启用InnoDB插件。
Percona的pt-online-schema-change显示剩余时间估计。默认情况下,它每30秒打印一次剩余时间估算和进度百分比。
与仅运行ALTER命令相比,它还具有其他功能。
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html