Mengecilkan file log tidak mengurangi ukuran

24

Saya memiliki database yang memiliki file data 350 MB (.mdf) dan file log 4,9 GB (.ldf). Model pemulihan diatur ke FULL.

Ketika saya mencoba mengecilkan file log, itu tidak menyusut.

Saya tahu menyusutkan database tidak baik dan tidak boleh dilakukan. Tetapi saya masih mencoba melakukannya untuk menyusutkan file log.

Ketika saya berlari

DBCC SQLPerf(logspace) 

Saya menemukan bahwa ukuran log adalah 4932 MB dan ruang Log yang digunakan adalah 98,76% !

Kemudian saya mencoba perintah ini

USE <databasename>;
DBCC loginfo;

Sekarang hampir semua VLF adalah "status 2" yang berarti semua sedang digunakan.

Saya mencoba untuk mengambil cadangan log dan kemudian mengecilkan file log. Menyusut tidak mengurangi ukuran.

Saya mengubah model pemulihan SIMPLEdan mencoba menyusut lagi, tetapi ini juga tidak membantu.

Saya memeriksa transaksi terbuka

DBCC opentran (database);

dan menemukan bahwa tidak ada transaksi yang terbuka sekarang.

Apa yang menghentikan saya dari menyusutkan file log? Bagaimana saya bisa memecahkan masalah ini?

Navaneet
sumber

Jawaban:

12

Inilah jawaban untuk pertanyaan saya sendiri.

Jalankan kueri di bawah ini untuk mendapatkan informasi tentang menunggu penggunaan kembali file log:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'

Saya mendapat hasil sebagai berikut:

log_reuse_wait_desc
-------------------
REPLICATION 

Ada beberapa objek terkait replikasi yang tersisa di database, bahkan setelah menghapus replikasi.

Untuk menghapus replikasi dari database, sp_removedbreplicationbisa digunakan. Tetapi itu tidak berhasil bagi kami karena replikasi tidak aktif pada saat itu dan sebenarnya replikasi telah dihapus jauh sebelumnya.

Solusinya adalah mengimpor konten database ke database lain menggunakan opsi impor SQL Server.

Navaneet
sumber
Saya memiliki masalah yang sama dan menggunakan ini untuk melihat bahwa ada transaksi aktif di db. log_reuse_wait_descmemberi ACTIVE_TRANSACTION. Begitu transaksi selesai, psikiater itu bekerja dengan baik.
squillman
10

Langkah-langkah untuk menyusutkan log akan dilakukan

Cadangan log transaksi melalui SSMS atau T-SQL dan kemudian lakukan penyusutan

perintah untuk SSMS berada di bawah tugas jika Anda mengklik kanan nama database

BACKUP LOG <Databasename> TO DISK N'<path\database_log.ldf';
GO

DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS

Anda mungkin harus melakukan ini beberapa kali

Jika ada transaksi atau pekerjaan yang memblokir tindakan, gunakan Monitor aktivitas untuk mengidentifikasi proses dan mematikannya, atau gunakan monitor aktivitas kerja Agen SQL untuk mengakhiri pekerjaan.

sumber: http://support.microsoft.com/kb/907511

Cougar9000
sumber
Tapi masalah yang saya temui berbeda.
Silakan
Senang mendengar Anda menemukannya, terima kasih atas pembaruannya!
Cougar9000
Sintaks salah - tanda sama dengan tidak ada: LOG BACKUP <Dababenename> TO DISK = N '<path \ database_log.ldf';
Reversed Engineer
9

Baca Cara Mengecilkan log SQL Server untuk penjelasan bagaimana sifat melingkar dari log dapat mencegah menyusut setelah pemotongan. Mungkin saja Anda mencatat titik LSN terakhir ke dalam VLF yang ada di ujung LDF. Penghitung secara intuitif Anda harus memajukan log, dengan menghasilkan log menulis, untuk memungkinkan menyusut.

Remus Rusanu
sumber
0

