有没有办法在MySQL中看到ALTER TABLE语句的进度?

Joh*_*ohn 25 mysql

例如,我发出了一个ALTER TABLE语句,用于在InnoDB表中的MEDIUMTEXT字段上创建索引,该表具有134k行,其中索引的大小为255字节,字段中数据的平均大小为30k.此命令已运行最后15分钟左右(并且是数据库上唯一运行的命令).我有什么方法可以确定它是否会在接近5分钟,5小时或5天内完成?

小智 19

我能够执行这两个查询并确定要移动的行数.

select count(*) from `myoriginalrable`;
select count(*) from `#sql-1e8_11ae5`;
Run Code Online (Sandbox Code Playgroud)

这比比较磁盘上的文件大小更有帮助,因为从myisam更改为innodb等会更改行大小.

  • 您是如何获得alter命令创建的临时表的名称的? (3认同)
  • 临时表的名称可以在文件系统中与其余表一起找到. (2认同)

小智 11

对于InnoDB表,可以使用SHOW ENGINE INNODB STATUS查找执行ALTER TABLE的事务并检查TX保存的行锁数.这是已处理行的数量.这里详细解释:

http://gabrielcain.com/blog/2009/08/05/mysql-alter-table-and-how-to-observe-progress/

此外,MariaDB 5.3及更高版本具有报告某些操作(包括ALTER TABLE)的进度的功能.看到:

http://kb.askmonty.org/en/progress-reporting/

  • 仅供参考,那篇博文表明`SHOW ENGINE INNODB STATUS` 技巧仅适用于 MySQL 5.0。 (2认同)

Gon*_*Cao 5

非常老的问题,但至少 mysql 5.7 对此有一个正确的答案

https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-table-performance-schema.html

在本质上...

UPDATE performance_schema.setup_instruments
       SET ENABLED = 'YES'
       WHERE NAME LIKE 'stage/innodb/alter%';
UPDATE performance_schema.setup_consumers
       SET ENABLED = 'YES'
       WHERE NAME LIKE '%stages%';
Run Code Online (Sandbox Code Playgroud)

...运行更改表...

SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
       FROM performance_schema.events_stages_current;
+------------------------------------------------------+----------------+----------------+
| EVENT_NAME                                           | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/innodb/alter table (read PK and internal sort) |            280 |           1245 |
+------------------------------------------------------+----------------+----------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)


Con*_*oyP 3

显然,这是一个非常常见的请求 - 早在 2005 年就在bugs.mysql.com上提出了请求。它已经存在于 Oracle 中,并且被列为有用的,但是“这不是一件简单的事情,所以不要指望它很快就会实现。” 。虽然那是2005年:)

也就是说,提出最初问题的小伙子后来发布了MySQL 5.0 的补丁,向后移植到 4.1,这可能会帮助你。