การลบไฟล์ข้อมูลทุติยภูมิ DBCC SHRINKFILE: ไม่สามารถย้ายหน้าได้เนื่องจากเป็นหน้าตารางงาน


10

ฉันมีมากเกินไปไฟล์ข้อมูลทุติยภูมิ (.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 ไม่ถูกต้องควรเป็นหน้า dbcc (2,41920,1) 1,2,3 ขึ้นอยู่กับสิ่งที่คุณต้องการในการส่งออก
Shanky

หากด้านบนไม่ทำงานคุณอาจต้องทำในฮาร์ดแวร์โดยการลบไฟล์แล้วรีสตาร์ทเซิร์ฟเวอร์ sql เพื่อที่จะใช้ไฟล์ที่ไม่ถูกลบ คุณสามารถอ้างถึงลิงค์นี้daveturpin.com/2011/07/how-to-drop-a-tempdb-database-file
Shanky

2
@Shanky คำสั่งถูกต้อง 0..3 สามารถส่งผ่านเป็นพารามิเตอร์ตัวที่ 4: dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])เกี่ยวกับวิธีแก้ปัญหาของคุณ: มันใช้ได้ แต่ฉันอยากจะทำเช่นนี้โดยไม่ทำให้อินสแตนซ์นั้นดาวน์
Adam Luniewski

ตกลง .. ฉันกำลังบอกคุณเกี่ยวกับหน้า dbcc ในรูปแบบที่ง่ายขึ้น โปรดทราบว่าเป็นคำสั่งที่ไม่มีเอกสาร คุณได้ตรวจสอบลิงค์ที่ฉันโพสต์
Shanky

1
ฉันไม่คิดว่าเป็นไปได้ที่จะแก้ปัญหานี้โดยไม่ต้องเริ่มต้นอินสแตนซ์ใหม่ เห็นได้ชัดว่าคุณได้ลองติดตามสิ่งที่โต๊ะทำงานนี้ (ซึ่งจะช่วยพิจารณาว่าใครเป็นเจ้าของ) และสิ่งที่ล้มเหลว ใช้ชีวิตหรือใช้งานพร้อมไฟล์พิเศษจนกว่าคุณจะสามารถรีสตาร์ทได้
Aaron Bertrand

คำตอบ:


5

การรีสตาร์ทเซิร์ฟเวอร์ควรจะเพียงพอ - เวิร์กสเตตเหล่านั้นควรล้างออก แต่ฉันอาจเริ่มต้นขึ้นในโหมดผู้ใช้คนเดียว (-m)เพื่อป้องกันไม่ให้กระบวนการอื่นสร้างเวิร์กเทเบิ้ลก่อนที่คุณจะลบไฟล์เหล่านั้นสำเร็จ จากนั้นกำหนดไฟล์ที่จำเป็นสำหรับtempdb; บางทีการลบไฟล์ที่ไม่จำเป็นการเปลี่ยนขนาด ฯลฯ คุณควรตรวจสอบให้แน่ใจว่าคุณมีจำนวนไฟล์เท่ากันว่าไฟล์ทั้งหมดมีขนาดเท่ากันและมีการตั้งค่า autogrowth เหมือนกัน (เป็น MB ไม่ใช่%) และอาจเป็นเวลาที่ดีที่จะพิจารณา TF 1117 และ TF 1118 เช่นกัน ( จุดเริ่มต้น )

ฉันจะระมัดระวังเกี่ยวกับคำแนะนำเพียงแค่ลบไฟล์ออกจากระบบไฟล์ก่อนที่จะเริ่ม SQL Server อีกครั้ง - มันอาจไม่เริ่มเลย

(ฉันอยากรู้ว่าปัญหาที่แท้จริงคืออะไรการมีไฟล์มากเกินไปไม่ทำให้คุณเจ็บจริง ๆ )


@@ แอรอน ofcourse คุณจะต้องระมัดระวังเกี่ยวกับการลบมันจะต้องเป็นที่ว่างเปล่า แต่ที่เป็นเอกสารที่นี่msdn.microsoft.com/en-gb/library/ms175574.aspx ได้ลองแล้วและ SQl Server tempdb มาออนไลน์
Shanky

