Log transaksi untuk database sudah penuh


108

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.


re "... dan telah mencadangkan log" .... jika database dalam mode Sederhana, Anda tidak akan dapat membuat cadangan log, cadangan log tidak berlaku untuk mode sederhana. Apakah itu dicatat secara massal?
SqlACID

1
Saya mencadangkan seluruh DB dan mengecilkannya yang mengakibatkan Log menyusut menjadi 1MB. Saya kemudian meningkatkan ukuran file Log menjadi 20GB pada awalnya, dan sekarang menjadi 30 GB.
Jimbo

Jawaban:


19

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.


Saya tidak akan mengatakan ini adalah pekerjaan satu kali, tetapi kami jarang harus melakukannya. Saya tidak membuat file log kedua, tetapi saya meningkatkan ukuran awal file log saya saat ini menjadi 30 GB. Selama menjalankan terakhir saya, itu diatur ke 20GB dan masih gagal.
Jimbo

Akankah memiliki file log kedua lebih baik daripada memiliki yang besar mengingat saya hanya memiliki satu drive untuk bekerja?
Jimbo

Seingat saya sekarang, file tambahan sebagian besar memungkinkan kita untuk mengakses drive lain yang lebih besar.
Mike Henderson

2
Seberapa besar data yang diimpor? Jika Anda mengimpor 30 GB data, file log Anda mungkin harus berukuran setidaknya sebesar itu.
Mike Henderson

3
Ukuran log adalah kuncinya. Tugas saat ini gagal lagi dan saya tidak dapat mempercayai mata saya ketika saya melihat ukuran file log pada titik di mana itu gagal. Itu hanya memproses setengah dari akun dan sudah berukuran 53GB. Sepertinya saya harus mengosongkan sekitar 60-70GB lain untuk dapat menyelesaikan proses ini.
Jimbo

95

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


10
Tidak, itu tidak menyelesaikan masalah. Masalahnya adalah bahwa file log tumbuh selama proses yang berjalan lama hingga kehabisan ruang disk. Itu diperbaiki dengan memindahkan file log ke drive lain yang memiliki ruang 1TB untuk sementara. Anda tidak dapat mengecilkan file log saat proses yang berjalan lama - yang menahan transaksi terbuka - sedang berlangsung. Proses itu sepenuhnya bertanggung jawab atas pertumbuhan file.
Jimbo

Seperti yang sudah dikatakan @Jimbo, ini tidak memperbaiki masalah OP. Ini dapat membebaskan beberapa ruang yang saat ini tidak digunakan, tetapi segera setelah transaksi yang lama berjalan lagi, ruang tersebut akan digunakan lagi (dan mungkin gagal bahkan lebih awal)
Marcel

Sempurna! Terima kasih!
Yuri Monteiro

Itu tidak menyelesaikan masalah. Log saya hanya memiliki 500 byte. Saya pikir masalah ini dimulai setelah saya melakukan backup kemarin.
Ricardo França

Ini jelas merupakan perbaikan jika Anda memiliki beberapa megabyte tersisa untuk disimpan di drive penuh.
Steve Bauman

36

Saya mengalami kesalahan ini sekali dan itu berakhir dengan hard drive server yang kehabisan ruang disk.


1
Baca pembaruan OP. Ternyata inilah masalahnya.
Colm

18

Apakah Anda mengaktifkan Enable Autogrowth dan Unrestricted File Growth untuk file log? Anda dapat mengedit ini melalui SSMS di "Properti Database> File"


Iya. Ini disetel ke pertumbuhan otomatis 10%, tidak dibatasi. Masalahnya adalah browser otomatis tidak akan berfungsi saat ada transaksi terbuka.
Jimbo

1
Apakah Anda tahu seberapa besar transaksinya? cobalah untuk mengatur ukuran log transaksi lebih besar dari perkiraan itu, bagaimanapun jika alokasi disk tidak menjadi masalah, alokasikan di awal banyak ruang, untuk data dan juga log. Ini meningkatkan kinerja. Jangan kami melakukan penelusuran otomatis sebesar 10% , lakukan dengan beberapa GB, jadi kinerjanya akan cukup baik.
Luis LL

