ฉันมีมากเกินไปไฟล์ข้อมูลทุติยภูมิ (.ndf) tempdb
ที่สร้างขึ้นสำหรับ ในการลบไฟล์ส่วนเกินฉันต้องล้างไฟล์ (เนื้อหาจะถูกย้ายไปยังไฟล์อื่น):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
แล้วลบไฟล์:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
แต่EMPTYFILE
คำสั่งจะส่งคืนข้อผิดพลาด:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
ไม่ต้องกังวลฉันแค่ต้องค้นหาวัตถุที่ใช้หน้านี้เพื่อทำบางสิ่งเกี่ยวกับมัน:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
คำสั่งส่งคืนข้อมูลจำนวนมาก object_id ในหมู่พวกเขา แต่:
Metadata: ObjectId = 0
ฉันไม่รู้ว่าจะทำอย่างไรกับเรื่องนี้ แมวตัวไหนที่ขัดขวางไม่ให้หน้านี้ถูกย้าย? วิธีค้นหาวัตถุกระบวนการเซสชั่นหรืออะไรก็ตาม ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม แต่โปรดทราบว่าการทิ้งทุกอย่างตามที่มันเป็นหรือลบไฟล์อื่น ๆ แทนไม่ได้เป็นทางออกที่ถูกต้องในปัญหานี้;)
แก้ไข:
ฉันกำลังลบไฟล์เพราะเราเคยทำตาม "แนวปฏิบัติที่ดีที่สุด" ในการสร้างหนึ่งไฟล์ต่อตัวประมวลผลหลัก (ขนาดเริ่มต้นเท่ากันอัตราการเติบโตเท่ากัน) แต่เท่าที่ฉันรู้จนกว่าคุณจะพบปัญหาการขัดแย้งไม่มีจุดที่จะสร้างไฟล์ tempdb เพิ่มเติมบนอุปกรณ์เดียวกัน ในกรณีของเรามันสมเหตุสมผลเพราะเราเปิดMPIOและอุปกรณ์เก็บข้อมูลสามารถรองรับ 4 เส้นทางได้ แต่มีข้อผิดพลาดและเราก็ลงเอยด้วยไฟล์ทั้งหมด 5 ไฟล์ด้วยซีพียู 6 คอร์ เป็นมากกว่าเส้นทาง MPIO น้อยกว่าคอร์ CPU และไม่ใช่เลขคู่ อาจไม่ทำให้เกิดปัญหา แต่ดูเหมือนจะไม่ถูกต้อง :)
ในที่สุดฉันก็สามารถล้างและลบไฟล์โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์โดยการตั้งค่าหนึ่งในฐานข้อมูล (ที่ฉันสงสัยว่าก่อให้เกิดปัญหา) เป็นโหมดผู้ใช้คนเดียว (ย้อนกลับทันที) มันใช้งานได้ แต่ฉันโชคดี สิ่งที่ฉันต้องการจริงๆคือสามารถติดตามหน้าเว็บได้เสมอ :)
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
เกี่ยวกับวิธีแก้ปัญหาของคุณ: มันใช้ได้ แต่ฉันอยากจะทำเช่นนี้โดยไม่ทำให้อินสแตนซ์นั้นดาวน์