5
@Shanky ฉันพยายามขับรถ 138 ไมล์ต่อชั่วโมงครั้งเดียวและฉันก็ไม่ได้รู้สึกแย่ นั่นหมายความว่าฉันควรทำต่อไปและไม่มีโอกาสที่ฉันจะถูกดึงไปในวันพรุ่งนี้? ปลอดภัยกว่ามากในการลองใช้วิธีการที่ถูกต้องเสียก่อน IMHO โดยเฉพาะอย่างยิ่งเมื่อเขาไม่สามารถล้างไฟล์ได้ในตอนนี้ - คุณคิดว่าเป็นไปได้หรือไม่ที่มีอย่างอื่นนอกเหนือจากโต๊ะทำงานที่ข้อความแสดงข้อผิดพลาดบ่น? ข้อผิดพลาดไม่ได้สร้างรายการที่ครบถ้วนสมบูรณ์ของวัตถุทั้งหมด แต่จะส่งออกเฉพาะวัตถุแรกเท่านั้น
Aaron Bertrand

มีบางอย่างที่ใช้ tempdb จริง ๆ ดังนั้นจึงไม่อนุญาตให้ลบไฟล์ที่เดายาก เขาอาจใช้ตัวดำเนินการเรียงลำดับเป็นแบบสอบถามที่ยังคงต้องการ tempdb DMV สามารถช่วยในการค้นหา sys.dm_db_task_space_usage sys.dm_db_session_space_usage sys.dm_db_file_space_usage sys.dm_db_task_space_usage
Shanky

การรีสตาร์ทเป็นตัวเลือกที่นี่ แต่แม้ว่าเขาจะไม่ลบไฟล์และลองวางไฟล์ tempdb ก็จะบอกว่าไฟล์ tempdb ไม่สามารถถูกลบได้ แต่ในเวลาเดียวกันก็มีการอัพเดทแคตตาล็อกระบบและหลังจากรีสตาร์ทไฟล์จะหายไป นี่คือฉันเดาพฤติกรรมเริ่มต้นกับ tempdb ดังนั้นฉันแนะนำและยังคิดว่าการลบไฟล์ข้อมูลจะทำงานแม้ว่าจะใช้ เช่นเดียวกับในลิงค์ที่ฉันโพสต์ในความคิดเห็นที่สองของฉัน
Shanky

1
@Shanky DMV เหล่านั้นสามารถส่งคืนหลายพันแถวสำหรับสิ่งต่าง ๆ ที่ไม่มีอะไรเกี่ยวข้องกับไฟล์ที่เป็นปัญหา - ดังนั้นคุณวางแผนที่จะ จำกัด ให้แคบลงได้อย่างไร? ตั้งแต่ด้วยวิธีการของคุณคุณต้องรีสตาร์ทด้วยทำไมไม่ลองวิธีที่ง่ายกว่าก่อน ฉันแค่ไม่เห็นด้วยกับคุณว่า "วิธียาก" ควรเป็นคำแนะนำแรกขออภัย
Aaron Bertrand

2

https://social.msdn.microsoft.com/Forums/en-US/2a00c314-f35e-4900-babb-f42dcde1944b/dbcc-shrinkfile-page-411283400-could-not-be-moved-because-it-is- ที่มีการทำงานที่โต๊ะหน้า? ฟอรั่ม = sqldatabaseengine

ตามที่เสนอโดย Mike ในฟอรัม msdn ตารางงานส่วนใหญ่เกี่ยวข้องกับแผนแคช การล้างข้อมูลจะลบตารางงานด้วยและคุณอาจลดขนาด Tempdb สิ่งนี้ใช้ได้สำหรับฉัน และนี่จะช่วยให้คุณรีสตาร์ทเซิร์ฟเวอร์ได้เช่นกัน จะมีค่าใช้จ่ายบางส่วนเนื่องจากเซิร์ฟเวอร์ SQL จะต้องสร้างแผนการดำเนินการอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.