Saya menjalankan beberapa SHRINKFILE
operasi untuk membersihkan banyak file kecil yang tidak perlu dalam sebuah filegroup. Untuk salah satu psikiater, perintah di bawah ini menghasilkan kesalahan:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
ID file x dari ID basis data x tidak dapat menyusut karena sedang menyusut oleh proses lain atau kosong
Itu tidak kosong atau menyusut. Sedang dijalankan pada basis data yang saat ini tidak digunakan oleh siapa pun kecuali saya. Penyusutan otomatis tidak diaktifkan dan tidak pernah ada. Namun, ada yang menyusut pengguna dilakukan pada database ini secara teratur sebelum saya mendapatkan tangan saya di atasnya, jika hal-hal yang sama sekali.
Pada SQLServerCentral , utas dari satu dekade lalu menyarankan menambahkan beberapa MB ke file karena itu "me-reset penghitung internal atau switch yang mengatakan itu bukan di tengah menyusut sekarang."
Ini berhasil - luar biasa. Tapi adakah yang bisa menjelaskan dengan lebih rinci bagaimana / mengapa ini bekerja dalam kaitannya dengan SQL Server internal?
sumber
Jawaban:
Saya mencari-cari di halaman file header, seperti yang disarankan oleh Martin Smith dalam komentar. Saya pikir ini adalah bagian dari jawaban, tetapi sebagian besar spekulasi berdasarkan mengamati perubahan pada nilai-nilai bendera halaman header file antara melakukan menyusut dan operasi lainnya.
Pertama saya membuat basis data untuk diuji, termasuk filegroup sekunder:
Saya melihat "halaman 0" untuk file sekunder, yaitu file_id 3:
Ada bidang yang disebut
m_flagBits
memiliki nilai0x208
.Jika saya mengosongkan file ini:
Bahwa
m_flagbits
lapangan tetap sama (0x208
). Tidak terlalu menarik, tapi sekarang saya dalam situasi yang Anda laporkan: jika saya mencoba mengosongkan file lagi, saya mendapatkan kesalahan ini:Saya akan mencoba menumbuhkan file (solusi yang bekerja untuk Anda):
Sekarang
m_flagbits
adalah0x8
!Pada titik ini, mengosongkan file lagi berhasil mengembalikan nilai
0x208
seperti yang Anda harapkan.Hal yang saya temukan menarik adalah jika saya melakukan ini setelah menumbuhkan kembali file (nilai flagbits AKA adalah
0x8
):File ditandai seperti
is_read_only
padasys.databases
tabel, danm_flagbits
diatur kembali ke0x208
. Jadi tampaknya ada beberapa flag tingkat file serupa yang diatur ketika menyusutkan file dan ketika mengatur hanya untuk membaca.Tebakan terbaik saya adalah bahwa nilai ini digunakan bersama dengan beberapa lainnya (internal) bendera untuk menunjukkan bahwa file memenuhi syarat untuk menyusut. Tumbuhkan file tampaknya membatalkan set flag itu (setidaknya yang terlihat di
m_flagbits
).sumber