PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Basis Data PostgreSQL Saya Kehabisan Ruang Disk

Ruang disk adalah sumber daya yang menuntut saat ini. Anda biasanya ingin menyimpan data selama mungkin, tetapi ini bisa menjadi masalah jika Anda tidak mengambil tindakan yang diperlukan untuk mencegah potensi masalah "ruang disk habis".

Di blog ini, kita akan melihat bagaimana kami dapat mendeteksi masalah ini untuk PostgreSQL, mencegahnya, dan jika sudah terlambat, beberapa opsi yang mungkin akan membantu Anda memperbaikinya.

Cara Mengidentifikasi Masalah Ruang Disk PostgreSQL

Sayangnya, jika Anda berada dalam situasi kehabisan ruang disk ini, Anda akan dapat melihat beberapa kesalahan dalam log database PostgreSQL:

2020-02-20 19:18:18.131 UTC [4400] LOG:  could not close temporary statistics file "pg_stat_tmp/global.tmp": No space left on device

atau bahkan di log sistem Anda:

Feb 20 19:29:26 blog-pg1 rsyslogd: imjournal: fclose() failed for path: '/var/lib/rsyslog/imjournal.state.tmp': No space left on device [v8.24.0-41.el7_7.2 try http://www.rsyslog.com/e/2027 ]

PostgreSQL dapat terus bekerja untuk sementara menjalankan kueri hanya-baca, tetapi pada akhirnya, ia akan gagal mencoba menulis ke disk, kemudian Anda akan melihat sesuatu seperti ini di sesi klien Anda:

WARNING:  terminating connection because of crash of another server process

DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.

HINT:  In a moment you should be able to reconnect to the database and repeat your command.

server closed the connection unexpectedly

This probably means the server terminated abnormally

before or while processing the request.

The connection to the server was lost. Attempting reset: Failed.

Kemudian, jika Anda melihat ruang disk, Anda akan mendapatkan output yang tidak diinginkan ini…

$ df -h

Filesystem                        Size Used Avail Use% Mounted on

/dev/mapper/pve-vm--125--disk--0   30G 30G 0 100% /

Cara Mencegah Masalah Ruang Disk PostgreSQL

Cara utama untuk mencegah masalah seperti ini adalah dengan memantau penggunaan ruang disk, dan basis data atau pertumbuhan penggunaan disk. Untuk ini, grafik harus menjadi cara yang ramah untuk memantau peningkatan ruang disk:

Dan sama untuk pertumbuhan database:

Hal penting lainnya yang harus dipantau adalah status replikasi. Jika Anda memiliki replika dan, karena alasan tertentu, ini berhenti berfungsi, bergantung pada konfigurasi, PostgreSQL mungkin saja menyimpan semua file WAL untuk memulihkan replika saat kembali.

Semua sistem pemantauan ini tidak masuk akal tanpa sistem peringatan untuk mengetahuinya saat Anda perlu mengambil tindakan:

Cara Memperbaiki Masalah Ruang Disk PostgreSQL

Nah, jika Anda menghadapi masalah kehabisan ruang disk ini bahkan dengan sistem pemantauan dan peringatan diterapkan (atau tidak), ada banyak opsi untuk mencoba memperbaiki masalah ini tanpa kehilangan data (atau kurang mungkin).

Apa yang Menghabiskan Ruang Disk Anda?

Langkah pertama harus menentukan di mana ruang disk saya. Praktik terbaik adalah memiliki partisi terpisah, setidaknya satu partisi terpisah untuk penyimpanan database Anda, sehingga Anda dapat dengan mudah mengonfirmasi apakah database atau sistem Anda menggunakan ruang disk yang berlebihan. Keuntungan lain dari ini adalah untuk meminimalkan kerusakan. Jika partisi root Anda penuh, database Anda masih dapat menulis di partisinya sendiri tanpa masalah.

Penggunaan Ruang Basis Data

Sekarang mari kita lihat beberapa perintah yang berguna untuk memeriksa penggunaan ruang disk database Anda.

Cara dasar untuk memeriksa penggunaan ruang database adalah dengan memeriksa direktori data di sistem file:

$ du -sh /var/lib/pgsql/11/data/

819M /var/lib/pgsql/11/data/

Atau jika Anda memiliki partisi terpisah untuk direktori data Anda, Anda dapat menggunakan df -h secara langsung.

Perintah PostgreSQL “\l+” mencantumkan database yang menambahkan informasi ukuran:

$ postgres=# \l+

                                                               List of databases

   Name    | Owner   | Encoding | Collate | Ctype |   Access privileges | Size | Tablespace

|                Description

-----------+----------+-----------+---------+-------+-----------------------+---------+------------

+--------------------------------------------

 postgres  | postgres | SQL_ASCII | C       | C | | 7965 kB | pg_default

| default administrative connection database

 template0 | postgres | SQL_ASCII | C       | C | =c/postgres +| 7817 kB | pg_default

| unmodifiable empty database

           |          | |         | | postgres=CTc/postgres |         |

|

 template1 | postgres | SQL_ASCII | C       | C | =c/postgres +| 7817 kB | pg_default

| default template for new databases

           |          | |         | | postgres=CTc/postgres |         |

|

 world     | postgres | SQL_ASCII | C       | C | | 8629 kB | pg_default

|

(4 rows)

Menggunakan pg_database_size dan nama database Anda dapat melihat ukuran database:

postgres=# SELECT pg_database_size('world');

 pg_database_size

------------------

          8835743

(1 row)

Dan menggunakan pg_size_pretty untuk melihat nilai ini dengan cara yang dapat dibaca manusia bisa menjadi lebih baik:

postgres=# SELECT pg_size_pretty(pg_database_size('world'));

 pg_size_pretty

----------------

 8629 kB

(1 row)

Bila Anda mengetahui letak ruang, Anda dapat mengambil tindakan yang sesuai untuk memperbaikinya. Ingatlah bahwa menghapus baris saja tidak cukup untuk memulihkan ruang disk, Anda harus menjalankan VACUUM atau VACUUM FULL untuk menyelesaikan tugas.

Log File

Cara termudah untuk memulihkan ruang disk adalah dengan menghapus file log. Anda dapat memeriksa direktori log PostgreSQL atau bahkan log sistem untuk memverifikasi apakah Anda dapat memperoleh ruang dari sana. Jika Anda memiliki sesuatu seperti ini:

$ du -sh /var/lib/pgsql/11/data/log/

18G /var/lib/pgsql/11/data/log/

Anda harus memeriksa konten direktori untuk melihat apakah ada masalah rotasi/retensi log atau sesuatu terjadi di database Anda dan menuliskannya ke log.

$ ls -lah /var/lib/pgsql/11/data/log/

total 18G

drwx------  2 postgres postgres 4.0K Feb 21 00:00 .

drwx------ 21 postgres postgres 4.0K Feb 21 00:00 ..

-rw-------  1 postgres postgres  18G Feb 21 14:46 postgresql-Fri.log

-rw-------  1 postgres postgres 9.3K Feb 20 22:52 postgresql-Thu.log

-rw-------  1 postgres postgres 3.3K Feb 19 22:36 postgresql-Wed.log

Sebelum menghapus log, jika Anda memiliki log yang besar, praktik yang baik adalah menyimpan sekitar 100 baris terakhir, lalu menghapusnya. Jadi, Anda dapat memeriksa apa yang terjadi setelah menghasilkan ruang kosong.

$ tail -100 postgresql-Fri.log > /tmp/log_temp.log

Dan kemudian:

$ cat /dev/null > /var/lib/pgsql/11/data/log/postgresql-Fri.log

Jika Anda hanya menghapusnya dengan "rm" dan file log sedang digunakan oleh server PostgreSQL (atau layanan lain) ruang tidak akan dilepaskan, jadi Anda harus memotong file ini menggunakan cat ini / perintah dev/null sebagai gantinya.

Tindakan ini hanya untuk PostgreSQL dan file log sistem. Jangan hapus konten pg_wal atau file PostgreSQL lainnya karena dapat menyebabkan kerusakan kritis pada database Anda.

Kembung

Dalam operasi PostgreSQL normal, tupel yang dihapus atau usang oleh pembaruan tidak secara fisik dihapus dari tabel; mereka hadir sampai VACUUM dilakukan. Sehingga perlu dilakukan VACUUM secara berkala (AUTOVACUUM), terutama pada tabel yang sering diupdate.

Masalahnya di sini adalah ruang tidak dikembalikan ke sistem operasi hanya dengan menggunakan VACUUM, itu hanya tersedia untuk digunakan dalam tabel yang sama.

VACUUM FULL menulis ulang tabel menjadi file disk baru, mengembalikan ruang yang tidak terpakai ke sistem operasi. Sayangnya, ini membutuhkan kunci eksklusif di setiap meja saat sedang berjalan.

Anda harus memeriksa tabel untuk melihat apakah proses VACUUM (FULL) diperlukan.

Slot Replikasi

Jika Anda menggunakan slot replikasi, dan slot tersebut tidak aktif karena alasan tertentu:

postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots;

 slot_name | slot_type | active

-----------+-----------+--------

 slot1     | physical  | f

(1 row)

Ini bisa menjadi masalah untuk ruang disk Anda karena ini akan menyimpan file WAL sampai diterima oleh semua node siaga.

Cara memperbaikinya adalah memulihkan replika (jika memungkinkan), atau menghapus slot:

postgres=# SELECT pg_drop_replication_slot('slot1');

 pg_drop_replication_slot

--------------------------

(1 row)

Jadi, ruang yang digunakan oleh file WAL akan dibebaskan.

Kesimpulan

Seperti yang kami sebutkan, sistem pemantauan dan peringatan adalah kunci untuk menghindari masalah semacam ini. Dengan cara ini, ClusterControl dapat membantu Anda agar sistem Anda aktif dan berjalan, mengirimkan alarm saat dibutuhkan atau bahkan mengambil tindakan pemulihan agar cluster database Anda tetap berfungsi. Anda juga dapat menerapkan/mengimpor berbagai teknologi database dan menskalakannya jika diperlukan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabel sebagai argumen dari fungsi PostgreSQL

  2. Perintah PostgreSQL VALUES Dijelaskan

  3. Cara Mendapatkan Hari Tahun Ini dari Tanggal di PostgreSQL

  4. Menghitung persentase dengan kueri GROUP BY

  5. Bagaimana menghubungkan ke database PostgreSQL jarak jauh melalui SSL dengan Python