Anda harus membuat cadangan terlebih dahulu, tergantung pada model cadangan yang diatur untuk basis data sebelum Anda dapat mengecilkan basis data.

Anda dapat mencoba menjalankan ini:

USE <databasename>
GO

BACKUP DATABASE <databasename> TO DISK '<absolute path goes here>\<databasename>.bak';
GO

Atau Anda dapat melakukannya dari SSMS dan menggunakan alat grafis yang tersedia (lihat di sini untuk detail: http://msdn.microsoft.com/en-us/library/ms187510.aspx )

Setelah membuat cadangan basis data, Anda dapat mengompresnya. Namun, menyusutkan database bukanlah ide yang baik karena fragmentasi indeks yang berat akan terjadi dan pencarian data akan menjadi lambat.

Semoga ini membantu.

Toni Kostelac
sumber
Saya tahu cara melakukan backup dan memotong log dan mengurangi ukuran file log. Tetapi untuk database ini saya mengalami masalah. Saya hanya menjalankan query pilih log_reuse_wait_desc dari sys.databases di mana nama = 'dbname' dan menemukan bahwa replikasi menyebabkan masalah. Tetapi saya tidak memiliki replikasi yang ditetapkan di atasnya. Jadi bagaimana cara menghapus repliaction dari db ini yang ditampilkan di log reuse wait_desc?
Navaneet
Versi SQL Server apa yang Anda gunakan?
Toni Kostelac
Replikasi mungkin ditetapkan sebagai Pekerjaan, jadi buka folder SQL Server Agent, dan Buka folder Pekerjaan, periksa untuk melihat apakah ada pekerjaan replikasi yang diatur dan jika demikian matikan dengan mengklik kanan dan memilih Stop job
Toni Kostelac
Jika Anda menggunakan SQL Server 2005 dan lebih tinggi maka sp_removedbreplication 'DB_NAME' akan menghapus replikasi. Untuk sql server 2000 .. lihat blogs.msdn.com/b/repltalk/archive/2010/11/17/…
Kin Shah
Tapi masalah yang saya temui berbeda.
Silakan
0

Saya telah menemukan bahwa saya harus melakukan 2 atau 3 backup dari database dan log transaksi untuk mendapatkan log transaksi untuk benar-benar mengurangi ukurannya. Saya memiliki database yang dibuat dengan model pemulihan penuh. Setiap malam ia melakukan backup database dan log transaksi tetapi log transaksi tampaknya terus tumbuh selama 2-3 minggu. Ketika ruang disk yang tersisa mencapai 1GB saya akan melihat bahwa log transaksi sekitar 30GB. Saya mengikuti langkah-langkah yang direkomendasikan oleh Microsoft dan setelah iterasi ke-4 atau ke-5 mencadangkan basis data dan log transaksi, log transaksi akhirnya akan melepaskan ruang ekstra dan menyusut. Lalu saya kembali dan menghapus beberapa cadangan yang telah saya buat.

SQL King
sumber
Saya pikir Anda melakukan sesuatu yang salah. Jika Anda mengambil cadangan log dengan benar maka log yang tidak digunakan harus terpotong. Perintah yang diberikan dalam pertanyaan saya dapat membantu Anda menyelesaikan masalah.
Navaneet
-8

Pekerjaan saya untuk Replikasi yang memblokir menyusut file log adalah:

  1. Atur DB Recovery Model menjadi Simple
  2. Bawa DB offline
  3. Buat cadangan file log (untuk berjaga-jaga)
  4. Hapus file log
  5. Bawa DB online

Dalam kasus saya ini berhasil. Setelah membawa DB log online dibuat secara otomatis dan ukurannya adalah 512kb, bukan 70GB. Tapi ini hanya solusi. Masalah root tidak terselesaikan. Dalam kasus saya, kami menggunakan replikasi.

mecool
sumber
4
Ini adalah saran yang mengerikan, jangan pernah menghapus log transaksi Anda, semua jenis masalah dapat berasal dari ini seperti korupsi
Tom V - Team Monica