我需要将一个表从一个 PostgreSQL 数据库迁移到另一个。有可能我需要修复一些数据,所以我导出为 CSV。COPY
然后我用一个语句将 CSV 导入到第二个数据库中。
这个过程已经运行了5天。我发现检查其进度的唯一方法是比较磁盘上的大小。原始表为 95 GB(来自 psql's \dt+
),而 CSV 为 40 GB。所以我想我可以将新的表格大小与这些数字进行比较。我认为新表将停止在 95 GB,甚至更早。相反,它现在是 103 GB,谁知道它什么时候会停止。
当然,select count(*)
这是行不通的,因为复制发生在它自己的事务中,所以行被屏蔽,直到它完成。但我知道该表有大约 15 亿行。因此,如果我能以某种方式估计新表中当前可以比较的行数。
目前还没有正式的设施来监控 COPY 操作的进度。您可以使用pageinspect扩展来估计行数,甚至是未提交的行数。假设表的存在已经被提交,并且除了正在进行的 COPY 之外,该表是空的,那么您可以使用:
(这仍然假设您使用的是 8192 的默认块大小。)
Postgres 14 引入了pg_stat_progress_copy视图,它报告 COPY 命令的进度。