FIX: Anda menerima pesan galat memori habis saat Anda menggunakan replikasi gabungan dengan sinkronisasi Web di SQL Server 2005 atau SQL Server 2008

BUG #: 119532 (pemeliharaan konten)
Nomor bug VSTS: 344705
Nomor bug VSTS: 365477
Nomor bug VSTS: 365476

Microsoft mendistribusikan perbaikan Microsoft SQL Server 2005 sebagai satu berkas yang dapat diunduh. Karena perbaikan bersifat kumulatif, setiap Edaran baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan sebelumnya SQL Server 2005 edaran perbaikan. Microsoft mendistribusikan perbaikan Microsoft SQL Server 2008 sebagai satu berkas yang dapat diunduh. Karena perbaikan bersifat kumulatif, setiap Edaran baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan sebelumnya SQL Server 2008 edaran perbaikan.

Gejala

Anda menggunakan replikasi penggabungan SQL Server 2005 atau SQL Server 2008 replikasi penggabungan dengan sinkronisasi Web berbasis pelanggan. Terjadi kebocoran memori setelah sinkronisasi ulang dan Anda akan menerima galat "memori penuh" setelah periode waktu tertentu. Ini menjadi terlihat ketika proses host tidak di-restart untuk waktu yang lama, seperti ketika menggabungkan agen (Replmerg.exe) yang digunakan dengan switch - terus-menerus atau saat parameter berkelanjutan ditetapkan di profil agen yang diterapkan ke agen. Juga, masalah ini dapat mempengaruhi RMO aplikasi atau layanan yang Anda mengembangkan yang menjalankan sinkronisasi di sebuah loop saat aplikasi berjalan selama beberapa hari tanpa keluar.

Penyebab

Beberapa objek internal bocor berdasarkan sinkronisasi masing-masing.

Pemecahan masalah

SQL Server 2005 Paket Layanan 3


Perbaikan untuk masalah ini pertama kali dirilis di pembaruan kumulatif 6 untuk SQL Server 2005 Paket Layanan 3. Untuk informasi lebih lanjut tentang paket pembaruan kumulatif ini, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

974648 kumulatif paket pembaruan 6 untuk SQL Server 2005 Paket Layanan 3Catatan Karena edisi ini kumulatif, setiap edaran perbaikan baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan sebelumnya SQL Server 2005 edaran perbaikan. Microsoft menganjurkan agar Anda menerapkan edaran perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

960598 SQL Server 2005 edisi yang dirilis setelah SQL Server 2005 Paket Layanan 3 diluncurkan.
Microsoft SQL Server 2005 perbaikan dibuat untuk paket layanan SQL Server tertentu. Anda harus menerapkan perbaikan terbaru SQL Server 2005 Paket Layanan 3 untuk penginstalan SQL Server 2005 Paket Layanan 3. Secara default, setiap perbaikan terbaru yang disediakan dalam paket layanan SQL Server yang disertakan dalam paket layanan SQL Server.

Versi rilis SQL Server 2008

Penting Anda harus menginstal perbaikan ini jika Anda menjalankan versi rilis SQL Server 2008.

Perbaikan untuk masalah ini pertama kali diedarkan dalam 8 pembaruan kumulatif. Untuk informasi selengkapnya tentang cara mendapatkan paket pembaruan kumulatif ini untuk SQL Server 2008, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

Paket 8 pembaruan 975976 kumulatif untuk SQL Server 2008Catatan Karena edisi ini kumulatif, setiap edaran perbaikan baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan sebelumnya SQL Server 2008 edaran perbaikan. Kami sarankan Anda mempertimbangkan untuk menerapkan edaran perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

956909 bangun SQL Server 2008 yang dirilis setelah SQL Server 2008 dirilis

SQL Server 2008 Paket Layanan 1

Penting Anda harus menginstal perbaikan ini jika Anda menjalankan SQL Server 2008 Paket Layanan 1.


Perbaikan untuk masalah ini pertama kali dirilis pada 5 pembaruan kumulatif untuk SQL Server 2008 Paket Layanan 1. Untuk informasi lebih lanjut tentang paket pembaruan kumulatif ini, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

