p.matsinopoulos Asked: 2022-12-01 22:26:44 +0800 CST2022-12-01 22:26:44 +0800 CST 2022-12-01 22:26:44 +0800 CST 我可以为 PostgreSQL 中的 ALTER 语句指示 ETA 吗? 772 PostgreSQL 14 在这里。 我目前正在一个巨大的表上运行 ALTER 命令。它已经运行了 13 个小时,并且还在继续运行。它是活跃的。有什么方法可以让我知道应该何时完成? postgresql 1 个回答 Voted Best Answer Laurenz Albe 2022-12-02T02:31:39+08:002022-12-02T02:31:39+08:00 首先,验证ALTER TABLE未被阻止: SELECT wait_event_type, wait_event FROM pg_stat_activity WHERE state = 'active' AND query LIKE 'ALTER TABLE %'; 如果没有指示锁定,则该语句实际上正在运行。 不幸的是,没有简单的方法来跟踪ALTER TABLE重写表的进度。您可以查看旧数据文件和新数据文件并比较大小并据此做出猜测,但由于所有索引都已重新创建这一事实使情况变得复杂,因此很难知道与之进行比较的是什么。 您可以像这样找到表的旧数据文件: SELECT d.oid::text || '/' || t.relfilenode AS datafile FROM pg_database AS d CROSS JOIN pg_class AS t WHERE d.datname = current_database() AND t.relname = 'mytable'; 同样,您可以找到索引的数据文件。 要查看数据文件,登录数据库机器,切换到数据目录,然后运行 ls -l base/12345/54321* 12345/54321上面查询的输出在哪里。这将显示您的旧表或索引有多大。 要找到当前正在写入的文件,您可以查看具有最新修改时间戳的文件: ls -latr base/12345 | tail -1 如果该文件是98765.7,即文件 98765 的第八段,那么正在写入的表/索引当前大小在 7 到 8 GB 之间。 对不起,这是我能给你的最好的了。
首先,验证
ALTER TABLE
未被阻止:如果没有指示锁定,则该语句实际上正在运行。
不幸的是,没有简单的方法来跟踪
ALTER TABLE
重写表的进度。您可以查看旧数据文件和新数据文件并比较大小并据此做出猜测,但由于所有索引都已重新创建这一事实使情况变得复杂,因此很难知道与之进行比较的是什么。您可以像这样找到表的旧数据文件:
同样,您可以找到索引的数据文件。
要查看数据文件,登录数据库机器,切换到数据目录,然后运行
12345/54321
上面查询的输出在哪里。这将显示您的旧表或索引有多大。要找到当前正在写入的文件,您可以查看具有最新修改时间戳的文件:
如果该文件是
98765.7
,即文件 98765 的第八段,那么正在写入的表/索引当前大小在 7 到 8 GB 之间。对不起,这是我能给你的最好的了。