ORA-04031: tidak dapat mengalokasikan byte dari memori bersama ("", "", "", "")

8

Saya menerima kesalahan ini dalam database pengembangan. Itu terjadi pada beberapa permintaan tertentu (menyisipkan dan menghapus sederhana melalui aplikasi .NET). Basis data digunakan oleh satu pengguna, dan kesalahan terjadi terlepas dari berapa lama database berjalan.

Satu-satunya parameter terkait memori yang ditetapkan adalah: MEMORY_TARGET = 1.2G

Oracle 11.2 x64 Edisi Standar Satu Windows Server 2008 R2

spm
sumber

Jawaban:

8

Aplikasi Anda mungkin tidak menggunakan variabel bind, yang menyebabkan SGA menjadi terfragmentasi (dipenuhi dengan beberapa salinan SQL yang menggunakan literal alih-alih mengikat).

Anda dapat memperbaiki masalah sementara dengan menyiram kolam bersama dengan:

alter system flush shared_pool;

Ada solusi yang dapat Anda coba untuk menghentikannya terjadi di masa depan.

Aktifkan berbagi kursor, lalu bangkit database:

ALTER SYSTEM SET cursor_sharing='SIMILAR' SCOPE=BOTH;

Satu-satunya cara nyata untuk memperbaikinya adalah menulis ulang aplikasi Anda sehingga menggunakan variabel bind.

Philᵀᴹ
sumber
"lalu pantulkan basis data" ==? "shutdown - startup"?
Atilla Ozgur
Ya, matikan database & mulai lagi
Philᵀᴹ
masalah "terpecahkan" dengan cara yang aneh
spm
1
Seperti yang saya katakan, jika aplikasi tidak menggunakan variabel bind adalah penyebab masalah, satu-satunya cara untuk "menyelesaikan" itu adalah menulis ulang aplikasi untuk menggunakannya.
Philᵀᴹ
Saya akan mencoba kedua solusi jika masalah terjadi lagi. Tetapi saya tidak berpikir itu berlaku untuk kasus ini, karena itu terjadi bahkan jika itu adalah permintaan pertama setelah restart.
spm
2

Jawaban di atas agak tua.

alter system flush shared_pool; 

Dapat meringankan masalah segera tetapi tidak berurusan dengan akar permasalahan. parameter cursor_sharing sekarang mengambil 2 nilai:

FORCE atau EXACT. Dengan EXACT, kueri Anda harus sama persis dengan kursor (sql dengan rencana eksekusi) yang akan digunakan kembali, dengan "FORCE", semua nilai dalam kueri Anda diubah untuk mengikat variabel. Ini sangat berguna ketika aplikasi Anda tidak menggunakan variabel bind. Basis data akan melakukannya untuk Anda.

Jika Anda sudah menggunakan cursor_sharing = FORCE. Maka Anda harus mulai mempertimbangkan untuk menyesuaikan alokasi memori Anda dan tergantung pada parameter memori yang digunakan sistem Anda, Anda dapat memperoleh gagasan tentang di mana Anda harus menetapkan nilai itu dengan pertanyaan berikut:

Saat SGA_TARGET dan SGA_MAX__SIZE / PGA_TARGET dan PGA_MAX_SIZE digunakan (harus cocok): pilih * dari v $ sga_target_advice; pilih * dari v $ pga_target_advice;

Akan terlihat seperti ini: Dalam kasus saya ini adalah sistem pre-prod, tidak akan terlihat bagus untuk waktu yang lama:

Ini adalah SGA_TARGET_ADVICE:

Baris di mana SGA_SIZE_FACTOR adalah 1, adalah pengaturan saat ini. Dalam sistem di mana memori berukuran terlalu kecil, peningkatan SGA_SIZE dan SGA_SIZE_FACTOR akan menunjukkan penurunan dramatis pada ESTD_DB_TIME dan ESTD_DB_TIME_FACTOR. Menambah memori ke titik di mana peningkatan lagi tidak membuat perubahan besar pada estd_db_time lagi.

Dalam kasus saya di sini, dengan beban saya saat ini, saya dapat dengan mudah mengurangi ukuran SGA_TARGET menjadi 80G tanpa menderita hit besar. Namun menguranginya menjadi 57G dan lebih sedikit akan menghasilkan masalah kinerja yang lebih dan lebih dramatis.

  SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ESTD_BUFFER_CACHE_SIZE ESTD_SHARED_POOL_SIZE     CON_ID
---------- --------------- ------------ ------------------- ------------------- ---------------------- --------------------- ----------
      5760           .0625       482104               .5257            50950730                  76032                 18176          0
     11520            .125       482104               .5257            50950730                  76032                 18176          0
     17280           .1875       482104               .5257            50950730                  76032                 18176          0
     23040             .25       482104               .5257            50950730                  76032                 18176          0
     28800           .3125      1560028              1.7011           174592866                   6912                 19456          0
     34560            .375      1374046              1.4983           138703172                  13824                 18176          0
     40320           .4375      1105895              1.2059            87207269                  20736                 18176          0
     46080              .5      1028769              1.1218            72319466                  27648                 17664          0
     51840           .5625      1000157              1.0906            66607889                  34560                 16896          0
     57600            .625       980623              1.0693            62628637                  41472                 16128          0
     63360           .6875       976129              1.0644            62628637                  41472                 21248          0
     69120             .75       961456              1.0484            59805967                  48384                 21248          0
     74880           .8125       945683              1.0312            56626641                  55296                 19456          0
     80640            .875       933852              1.0183            54359334                  62208                 19456          0
     86400           .9375       923765              1.0073            51867843                  71424                 16640          0
     92160               1       917070                   1            50950730                  76032                 18176          0
     97920          1.0625       910467               .9928            49534300                  82944                 17408          0
    103680           1.125       903131               .9848            47914066                  89856                 16640          0
    109440          1.1875       896528               .9776            46385545                  96768                 15872          0
    115200            1.25       891575               .9722            46385545                  96768                 21248          0
    120960          1.3125       886990               .9672            45361435                 103680                 19456          0
    126720           1.375       884331               .9643            44851928                 110592                 19456          0
    132480          1.4375       880937               .9606            44194663                 117504                 19456          0
    138240             1.5       875252               .9544            42915800                 124416                 18176          0
    144000          1.5625       870116               .9488            41901880                 131328                 17920          0
    149760           1.625       867915               .9464            41901880                 131328                 23040          0
    155520          1.6875       867181               .9456            41769408                 138240                 23040          0
    161280            1.75       866723               .9451            41769408                 138240                 28416          0
    167040          1.8125       866631                .945            41769408                 138240                 32000          0
    172800           1.875       866631                .945            41769408                 138240                 32000          0
    178560          1.9375       866631                .945            41769408                 138240                 32000          0
    184320               2       866631                .945            41769408                 145152                 32000          0

32 rows selected.

Saat MEMORY_TARGET digunakan:

select * from v$memory_target_advice;
Nicolas de Fontenay
sumber
1

Sebagai tambahan dari jawaban sebelumnya, ternyata ALTER SESSION SET NLS_COMP=LINGUISTIC;ALTER SESSION SET NLS_SORT=GENERIC_M_CI;karena suatu alasan cepat kehabisan memori. Masalah hilang saat menggunakan NLS_SORT lain.

spm
sumber