3
SQL Server akan menelusuri log secara otomatis selama transaksi jika membutuhkan lebih banyak ruang untuk menyelesaikan transaksi itu.
Ross McNab

Halo Ross, saya telah memberikan logika saya untuk berpikir bahwa transaksi terbuka mencegah pertumbuhan dalam pembaruan pertanyaan. Apakah saya salah dalam penalaran saya?
Jimbo

1
@Jimbo SQL Server tidak mengharuskan Anda untuk mencadangkannya. Jika Anda memiliki browser otomatis, SQL Server melakukan browser otomatis selama transaksi. Memilikinya cukup besar dapat menghemat banyak waktu, tetapi seharusnya tidak memengaruhi prosesnya.
Luis LL

10

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.


1
Sayangnya saya tidak memiliki kendali atas cara proses tersebut dilakukan. Dynamics CRM adalah aplikasi Microsoft dan proses impor organisasi adalah bagian dari aplikasi itu.
Jimbo

1

Perintah berikut akan memotong log.

USE [yourdbname] 
GO

-- TRUNCATE TRANSACTION LOG --
DBCC SHRINKFILE(yourdbname_log, 1)
BACKUP LOG yourdbname WITH TRUNCATE_ONLY
DBCC SHRINKFILE(yourdbname_log, 1)
GO

-- CHECK DATABASE HEALTH --
ALTER FUNCTION [dbo].[checker]() RETURNS int AS BEGIN  RETURN 0 END
GO

4
Hai Pinal, fungsi ini telah dihapus sepenuhnya dari SQL Server 2008 dan yang lebih baru: brentozar.com/archive/2009/08/…
Conor

3
Dengan versi yang lebih baru, coba BACKUP LOG <myDB> TO DISK = N'NUL: '
HansLindgren

1

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.


0

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:

DELETE FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

menggunakan pernyataan berikut berulang kali:

DELETE TOP(1000000) FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

0

Masalah saya diselesaikan dengan beberapa eksekusi penghapusan terbatas seperti

Sebelum

DELETE FROM TableName WHERE Condition

Setelah

DELETE TOP(1000) FROM TableName WHERECondition

-1

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.


Jika Anda membaca pertanyaan, Anda akan tahu bahwa DB sudah dalam mode pemulihan sederhana karena ini terjadi. Ini tidak membantu bila Anda memiliki satu transaksi terbuka yang berjalan lama. File terus bertambah hingga transaksi dilakukan atau dibatalkan. Baca baris pertama pertanyaan "Saya memiliki proses berjalan lama yang menahan transaksi terbuka untuk durasi penuh."
Jimbo

-1

Coba ini:

USE YourDB;  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE YourDB
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 50 MB.  
DBCC SHRINKFILE (YourDB_log, 50);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE YourDB
SET RECOVERY FULL;  
GO 

Saya harap ini membantu.


Ini adalah salah satu hal pertama yang dicoba dan bahkan disebutkan dalam teks pertanyaan. Ini tidak menyelesaikan masalah satu transaksi terbuka yang mengisi log dan menggunakan semua ruang disk yang tersedia. Seluruh proses ini berlangsung dalam mode sederhana. Namun, Anda adalah salah satu dari banyak orang yang menawarkan jawaban tepat ini karena tidak membaca pertanyaannya ...
Jimbo

-1

Ini kode pahlawan saya. Saya telah menghadapi masalah ini. Dan gunakan kode ini untuk memperbaikinya.

 USE master;

    SELECT 
        name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
    FROM 
        sys.databases 
    WHERE 
        name = 'XX_System';

    SELECT DATABASEPROPERTYEX('XX_System', 'IsPublished');


    USE XX_System;
    EXEC sp_repldone null, null, 0,0,1;
    EXEC sp_removedbreplication XX_System;


    DBCC OPENTRAN;
    DBCC SQLPERF(LOGSPACE);
    EXEC sp_replcounters;



    DBCC SQLPERF(LOGSPACE);

Harap letakkan jawaban Anda selalu dalam konteks, bukan hanya menempelkan kode. Lihat di sini untuk lebih jelasnya.
gehbiszumeis

-1

Coba ini:

Jika memungkinkan, restart layanan MSSQLSERVER dan SQLSERVERAGENT .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.