Saya memiliki proses yang berjalan lama yang menahan transaksi terbuka untuk durasi penuh.
Saya tidak memiliki kendali atas cara ini dijalankan.
Karena transaksi diadakan terbuka untuk durasi penuh, ketika log transaksi mengisi, SQL Server tidak dapat meningkatkan ukuran file log.
Jadi prosesnya gagal dengan kesalahan "The transaction log for database 'xxx' is full"
.
Saya telah berusaha mencegah ini dengan meningkatkan ukuran file log transaksi di properti database, tetapi saya mendapatkan kesalahan yang sama.
Tidak yakin apa yang harus saya coba selanjutnya. Prosesnya berjalan selama beberapa jam sehingga tidak mudah untuk memainkan trial and error.
Ada ide?
Jika ada yang tertarik, prosesnya adalah impor organisasi Microsoft Dynamics CRM 4.0.
Ada banyak ruang disk, kami memiliki log dalam mode pencatatan sederhana dan telah mencadangkan log sebelum memulai proses.
- = - = - = - = - UPDATE - = - = - = - = -
Terima kasih atas komentarnya sejauh ini. Berikut ini yang membuat saya percaya bahwa log tidak akan bertambah karena transaksi terbuka:
Saya mendapatkan kesalahan berikut ...
Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
Jadi mengikuti nasihat itu saya pergi ke " log_reuse_wait_desc column in sys.databases
" dan itu memegang nilai " ACTIVE_TRANSACTION
".
Menurut Microsoft: http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx
Artinya sebagai berikut:
Transaksi aktif (semua model pemulihan). • Transaksi yang berjalan lama mungkin ada di awal pencadangan log. Dalam kasus ini, mengosongkan ruang mungkin memerlukan cadangan log lain. Untuk informasi lebih lanjut, lihat "Transaksi Aktif Jangka Panjang", selanjutnya di topik ini.
• Transaksi ditangguhkan (hanya SQL Server 2005 Enterprise Edition dan versi yang lebih baru). Transaksi yang ditangguhkan secara efektif merupakan transaksi aktif yang rollbacknya diblokir karena beberapa sumber daya yang tidak tersedia. Untuk informasi tentang penyebab transaksi yang ditangguhkan dan cara memindahkannya dari status ditangguhkan, lihat Transaksi Ditangguhkan.
Apakah saya salah paham?
- = - = - = - UPDATE 2 - = - = - = -
Baru saja memulai proses dengan ukuran file log awal yang disetel ke 30GB. Ini akan memakan waktu beberapa jam untuk menyelesaikannya.
- = - = - = - UPDATE Akhir - = - = - = -
Masalah ini sebenarnya disebabkan oleh file log yang menghabiskan semua ruang disk yang tersedia. Dalam upaya terakhir saya membebaskan 120GB dan masih menggunakan semuanya dan akhirnya gagal.
Saya tidak menyadari ini terjadi sebelumnya karena ketika proses berjalan dalam semalam, itu bergulir kembali pada kegagalan. Kali ini saya dapat memeriksa ukuran file log sebelum melakukan rollback.
Terima kasih atas masukan Anda.
Jawaban:
Apakah ini skrip satu kali, atau pekerjaan rutin?
Di masa lalu, untuk proyek khusus yang sementara membutuhkan banyak ruang untuk file log, saya membuat file log kedua dan membuatnya menjadi besar. Setelah proyek selesai, kami kemudian menghapus file log tambahan.
sumber
Untuk memperbaiki masalah ini, ubah Model Pemulihan ke Sederhana lalu Kecilkan Log File
1. Properti Basis Data> Opsi> Model Pemulihan> Sederhana
2. Tugas Basis Data> Kecilkan> File> Log
Selesai.
Kemudian periksa ukuran file log db Anda di Database Properties> Files> Database Files> Path
Untuk memeriksa log server sql lengkap: buka Log File Viewer di SSMS> Database> Management> SQL Server Logs> Current
sumber
Saya mengalami kesalahan ini sekali dan itu berakhir dengan hard drive server yang kehabisan ruang disk.
sumber
Apakah Anda mengaktifkan Enable Autogrowth dan Unrestricted File Growth untuk file log? Anda dapat mengedit ini melalui SSMS di "Properti Database> File"
sumber
Ini adalah pendekatan jadul, tetapi jika Anda melakukan pembaruan berulang atau operasi penyisipan dalam SQL, sesuatu yang berjalan lama, ada baiknya untuk memanggil "pos pemeriksaan" secara berkala (secara terprogram). Memanggil "checkpoint" menyebabkan SQL menulis ke disk semua perubahan hanya memori tersebut (halaman kotor, disebut) dan item yang disimpan dalam log transaksi. Ini memiliki efek membersihkan log transaksi Anda secara berkala, sehingga mencegah masalah seperti yang dijelaskan.
sumber
Perintah berikut akan memotong log.
sumber
Jika model pemulihan database Anda penuh dan Anda tidak memiliki rencana pemeliharaan pencadangan log, Anda akan mendapatkan kesalahan ini karena log transaksi menjadi penuh karena
LOG_BACKUP
.Ini akan mencegah tindakan apa pun pada database ini (misalnya menyusut), dan SQL Server Database Engine akan memunculkan kesalahan 9002.
Untuk mengatasi perilaku ini, saya menyarankan Anda untuk memeriksa ini . Log transaksi untuk database 'SharePoint_Config' sudah penuh karena LOG_BACKUP yang menunjukkan langkah-langkah rinci untuk memecahkan masalah.
sumber
Saya menemui kesalahan: "Log transaksi untuk database '...' penuh karena 'ACTIVE_TRANSACTION' saat menghapus baris lama dari tabel database saya untuk mengosongkan ruang disk. Saya menyadari bahwa kesalahan ini akan terjadi jika jumlah baris ke dihapus lebih besar dari 1000000 dalam kasus saya Jadi daripada menggunakan 1 pernyataan DELETE, saya membagi tugas hapus dengan menggunakan pernyataan DELETE TOP (1000000) .....
Sebagai contoh:
daripada menggunakan pernyataan ini:
menggunakan pernyataan berikut berulang kali:
sumber
Masalah saya diselesaikan dengan beberapa eksekusi penghapusan terbatas seperti
Sebelum
Setelah
sumber
Jawaban atas pertanyaan tidak menghapus baris dari tabel tetapi ruang tempDB yang diambil karena transaksi aktif. ini kebanyakan terjadi ketika ada penggabungan (upsert) yang sedang dijalankan di mana kami mencoba memasukkan pembaruan dan menghapus transaksi. Satu-satunya pilihan adalah memastikan DB diatur ke model pemulihan sederhana dan juga meningkatkan file ke ruang maksimum (Tambahkan grup file lain). Meskipun ini memiliki kelebihan dan kekurangannya sendiri, ini adalah satu-satunya pilihan.
Opsi lain yang Anda miliki adalah membagi penggabungan (upsert) menjadi dua operasi. satu yang melakukan penyisipan dan yang lainnya melakukan pembaruan dan penghapusan.
sumber
Coba ini:
Saya harap ini membantu.
sumber
Ini kode pahlawan saya. Saya telah menghadapi masalah ini. Dan gunakan kode ini untuk memperbaikinya.
sumber
Coba ini:
Jika memungkinkan, restart layanan MSSQLSERVER dan SQLSERVERAGENT .
sumber