975977 kumulatif paket pembaruan 5 untuk SQL Server 2008 Paket Layanan 1Catatan Karena edisi ini kumulatif, setiap edaran perbaikan baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan sebelumnya SQL Server 2008 edaran perbaikan. Microsoft menganjurkan agar Anda menerapkan edaran perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

970365 bangun SQL Server 2008 yang dirilis setelah SQL Server 2008 Paket Layanan 1 kini telah dirilis
Microsoft SQL Server 2008 perbaikan dibuat untuk paket layanan SQL Server tertentu. Anda harus menerapkan perbaikan terbaru SQL Server 2008 Paket Layanan 1 untuk penginstalan SQL Server 2008 Paket Layanan 1. Secara default, setiap perbaikan terbaru yang disediakan dalam paket layanan SQL Server yang disertakan dalam paket layanan SQL Server.

Status

Microsoft telah memastikan bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".

Pemecahan masalah

Untuk mengatasi masalah ini, gunakan salah satu dari metode berikut ini:

Metode 1

Jika Anda menggunakan agen gabungan dalam mode terus-menerus, menghentikan proses agen gabungan secara berkala, dan mulai lagi.

Misalnya, Anda menerima galat "memori penuh" setelah lima hari, dan Anda menggabungkan agen dijadwalkan sebagai pekerjaan. Kemudian, Anda jadwal pekerjaan agen Server SQL baru untuk panggilan sp_stop_job diikuti oleh sp_start_job menentukan nama pekerjaan agen gabungan yang akan siklus proses terpengaruh setiap lima hari. Ketika Anda menghentikan proses menggabungkan agen (Replmerg.exe), memori bocor apa pun di dalam ruang memori proses akan diluncurkan.

Untuk informasi selengkapnya tentang penggunaan switch - berkelanjutan di menggabungkan Agent, lihat situs Web Microsoft Developer Network (MSDN) berikut:

http://msdn.microsoft.com/en-us/library/ms147839.aspx

sp_stop_job http://msdn.microsoft.com/en-us/library/ms182793(SQL.90).aspx

sp_start_job http://msdn.microsoft.com/en-us/library/ms186757(SQL.90).aspx

Metode 2

Jika Anda menggunakan agen gabungan dari pekerjaan, Anda dapat mengkonfigurasi manual looping logika dalam pekerjaan dengan menggunakan langkah-langkah tambahan bukannya mengandalkan parameter berkelanjutan. Alih-alih satu gabungan agen proses looping internal selamanya terus-menerus, menjadwal agen gabungan sebagai langkah pekerjaan yang berulang secara sering seperti sekali setiap menit. Proses akan keluar antara pengulangan, dan ini membebaskan memori bocor apa pun.
Edit menggabungkan agen pekerjaan sehingga ulangi langkah-langkah di sebuah loop dengan jeda antara mengulang.

  1. Setelah langkah [3] "Mendeteksi shutdown nonlogged agen," menambahkan langkah baru [4] bernama "Loop coba lagi terbatas." Menetapkan jenis TSQL dan perintah "waitfor penundaan ' 0: 00:05'", penundaan TSQL ini akan memberikan jeda kedua 5 mana Anda dapat mengkonfigurasi sebagai interval Poling sedemikian rupa agen gabungan akan berhenti sebentar antara eksekusi dan tidak berjalan terus-menerus. Pada advanced tab menentukan "Pada keberhasilan tindakan" sebagai "Lanjutkan ke langkah [2] jalankan agen" dan "Pada kegagalan tindakan" sebagai "Lanjutkan ke langkah [2] jalankan agen."

  2. Edit langkah [2] jalankan agen untuk memastikan loop langkah [4] tercapai. Pada tab lanjut langkah [2], ditetapkan pada tindakan keberhasilan, "lanjutkan ke langkah: [4] terbatas Loop coba lagi" dan ditetapkan pada kegagalan tindakan "Lanjutkan ke langkah berikutnya".

  3. Edit langkah [3] "Deteksi nonlogged agen shutdown" untuk memastikan bahwa loop pada langkah [4] tercapai. Pada tab lanjut langkah [3], ditetapkan pada keberhasilan tindakan, "Lanjutkan ke langkah berikutnya". Anda juga dapat memutuskan apakah Anda ingin langkah [3] pada kegagalan tindakan disetel sebagai "Lanjutkan ke langkah berikutnya" atau "Keluar dari pekerjaan pelaporan kegagalan." Jika dikonfigurasi untuk keluar dari program ini akan menampilkan kegagalan pekerjaan replikasi Monitor dan memantau pekerjaan. Jika dikonfigurasi pada kegagalan untuk melanjutkan ke langkah loop keempat, agen gabungan mungkin jalankan kembali tanpa batas waktu, dan galat dicatat tanpa batas.

