Apa perintah untuk memotong file log SQL Server?

192

Saya perlu mengosongkan file LDF sebelum mengirim ke kolega. Bagaimana cara memaksa SQL Server untuk memotong log?

Aidan Ryan
sumber

Jawaban:

131

jika saya ingat dengan baik ... di query analyzer atau yang setara:

BACKUP LOG  databasename  WITH TRUNCATE_ONLY

DBCC SHRINKFILE (  databasename_Log, 1)
ila
sumber
2
Ini jelas lebih baik daripada mengatur model pemulihan basis data ke SIMPLE (seperti dalam jawaban Blorgbeard) karena jika model pemulihan Anda LENGKAP, Anda mengaturnya karena suatu alasan.
Scott Whitlock
52
truncate_only tidak digunakan lagi dalam SQL Server 2008 sehingga Anda harus mengganti db ke pemulihan sederhana msdn.microsoft.com/en-us/library/ms143729(SQL.90).aspx
Justin Moore
10
Untuk SQL Server 2012 ini berfungsi, tetapi tanpa WITH TRUNCATE_ONLY.
net_prog
4
Menambah apa yang dikatakan net_prog, untuk SQL Server 2012 saya mengganti baris pertama BACKUP LOG DatabaseNameHere TO DISK='NUL:'.
Aaron Newton
'TRUNCATE_ONLY' bukan opsi CADANGAN yang dikenali. (SQL Server 2019 RC1)
Tomasz Gandor
304

Di studio manajemen:

  • Jangan lakukan ini pada lingkungan hidup, tetapi untuk memastikan Anda mengecilkan dev db Anda sebanyak yang Anda bisa:
    • Klik kanan database, pilih Properties, lalu Options.
    • Pastikan "Model pemulihan" disetel ke "Sederhana", bukan "Penuh"
    • Klik OK
  • Klik kanan database lagi, pilih Tasks-> Shrink->Files
  • Ubah jenis file menjadi "Log"
  • Klik OK.

Atau, SQL untuk melakukannya:

 ALTER DATABASE mydatabase SET RECOVERY SIMPLE
 DBCC SHRINKFILE (mydatabase_Log, 1)

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

Blorgbeard keluar
sumber
1
Jawaban Anda baru saja menyelamatkan hari saya! Saya tidak tahu opsi "klik kanan - Tugas -> Kecilkan". Terima kasih!
René
7
Apa yang Anda lakukan di lingkungan hidup? Cadangkan log terlebih dahulu?
John Bubriski
1
Saya bukan DBA, tapi ya, saya percaya bahwa mencadangkan log akan memotongnya: technet.microsoft.com/en-us/library/ms179478.aspx
Blorgbeard keluar
2
@JohnBubriski Jika Anda menggunakan model pemulihan selain sederhana, log adalah dasar untuk memulihkan data atau memutar kembali transaksi. Jadi, dalam produksi, Anda harus mencadangkan log ini terlebih dahulu sebelum Anda dapat mengecilkan file log. Kalau tidak, tidak akan ada kemungkinan pemulihan yang sebenarnya. Sayangnya, jika Anda berada dalam situasi pemulihan, Anda harus memuat ulang semua cadangan log transaksi untuk memulihkan DB sepenuhnya. Waktu yang menyenangkan, pastinya! :)
mendefinisikan
1
di SQL Server 2012 saya harus use mydatabasesebelum mengeksekusidbcc shrinkfile
knb
62

Untuk SQL Server 2008, perintahnya adalah:

ALTER DATABASE ExampleDB SET RECOVERY SIMPLE
DBCC SHRINKFILE('ExampleDB_log', 0, TRUNCATEONLY)
ALTER DATABASE ExampleDB SET RECOVERY FULL

Ini mengurangi file log 14GB saya menjadi 1MB.

Nathan R
sumber
5
Karena pertanyaannya adalah ambigu untuk versi mana dan jawaban yang diterima tidak berlaku untuk SQL Server 2008 jawaban ini masih valid tanpa memandang usia.
James Law
Terima kasih, ini membantu saya mengurangi file Log besar yang tidak bereaksi dengan DBCC SHRINKFILE
Christian Navelot
6
Jangan lupa untuk mengubah model pemulihan kembali ke LENGKAP ketika Anda selesai!
Dan Bechard
Anda harus mencadangkan sebelum melakukan ini (atau opsi pemotongan lainnya). Jika Anda melakukan pencadangan penuh dan memeriksa 'Salin hanya pencadangan' di SSMS, maka Anda tidak perlu log lagi. (Ini hanya titik waktu cadangan).
Simon_Weaver
37

Untuk SQL 2008 Anda dapat membuat cadangan log ke nulperangkat:

BACKUP LOG [databaseName]
TO DISK = 'nul:' WITH STATS = 10

Dan kemudian gunakan DBCC SHRINKFILEuntuk memotong file log.

Matej
sumber
2
Ini adalah satu-satunya yang akhirnya bekerja dalam situasi saya ... Saya mendapat kesalahan ketika mencoba menggunakan cadangan dengan TRUNCATE_ONLY
TomXP411
Catatan: ini bisa memakan waktu cukup lama, bahkan pada SSD (harus membaca log untuk dapat membuangnya). Untuk file log 30GB pada Azure VM bertenaga sedang, dibutuhkan waktu 10 menit untuk melakukan 40%. Pastikan untuk beralih ke 'Pesan' dengan SSMS untuk melihat persentase yang diproses.
Simon_Weaver
3

log logname cadangan dengan truncate_only diikuti oleh perintah shrinkfile dbcc

SQLMenace
sumber
0

Karena jawaban untuk saya terkubur dalam komentar. Untuk SQL Server 2012 dan selanjutnya, Anda dapat menggunakan yang berikut ini:

BACKUP LOG Database TO DISK='NUL:'
DBCC SHRINKFILE (Database_Log, 1)
rip747
sumber
-5

Opsi lainnya adalah melepaskan basis data melalui Management Studio. Kemudian cukup hapus file log, atau ganti namanya dan hapus nanti.

Kembali ke Management Studio, pasang lagi basis data. Di jendela lampiran hapus file log dari daftar file.

DB menempel dan membuat file log kosong baru. Setelah Anda memeriksa semuanya baik-baik saja, Anda dapat menghapus file log yang diubah namanya.

Anda mungkin tidak boleh menggunakan ini untuk database produksi.

Rask
sumber
4
Jangan pernah lakukan ini! Mungkin ada data di log yang belum berkomitmen ke file data. Anda akan kehilangan data tersebut.
Paul
Jika, dalam jawaban Anda, Anda memperingatkan untuk tidak mencobanya dalam produksi, itu tidak layak posting sama sekali.
Stan Shaw
9
Saya tidak setuju dengan downvoters - itu adalah pilihan. Administrator hanya perlu memahami skenario mereka. Misalnya - tidak akan ada data 'tidak terikat' jika tidak ada transaksi terbuka.
Gerard ONeill
3
Ini adalah satu-satunya solusi yang berhasil untuk saya. Drive saya terisi dan saya tidak dapat membuat cadangan atau menyusut dan sepertinya tidak ada yang berfungsi. Terima kasih!
Brian
3
Saya setuju; ini bukan praktik terbaik tetapi alat yang berharga untuk dimiliki jika Anda tidak memiliki pilihan lain seperti skenario Brian.
ScottFoster1000