データベースを削除した後のディスク容量の解放


12

私は開発システムで作業しており、開発目的のために使用しているデータベース(「foo」など)に復元しています。よじ登って作業しているので、DROP DATABASE fooを実行しています。しかし、ディスクのすべてのスペースを使い果たしてしまったことにすぐに気付きました。くだらない。

別の論理データベースのVACUUM FULLは、以前に削除したデータベース(foo)のスペースを解放しますか?別の論理データベースからこれを試してみましたが、空き領域が回収されましたが、作成したすべてのCREATE DATABASE / DROP DATABASE呼び出しを説明するのに十分だとは思いません。私が実行した論理データベースをVACUUMしただけかもしれません。

合計データベース初期化を行わずにそのスペースを再利用する方法が必要ですか?

編集

だから私はバックアップからデータベースを再初期化し、これらのステップをほぼ実行した。復元後、ディスク上の1トンの領域を回収しました!これは今のところ機能しますが、ドロップされたデータベースをクリーンアップする方法に関するヘルプはまだ有用です。

編集2

だから私はこの問題に関するいくつかの詳細情報を収集することができました...ここに私が例として考え出したものがあります:

Initial partition size:
                       Size   Used  Avail Use% Mounted on
                        25G   8.1G    16G  35% /apps1

After creating my new database and populating it:
                        25G    18G   6.4G  73% /apps1

After Dropping the database using "DROP database mydb" from a separate logical DB:
                        25G    13G    11G  56% /apps1

そのため、新しいDBはディスク上で約9.6 GBを占有したように見えます。ただし、それを削除した後、再生されたディスク領域は約4.6Gだけ増加しました。だから、約5 GBの空き容量があるので、何が起こっているのだろうと思います!?

そして、私が再作成し、移入し、再びドロップすると、このサイクルが続きます。

「DROP DATABASE」コマンドが発行された後、何が残っているのか誰にもわかりませんか?


たぶん、アーカイブを有効にしていることも注目に値します。WALアーカイブファイルが書き込まれている場所はかなり大きいようです。私はそれを厳密に監視していません。上記と同じ手順を試し、そのディレクトリで「du」を実行して、すべてのスペースが再利用されているかどうかを確認します。報告します。
Jmoney38

私は真空は助けにはならないと思いますか?
rogerdpack 14

回答:


6

試してみてくださいsudo lsof| grep deletedと任意のPostgreSQLのプロセスが表示されているかどうかを確認。このコマンドは、削除されたファイルを探しますが、そのファイル記述子はどのプロセスでも開いています。別の副作用はそれdf -hdu -sh /異なります。これはdu、ファイルシステムをdf調べてすべてのファイルのサイズを合計し、物理デバイスを調べるためです。

データベースの問題DROP tableが発生しましたが、それが原因でスペースを解放できませんでしたが、それが原因でした。

私が知っている唯一の解決策は、データベースを再起動することです。たぶん、リロード(SIGHUP)の送信を試みることができます。


2
lsof | grep deleted先端は良いものでした。さらに、ファイルを解放するために、どのpostgresqlセッションがまだアクティブであるかを判断し、それらを強制終了するだけでよいことを追加します。私の場合、500以上のアクティブな接続のうち、ほぼすべてがIDLEまたはCOMMIT SELECT * FROM pg_stat_activityであり、ANALYZEで見つかってスタックした単一の接続を削除するだけで、削除されたファイルを解放できます。!00 GBが解放されました。
アレックスノースキーズ

5

私が理解しているのは、データベースをドロップすると、そのファイルとファイルがなくなるということです。

テーブルスペースを使用している場合を除き、各データベースのデータは、$ PGDATA / baseの下の独自のサブディレクトリにある必要があります。例として私のサーバーの1つを使用します(postgresユーザーとして):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

ここで、新しいデータベースを作成する場合、$ PGDATA / baseの下にもう1つのサブディレクトリが必要です。

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp

これが表示されます($ PGDATA / base / 83637は新しいデータベースのサブディレクトリです)。

そのデータベースを削除すると、データファイルも削除されます。

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

私たちが期待するのはこれです。$ PGDATA / base / 83637ディレクトリがなくなったので、バキュームするものは何もないはずです。

他にディスク容量を消費しているものはないのですか?他のデータベースの1つですか?ログファイル?

あなたが試すことができる何かは次のようになります:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

さまざまなデータベースの処理、作成、削除などを行ってから:

-bash-3.2$ du -sh `ls` > ../post_sizes

ディスクスペースがどこに行くのかを知るために。


あなたと同じ結果が表示されます。つまり、テーブルを追加すると、新しいDBがベースディレクトリに表示され、削除すると消えます。しかし、そのディレクトリのサイズが全体の違いを含むように表示されません(。すなわち〜9.6ギガバイト)
Jmoney38

@ Jmoney38-だからこそls、データベースの追加/削除を行う前後に$ PGDATAディレクトリで"du -sh "を実行することをお勧めします。
gsiems

@ Jmoney38-推測しなければならない場合、違いは$ PGDATA / pg_logおよび/または$ PGDATA / pg_xlogディレクトリで見つかるはずです。ログファイルはクラスター用であり、データベースを削除しても切り捨てられません。
gsiems
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.