Pertanyaan Bagaimana cara membebaskan memori yang digunakan oleh database SQL Server yang tidak aktif?


Kami memiliki SQL Server dengan beberapa ratus basis data. Banyak dari database di server yang digunakan hanya beberapa kali per minggu. Kami memiliki masalah di mana SQL Server terkadang menjadi sangat lambat. Ketika itu terjadi, penggunaan memori menunjukkan 99% dan paging terjadi. Untuk mengatasi masalah kami menjadwalkan restart layanan SQL setiap malam untuk membongkar semua database dan mengosongkan memori.

Apa cara yang benar untuk membebaskan memori yang digunakan oleh database idle tanpa mengambil Layanan SQL ke bawah? Kami ingin mengotomatiskan pembongkaran database apa pun yang tidak diakses dalam 30 menit terakhir.

Catatan: Saya mencari solusi yang berlaku untuk SQL 2005. Namun, jika ada fitur di SQL 2008 untuk melakukan itu saya ingin mengetahuinya.


15
2018-04-26 18:50


asal


Jawaban:


SQL Server akan membebaskan secara otomatis semua memori yang dapat dibebaskan dan akan menghindari paging. Jika Anda menemukan paging maka memori 99% sedang digunakan, tidak tersedia untuk dibebaskan. Anda perlu menyelidiki bagaimana memori yang digunakan, kemungkinan komponen eksternal seperti sp_oa_xxx membuat objek atau kueri terdistribusi. Mulailah dengan menyelidiki konsumen memori, lihat sys.dm_os_memory_clerks dan baca terus Cara menggunakan perintah DBCC MEMORYSTATUS untuk memonitor penggunaan memori pada SQL Server 2005.

Sebagai catatan tambahan, Anda sudah memiliki sarana untuk menutup database secara otomatis yang tidak digunakan: alter database <dbname> set auto_close on:

AUTO_CLOSE: Saat disetel ke AKTIF,   database dimatikan dengan bersih dan nya   sumber daya dibebaskan setelah yang terakhir   pengguna keluar. Basis data secara otomatis   buka kembali ketika pengguna mencoba menggunakan   database lagi.

Jika Anda meng-host ratusan database yang jarang digunakan maka AUTO_CLOSE adalah persis apa yang Anda cari.


10
2018-04-26 19:04



Untuk memulai, saya sarankan melihat ke:

DBCC FREEPROCCACHE

dan

DBCC DROPCLEANBUFFERS

Mereka tidak spesifik database tetapi mereka dapat menggantikan restart setiap malam.

Untuk perintah khusus database, Anda dapat mengeluarkan CHECKPOINT yang akan memaksa halaman kotor ke disk tetapi hanya berlaku untuk menulis.

Di SQL Server 2008 (dan R2) Edisi Perusahaan Anda dapat memanfaatkan Resource Governor untuk mengiris memori Anda ke dalam kolam dan mendedikasikan sebagian besar ke basis data penting yang memungkinkan kontrol CPU dan memori yang lebih rinci. Untuk melakukan ini dengan benar memerlukan perencanaan dan pengujian yang menyeluruh.


4
2018-04-26 18:56



Coba ini:

ALTER DATABASE blah SET AUTO_CLOSE ON;

Pengaturan ini (yang biasanya tidak disarankan untuk produksi) mungkin sesuai untuk kasus Anda. Pengaturan ini akan bekerja di SQL Server 2005 dan 2008.

Untuk informasi lebih lanjut: http://msdn.microsoft.com/en-us/library/bb522682.aspx


2
2018-04-26 19:07



Untuk MSSQL 2012; jalankan pertama berikut

EXEC sys.sp_configure N'max server memory (MB)', N'256'
GO
RECONFIGURE WITH OVERRIDE
GO

kemudian periksa Task Manager untuk melihat memori turun hingga 256 MB (atau lebih tinggi saat Anda mengatur di atas)

Kemudian jalankan ini (ganti 2048 dengan MB yang ingin Anda tetapkan secara teratur):

EXEC sys.sp_configure N'max server memory (MB)', N'2048'
GO
RECONFIGURE WITH OVERRIDE
GO

1
2018-01-24 18:57



Saya memiliki masalah seperti sebelumnya dan saya menemukan solusi untuk masalah ini Anda dapat membuat prosedur yang tersimpan seperti yang dijelaskan di bawah ini: sebelum Anda memulai aplikasi Anda, Anda harus memanggil prosedur yang tersimpan ini di Mode 1 karena Anda membutuhkan cukup memori

Untuk operasi SQL dan sebelum menutup aplikasi Anda, Anda harus memanggil prosedur yang tersimpan ini lagi di Mode 0

Create Proc [dbo].[MP_Rpt_ConfigureMemory]
    (@Mode bit)
as
    declare @RAM as integer
    declare @MAX as integer
    declare @MIN as integer

    set @RAM = (SELECT
                   [physical_memory_in_bytes]/1048576 AS [RAM (MB)]
                FROM [sys].[dm_os_sys_info])

    Set @MAX = ((@RAM / 4) * 3) 
    Set @MIN = ((@RAM / 4) * 1) 

    if @Mode = 0
    begin
         exec SP_Configure 'min server memory', 1
         RECONFIGURE

         exec SP_Configure 'max server memory', 100
         RECONFIGURE
    end
    else
       if @Mode = 1
       begin
           exec SP_Configure 'max server memory', @MAX
           RECONFIGURE
           exec SP_Configure 'min server memory', @MIN
           RECONFIGURE
       end

0
2017-11-28 13:13