我怎么知道我的 MySQL alter table 语句正在工作? [关闭]

Posted

技术标签:

【中文标题】我怎么知道我的 MySQL alter table 语句正在工作? [关闭]【英文标题】:How do I know that my MySQL alter table statement is working? [closed] 【发布时间】:2013-05-13 07:15:30 【问题描述】:

我正在对具有 3.5 亿行的表运行 alter table 语句。我怎么知道该语句实际上是在做某事而不是挂起?同样,我不想在声明结束之前打扰它。特别是在它运行了几个小时之后。

我需要能够在 Bash 或 PERL 中编写脚本,因为我的主机是 Redhat Linux 机器。本例中的语句为:

ALTER TABLE table_name AUTO_INCREMENT = 1;

【问题讨论】:

我不认为该语句应该花费太多时间,它不必对表格内容做任何事情。 我也是这么想的。然而,我在 Google 姑妈的帮助下发现的其他帖子提到,这对于大桌子来说是可以预料的。 我不知道有什么方法可以监控mysql服务器的内部活动。我可以建议的最好的方法是在测试服务器上制作表的副本并在那里执行 ALTER,以确保它正常工作。然后在生产服务器上进行。 有趣的是,我在专门用于此类事情的离线服务器上执行此操作。然后我的脚本以不同的名称将表复制到生产服务器,然后使用重命名将它们交换为使用。它可以很好地保护生产系统免受此类活动的影响。 在表中仅使用了约 3.6 亿行。由于设计原因,它们位于滑动窗口中,并且始终是连续的。因此,当我们达到约 20 亿的关键 MAX 时,我希望只是按顺序重用早期的。实际上,我开始相信我正在尝试的事情是不可能的,因为它提到 here 'InnoDB 在服务器重新启动后将下一个 auto_increment 值重置为表中的最大值 + 1。我想知道 MyISAM 是否也这样做。 【参考方案1】:

你真正要找的是这个。 SHOW PROCESSLIST。我还要补充一点,在处理大型数据集时,更新自动增量确实需要非常多的时间(正如您所发现的那样)

http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html

如果您打开与数据库的新连接并运行该命令,它将显示正在运行的查询处于哪个阶段(而不是剩余多长时间)。复制到临时表,完成等

【讨论】:

+1,但它是 SHOW PROCESSLISTPROCESSLIST 之间没有空格)。 感谢您的敏锐目光! 非常感谢。这正是我想要的。如果可以的话,还有一件事可以告诉我进程是否进入了错误状态(我从未见过这样的事情发生),因为我想知道如何检测和编码异常。 每个人说的不一定是坏状态,我个人在执行更改时经历的最糟糕的事情是等待表元锁定。这个查询实际上会指出一个金属锁,如果它遇到那个锁,你应该立即终止查询。 dev.mysql.com/doc/refman/5.5/en/metadata-locking.html 如果你不杀死它,alter 会冻结,所有连续的更新/插入/选择也会冻结,在生产环境中很有趣哈哈... 1+ 为这个好帖子@Bryan。【参考方案2】:

正如其他人所说,SHOW PROCESSLIST 是您的朋友。有时。当有多个长查询时,您可能希望将FULL 添加到该语句:SHOW FULL PROCESSLIST。使用 FULL,结果将在 Info 列中包含完整的查询。

我想知道为什么您的查询首先很慢。 MySQL 应该知道在哪里查找该表中的最后一条记录。如果它是 auto_increment ,它也会被索引,并且 MySQL 应该非常容易做到。

PROCESSLIST 通常可以很好地提示 MySQL 的工作位置,尤其是在查询/命令由于某种原因被阻止的情况下。

【讨论】:

【参考方案3】:

只是给你另一个选择...... 你可以试试开发者工具SQLyog。

它显示带有变量变化的查询配置文件以及语句的进度

【讨论】:

技术上是的,我可以使用该工具监控流程,或者就此而言使用标准 MySQL Workbench 产品。但是我需要为此编写脚本,因此基于 GUI 的工具并不是我想要的。但是感谢您指出这一点,我会考虑一下它可能对我们有价值的其他用途。

以上是关于我怎么知道我的 MySQL alter table 语句正在工作? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alter Table 和现有 MYSQL 数据库添加外键时出现问题 - 无法添加!帮助!

我如何知道数据库触发器是 DROP_TABLE 还是 ALTER_TABLE?

MySQL:ALTERing a Huge MySQL Table - 对一个超大表做alter调整

MySQL Alter table 奇怪的键错误

Alter table default character set 修改 MySQL 5.6 中的行

Netezza SQL ALTER TABLE 在存储过程中的替代方案?