0

我有一个大约 25 GB 的表,我必须添加一列。

我运行一个脚本,当我执行它时,我可以在数据目录中看到临时表,但它停留在大约 480K。我可以在进程列表中看到 ALTER 正在运行并且没有问题。

如果我在长时间活动后终止脚本,那么在 processlist 中,查询将保持“终止”状态,并且 tmp 文件将开始增长,直到查询被完全终止(即,从 processlist 中的“终止”状态变为消失完全脱离进程列表)。

当我运行以下命令时(在终止查询之前):

select * from global_temporary_tables\G

它也没有显示任何添加的行。

还有什么我可以做的吗?

4

1 回答 1

1

首先,您的“ps”输出报告可能显示的内容与任何事情无关。不要依赖“ps”所说的:它包括过时的数据。

如果进程已被杀死(SIGKILL,而不是 SIGTERM),我向您保证它不再向任何地方提供任何输出。如果它已被 SIGTERMed,则取决于您附加了哪些信号处理程序。我将大胆猜测您尚未注册任何信号处理程序。

大多数生产 DBMS 以块的形式设置存储。获得 X 数量的空间,其中可能包含允许添加行和/或列的“松弛”空间(我并不是说这两种机制是相同的)。仅仅因为某些东西没有以你可以感知的方式增长并不意味着没有做出改变。为什么不检查数据字典,询问表的当前结构。

您提交更改了吗?在某些 DBMS 中,DDL 操作被视为可提交/可回滚(yecch)事件。

于 2016-07-14T00:45:29.693 回答