あるPostgreSQLデータベースから別のデータベースにテーブルを移行する必要があります。一部のデータを修正する必要がある可能性があったため、CSVにエクスポートしました。次に、COPY
ステートメントを使用してCSVを2番目のデータベースにインポートしました。
このプロセスは現在5日間実行されています。その進行状況を調べるために私が見つけた唯一の方法は、ディスク上のサイズを比較することでした。元のテーブルは95GB(psqlの_\dt+
_から)で、CSVは40GBでした。そのため、新しいテーブルサイズをそれらの数値と比較できると思いました。新しいテーブルは95GBで停止するか、それ以前でも停止すると思いました。代わりに、現在は103 GBであり、いつ停止するかは誰にもわかりません。
もちろん、select count(*)
は機能しません。これは、コピーが独自のトランザクションで行われるため、完了するまで行がシールドされるためです。しかし、テーブルには約1億5000万行があることを私は知っています。したがって、どういうわけか、新しいテーブルに現在ある行数の見積もりを取得できれば、比較することができます。
COPY操作の進行状況を監視するための正式な機能はまだありません。 pageinspect 拡張子を使用して、コミットされていない行も含めて、行数の見積もりを取得できます。テーブルの存在がコミットされ、進行中のCOPY以外のテーブルが空であると仮定すると、次を使用できます。
select sum(
(select count(*) from
heap_page_items(get_raw_page('pgbench_accounts', x))
)
)
from generate_series(0, (pg_relation_size('pgbench_accounts')/8192)::int-1) as f(x);
(これでも、デフォルトのブロックサイズである8192を使用していることを前提としています。)