PostgreSQL mengeluh tentang memori bersama, tetapi memori bersama tampaknya baik-baik saja

13

Saya telah melakukan semacam menjatuhkan skema intensif dan membuat lebih dari satu server PostgreSQL, tetapi sekarang mengeluh ..:

WARNING:  out of shared memory
ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

Tetapi masalahnya tetap ada jika PostgreSQL baru saja dimulai kembali service postgresql restart, saya kira max_locks_per_transaction tidak akan menyetem apa-apa.

Saya agak terasing karena daftar pemecahan masalah untuk kesalahan ini tidak berfungsi untuk saya.

INFO LEBIH LANJUT 1409291350: Beberapa detail hilang tetapi saya tetap mempertahankan hasil inti SQL.

postgres=# SELECT version();
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2,
 64-bit

Dan:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty
48347
sumber
2
Versi postgreSQL dari SELECT version()? Masalah yang menarik ...
Craig Ringer
2
"Saya menduga transaksi max_locks_per_trans tidak akan menyelesaikan masalah." - uh, mengapa kamu curiga? Sudahkah Anda mencoba mengikuti saran petunjuk ini?
Josh Kupershmidt
Sudahkah Anda mencoba mengikuti saran petunjuk ini? Saya telah menghapus komentar max_locks_per_transaction = 64 # min 10di /etc/postgresql/9.3/main/postgresql.conf sejauh ini.
48347
1
Max_locks_per_transaction default adalah 64 untuk memulai - membatalkan komentar pada baris yang tidak secara efektif mengubahnya.
yieldsfalsehood
1
OK peningkatan yang efektif menjadi 128 memecahkan masalah , sebenarnya memungkinkan operasi untuk melanjutkan.
48347

Jawaban:

11

Komentar Anda tentang menjatuhkan intensif dan membuat dan pemberitahuan yang Anda terima tentang peningkatan petunjuk max_locks_per_transaction bahwa Anda menjatuhkan dan membuat banyak objek dalam transaksi yang sama . Masing-masing menghasilkan kunci, yang masing-masing membutuhkan sejumlah kecil memori bersama. Karena itu, max_locks_per_transaction membatasi jumlah kunci yang dapat Anda pegang dalam suatu transaksi (untuk mencegah satu transaksi menggunakan semua memori bersama).

Anda dapat meningkatkan batas itu sedikit (saya akan merekomendasikan untuk tidak menetapkannya besar secara sewenang-wenang atau Anda akan lari ke situasi terpisah yang benar-benar kehabisan total memori bersama) atau melakukan tetes Anda dan membuat baik dalam kumpulan transaksi atau sebagai satu tetes / buat per transaksi.

Sunting: Rupanya saya salah tentang cara kerja max_locks_per_transaction. Dari dokumentasi, jumlah kunci yang tersedia adalah max_locks_per_transaction * (max_connections + max_prepared_transactions) - setiap transaksi dapat menampung lebih dari max_locks_per_transaction, selama jumlah kunci yang disimpan di mana-mana kurang dari nilai total ini.

menghasilkan kepalsuan
sumber
Alur kerja saya meliputi (1) membuang skema X, (2) menjatuhkan skema lain Y, dan (3) mengembalikan X pada nama skema Y. Seperti yang saya katakan, sampai hari ini saya sudah beberapa minggu melakukan kegiatan ini, dan hari ini langkah (2) gagal. Langkah (2) terutama terdiri dari DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public, ini adalah kalimat-kalimat yang melemparkan PERINGATAN, KESALAHAN dan PETUNJUK.
48347
Menggandakan kunci maks dari 64 menjadi 128 memungkinkan alur kerja untuk melanjutkan. Aku belum mendapatkan semua internal, tapi kurasa melakukan antara DROP SCHEMA dan kalimat CREATE SCHEMA akan memiliki efek yang sama.
48347
Sekarang saya menyadari beberapa hari saya mendapatkan peningkatan skema kecil, dan masalah ini sangat cocok dengan salah satu peningkatan skema kecil itu . Sebagai strategi umum saya akan memiliki pertimbangan yang lebih besar dengan PETUNJUK dari sekarang.
48347