Metode 3

Demikian pula, jika Anda menggunakan aplikasi RMO memanggil metode MergeSynchronizationAgent.Synchronize() yang menyinkronkan database pelanggan di sebuah loop, berhenti dan restart proses secara berkala untuk mengosongkan memori yang bocor karena masalah ini.
Untuk informasi lebih lanjut tentang objek dan metode ini, lihat situs Web Microsoft Developer Network (MSDN) berikut: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.replication.mergesynchronizationagent.synchronize(SQL.90).aspx

Informasi lebih lanjut

Informasi tumpukan panggilan

Kebocoran memori 1


Kebocoran memori terjadi di memori default. Memori default menjadi sangat terfragmentasi karena kecil 32 byte string kebocoran.0:000> !heapstats 0 -sHeap=0x00140000 BusyCount=1380235 BusyBytes=55115099
Found allocations in range of 0->151496 bytes.
Largest count is 850531 for memory blocks of size 32
Largest bytes used is 27216992 bytes for memory blocks of size 32

Size Count Total Percent Of Maximum Allocation Size In Range
------ ------ -------- ----------------------------------------------------------------------------------------------------
32 850531 27216992 ****************************************************************************************************
48 306892 14730816 ******************************************************
64 100583 6437312 ***********************
16 93995 1503920 *****
80 11068 885440 ***
151496 3 454488 *
256 1386 354816 *
160 1866 298560 *
904 131 118424

Dalam contoh ini, 32-byte alokasi menambahkan hingga 27 MB berkomitmen. Namun, memori default telah memesan besar sebagian karena objek ini bocor tersebar tumpukan dan pecah ruang yang tersedia antara blok.



Sebagian besar alokasi 32 byte ini berasal dari panggilan SysAllocString kode mana ada tidak ada SysFreeString atau menghapus panggilan.0:000> kLChildEBP RetAddr
0012b878 4c0a2f7b xmlsub!CXMLSubscriber::ReadAgentProfileParameter+0x1dd
0012b8b4 4e67a7e4 msgprox!CProxyMessageDatasource::ReadAgentProfileParameter+0x5b
0012bc18 4e6a65fe replrec!CDatabaseReconciler::UpdateAgentProfileCache+0x384
0012bda8 4e6a9281 replrec!CDatabaseReconciler::MoveChangesToDest+0x219e
0012cff8 4e6aae46 replrec!CDatabaseReconciler::CoreReconcile+0x1b01
0012d9ec 4e6ab388 replrec!CDatabaseReconciler::MessageReconcile+0x1206
0012ed90 4d1b651d replrec!CDatabaseReconciler::Reconcile+0x398
0012edd0 4dbf6331 sqlmergx!CSQLMerge::Run+0x18d
0012ede0 4de729b8 Microsoft_SqlServer_Replication!SQLMERGXLib::ISQLMerge::Run+0x11
0012ee70 4de70ed1 Microsoft_SqlServer_Replication_ni!Microsoft.SqlServer.Replication.MergeSynchronizationAgent.Run()+0x14c
0012eef8 00d2862b Microsoft_SqlServer_Replication_ni!Microsoft.SqlServer.Replication.MergeSynchronizationAgent.Synchronize()+0x71

