web-dev-qa-db-ja.com

長時間実行されるCOPYステートメントのステータスの検査

あるPostgreSQLデータベースから別のデータベースにテーブルを移行する必要があります。一部のデータを修正する必要がある可能性があったため、CSVにエクスポートしました。次に、COPYステートメントを使用してCSVを2番目のデータベースにインポートしました。

このプロセスは現在5日間実行されています。その進行状況を調べるために私が見つけた唯一の方法は、ディスク上のサイズを比較することでした。元のテーブルは95GB(psqlの_\dt+_から)で、CSVは40GBでした。そのため、新しいテーブルサイズをそれらの数値と比較できると思いました。新しいテーブルは95GBで停止するか、それ以前でも停止すると思いました。代わりに、現在は103 GBであり、いつ停止するかは誰にもわかりません。

もちろん、select count(*)は機能しません。これは、コピーが独自のトランザクションで行われるため、完了するまで行がシールドされるためです。しかし、テーブルには約1億5000万行があることを私は知っています。したがって、どういうわけか、新しいテーブルに現在ある行数の見積もりを取得できれば、比較することができます。

1
rubik

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を使用していることを前提としています。)

1
jjanes