web-dev-qa-db-ja.com

postgresqlを使用して「一時ファイルのブロック...を書き込めませんでした。デバイスにスペースが残っていません...」というエラーが表示されます

テーブルに多数の行を挿入する非常に大きなクエリを実行していますが、約800万行がいくつかの小さなクエリで分割されますが、しばらくするとそのエラーが表示されます。一時ファイルの。デバイスにスペースが残っていません... "postgresqlを使用しています"各クエリの後に一時ファイルを削除する必要があるかどうか、およびその方法はわかりません。それが別の問題に関連しているかどうかはわかりません。

ありがとうございました

13
jacr1614

OK。まだいくつかの事実が欠けているので、おそらく問題を明確にするために答えようと試みます:

ディスク容量が不足しているようです。ほとんどの場合、ディスクに十分なスペースがないためです。 Linux/Unixで確認するdf -h 例えば。

これがどのように発生するかを示すために、多分3つの整数を持つテーブルがあると、データだけで約12バイトを占有します。行管理などのためにそれにオーバーヘッドを追加する必要があります。 別の答え Erwinは23Byteについて言及し、詳細についてはマニュアルにリンクされています。また、行間などにパディングが必要になる場合があります。そのため、少し計算を行います。

3つの整数を使用しても、1行あたり約40バイトになります。 8,000,000を挿入することを念頭に置いて、これは合計で320,000,000Byteまたは〜300MBになります(この3つの整数の例のみで、大まかに)。

これで、このテーブルにいくつかのインデックスが作成されました。インデックスは挿入中にも増加します。また、別の側面としては、テーブルとインデックスが膨らんでいる可能性があります。

だから解決策は何ですか?

  1. データベースにより多くのディスク容量を提供する
  2. インサートをもう少し分割して、それらの間で真空が実行されていることを確認します
11
frlan

データまたはインデックスの作成(作成)には常に temp_tablespaces が必要です。これにより、一時テーブルとインデックスの配置、および大きなデータセットのソートなどの目的で使用される一時ファイルが決まります。エラーに応じて、これは、temp_tablespaceの場所ではディスク容量を確保できないことを意味します。

この問題を解決するには、次の2つの方法が必要になる場合があります。
1。temp/tablespaceのスペースを再利用します。デフォルトは/ PG_DATA/base/pgsql_tmpです。

2。 temp_tablespaceスペースが一時保存に十分でない場合は、そのデータベース用に他の一時テーブルスペースを作成できます。

create tablespace tmp_YOURS location '[your enough space location';
alter database yourDB set temp_tablespaces = tmp_YOURS ;
GRANT ALL ON TABLESPACE tmp_YOURS to USER_OF_DB;

次に、セッションを切断して再接続します。

7
BongSey

エラーは一目瞭然です。大きなクエリを実行していますが、実行するのに十分なディスク領域がありません。 postgresqlが/ opt ...にインストールされている場合は、クエリを実行するための十分なスペースがあるかどうかを確認してください。出力を制限しない場合は、予期した出力が得られていることを確認してから、クエリを実行して出力をファイルに書き込みます。

1
Brayoni