Terjadi kebocoran kedua di C runtime tumpukan dengan replikasi terkait COM objek. Kebocoran ini dapat dilihat oleh memindai semua tumpukan untuk vftable menunjuk ke objek di dalam pustaka replrov.dll menggunakan ekstensi MDACExts! tablescan.0:000> !tablescan 'x replprov!*vftable*' 0Count Total Bytes Size Address Function
-------- ----------- ------ ---------- ----------------------------------------------------------------------------------------------------
1806 43344 24 0x4c9d1868 replprov!CReplicationProvider::`vftable'
1719 13752 8 0x4c9d1858 replprov!CSupportErrorInfo::`vftable'
1806 2066064 1144 0x4c9d1ba0 replprov!CMergePublisher::`vftable'
1806 7238448 4008 0x4c9d6250 replprov!CMergeDatasource::`vftable'
1806 7238448 4008 0x4c9d61a8 replprov!CMergeDatasource::`vftable'

Jika Anda tidak memiliki tabel memindai, Anda dapat melihat kebocoran ini didasarkan pada ukuran mencatat (24,8,1144, 4008). Untuk melakukannya, jalankan jenis berikut perintah terhadap tumpukan:0:000> !heapstats 0x003e0000 -s
Heap=0x003e0000 BusyCount=9363 BusyBytes=12555368
Found allocations in range of 4->8192 bytes.
Largest count is 1897 for memory blocks of size 8
Largest bytes used is 7238448 bytes for memory blocks of size 4008

Size Count Total Percent Of Maximum Allocation Size In Range
----- ----- ------- ----------------------------------------------------------------------------------------------------
4008 1806 7238448 ****************************************************************************************************
3128 900 2815200 **************************************
1144 1806 2066064 ****************************
etc...


Objek utama adalah CReplicationProvider. Objek anak-anak tiga memiliki kembali pointer ke objek induk. Oleh karena itu, objek tersebut ada dengan referensi menghitung satu sama lain. Untuk merusak objek ini, semua referensi penting harus mengurangi ke 0. Karena salah satu referensi penting tidak decremented dengan benar di dalam kode, objek empat tidak hancur setiap kali objek dipakai.



Catatan

Jika Anda menggunakan kebocoran pelacakan program, metode yang dialokasikan 3 objek bocor 4 adalah "replprov! CReplicationProvider::InitInstance".



Panggilan baru pada CReplicationProvider sendiri adalah objek 4.



Kebocoran memori 2


Kebocoran memori lain yang diperbaiki oleh rilis ini menggunakan timbunan blok ukuran 32 bita dan 48 byte dan berisi nama kolom dari artikel direplikasi. Berikut ini adalah bagian dari memori ini:xmlsub!CXMLSubscriberCommon::ReadNodexmlsub!CXMLSubscriberCommon::FindNamedNodeInList

Referensi

Untuk informasi selengkapnya tentang cara menggunakan switch - terus-menerus menggabungkan Agent, kunjungi situs Web Microsoft Developer Network (MSDN) berikut:

http://msdn.microsoft.com/en-us/library/ms147839.aspx
Untuk informasi selengkapnya tentang prosedur sp_stop_job disimpan, kunjungi situs Web Microsoft Developer Network (MSDN) berikut:

http://http://msdn.microsoft.com/en-us/library/ms182793(SQL.90).aspx
Untuk informasi selengkapnya tentang prosedur sp_start_job disimpan, kunjungi situs Web Microsoft Developer Network (MSDN) berikut:

http://msdn.microsoft.com/en-us/library/ms186757(SQL.90).aspx
Untuk informasi selengkapnya tentang cara mendapatkan SQL Server 2005 Paket Layanan 3, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

913089 cara mendapatkan paket layanan terbaru untuk SQL Server 2005

Untuk informasi selengkapnya tentang fitur baru dalam SQL Server 2005 Paket Layanan 3 (SP3) dan peningkatan dalam SQL Server 2005 SP3, kunjungi situs Web Microsoft berikut ini:

http://go.microsoft.com/fwlink/?LinkId=131442Untuk informasi selengkapnya tentang skema penamaan untuk pemutakhiran SQL Server, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

Paket pembaruan 822499 Skema penamaan baru untuk perangkat lunak Microsoft SQL Server

Untuk informasi selengkapnya tentang peristilahan pemutakhiran perangkat lunak, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

824684 Deskripsi tentang peristilahan standar yang digunakan untuk menjelaskan pemutakhiran perangkat lunak Microsoft

Penulis: jasonh
Penulis: v-jayc
Pemeriksa teknis: jasonh;
Editor: v-stepce

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Terima kasih atas umpan balik Anda!

Terima kasih atas umpan balik Anda! Sepertinya menghubungkan Anda ke salah satu agen dukungan Office kami akan sangat membantu.

×