SQL Server cara menyiasati log transaksi yang terisi ketika memperbarui kolom ke int

18

Saya memiliki tabel SQL Server 2005 yang dipanggil BRITTNEY_SPEARS_MARRIAGESdan memiliki kolom berikut:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Sekarang saya punya meja lain BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

Masalahnya adalah kita ingin memperbarui MarrigeIdkolom ke intdari tinyint. Kami hanya merasa bahwa Brittney akan memiliki banyak pernikahan sebelum semuanya dikatakan dan dilakukan.

Sekarang BRITTNEY_SPEARS_MARRIAGE_STORIEStabel memiliki 18 juta baris di dalamnya (hei gadis itu memiliki beberapa masalah) jadi ketika kita pergi untuk melakukan pembaruan log transaksi terisi dan kotak SQL Server kita mati.

Bagaimana kita bisa mengatasi ini?

Apakah ada cara untuk mengatakan, "Hai SQL Server, saya akan memperbarui kolom ini dan membuatnya lebih besar. Percayalah pada SQL Server ini. Tolong jangan mengisi log transaksi saat Anda mencoba untuk memvalidasi semuanya?"

codingguy3000
sumber

Jawaban:

7

Tidak ada cara untuk memberitahu SQL Server untuk tidak menggunakan log transaksi.

Apa yang dapat Anda lakukan adalah mengatur model pemulihan database ke SIMPLE, yang akan menimpa entri log lama saat ruang diperlukan. Anda tidak boleh melakukan ini di server produksi Anda, karena Anda tidak akan dapat melakukan jenis pemulihan tertentu, seperti pengembalian point-in-time.

Atau, Anda dapat mengatur file log transaksi Anda menjadi lebih besar - sebagai aturan praktis yang tidak ilmiah, saya akan memastikan bahwa A) log transaksi Anda setidaknya memiliki memiliki ruang kosong sekitar 1,5x lebih banyak daripada ukuran tabel Anda atau B) bahwa log transaksi Anda dapat tumbuh secara otomatis ke drive yang setidaknya memiliki jumlah ruang disk kosong ini.

Anda dapat mengosongkan ruang log transaksi dengan mencadangkan log. Jika Anda tidak peduli dengan isi log, buang file itu. Cara pintas untuk ini adalahBACKUP LOG <Your Database Name> TO DISK = 'NUL:' . Sekali lagi, jangan lakukan ini pada server produksi kecuali Anda benar-benar yakin Anda memahami implikasinya.

Hal lain yang perlu diperhatikan (meskipun tidak sepenuhnya berkaitan dengan pertanyaan Anda) adalah memastikan bahwa tabel yang Anda kembangkan memiliki indeks berkerumun yang ditentukan di atasnya. Jika tidak, tabel tersebut dapat menimbulkan fragmentasi tumpukan yang sangat besar, dan berpotensi menjadi besar yang tidak perlu pada perubahan seperti ini.

Dave Markle
sumber
5
  • Jatuhkan kunci asing apa pun
  • Buat tabel baru dengan int alih alihtinyint
  • Pindahkan baris lebih dari per batch 1000 (masukkan dalam tabel baru, hapus dari yang lama)
  • Jatuhkan meja lama
  • Ganti nama tabel baru dengan nama lama menggunakan sp_rename
  • Buat kunci asing

pS Jika log transaksi Anda besar ... periksa model pemulihan Anda. Jika model pemulihan Anda tidak simple, berapa lama sejak Anda terakhir kali membuat cadangan log?

Andomar
sumber
Maksud Anda karena Anda membuat cadangan log, membuat cadangan basis data tidak akan membuat log lebih kecil.
HLGEM
@HLGEM: Anda benar, saya baru saja membaca sebuah artikel dari Paul Randal tentang topik itu. Agak tak terduga, jika Anda hanya akan melakukan backup penuh, log Anda akan terus bertambah.
Andomar