SQL Server มีวิธีการรับรอบบันทึกธุรกรรมเมื่ออัปเดตคอลัมน์เป็น int


18

ฉันมีตาราง SQL Server 2005 ชื่อBRITTNEY_SPEARS_MARRIAGESและมีคอลัมน์ต่อไปนี้:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

ตอนนี้ฉันมีอีกโต๊ะ BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

ปัญหาคือเราต้องการที่จะปรับปรุงMarrigeIdคอลัมน์ไปยังจากint tinyintเราแค่รู้สึกว่า Brittney กำลังจะมีการแต่งงานมากมายก่อนที่ทุกอย่างจะถูกพูดและทำ

ตอนนี้BRITTNEY_SPEARS_MARRIAGE_STORIESตารางมีแถวอยู่ 18 ล้านแถว (เดี๋ยวก่อนผู้หญิงมีปัญหา) ดังนั้นเมื่อเราไปอัปเดตบันทึกธุรกรรมจะเต็มและกล่อง SQL Server ของเราก็ตาย

เราจะแก้ไขสิ่งนี้ได้อย่างไร

จะมีการพูดว่า "สวัสดี SQL Server ฉันจะอัปเดตคอลัมน์นี้และทำให้ใหญ่ขึ้นเชื่อฉันใน SQL Server นี้กรุณาอย่ากรอกบันทึกการทำธุรกรรมในขณะที่คุณพยายามตรวจสอบทุกอย่าง?"

คำตอบ:


7

ไม่มีวิธีที่จะบอก SQL Server ไม่ให้ใช้บันทึกธุรกรรม

สิ่งที่คุณสามารถทำได้คือตั้งค่ารูปแบบการกู้คืนของฐานข้อมูลเป็น SIMPLE ซึ่งจะเขียนทับรายการบันทึกเก่าเมื่อต้องการพื้นที่ คุณไม่ควรทำสิ่งนี้บนเซิร์ฟเวอร์ที่ใช้งานจริงของคุณเนื่องจากคุณจะไม่สามารถกู้คืนบางประเภทได้เช่นการกู้คืนในเวลา

อีกวิธีหนึ่งคุณสามารถตั้งค่าไฟล์บันทึกการทำธุรกรรมให้ใหญ่ขึ้นได้ - ตามกฎที่ไม่มีหลักวิทยาศาสตร์ฉันต้องแน่ใจว่า A) บันทึกธุรกรรมของคุณมีพื้นที่ว่างอย่างน้อย 1.5x มากกว่าขนาดของตารางหรือ B) บันทึกการทำธุรกรรมของคุณสามารถเติบโตอัตโนมัติไปยังไดรฟ์ที่มีพื้นที่ว่างบนดิสก์อย่างน้อยจำนวนนี้

คุณสามารถเพิ่มพื้นที่บันทึกธุรกรรมโดยสำรองข้อมูลบันทึก หากคุณไม่สนใจเกี่ยวกับเนื้อหาบันทึกให้ทิ้งไฟล์นั้นทิ้ง BACKUP LOG <Your Database Name> TO DISK = 'NUL:'ทางลัดสำหรับเรื่องนี้คือ อย่าทำสิ่งนี้บนเซิร์ฟเวอร์ที่ใช้งานจริงเว้นแต่คุณจะแน่ใจอย่างแน่นอนว่าคุณเข้าใจความหมาย

สิ่งที่ต้องระวังอีกอย่าง (แม้ว่าจะไม่ใช่คำถามของคุณทั้งหมด) คือการตรวจสอบให้แน่ใจว่าตารางที่คุณกำลังขยายมีดัชนีคลัสเตอร์ที่กำหนดไว้ หากไม่มีตารางดังกล่าวอาจทำให้เกิดการแตกแฟรกเมนต์จำนวนมากและอาจมีความจำเป็นมากในการเปลี่ยนแปลงเช่นนี้


5
  • วางกุญแจต่างประเทศใด ๆ
  • สร้างตารางใหม่ด้วยintแทนที่จะเป็นtinyint
  • ย้ายแถวไปตามชุดละ 1,000 (ใส่ไว้ในตารางใหม่ลบออกจากแถวเก่า)
  • วางตารางเก่า
  • เปลี่ยนชื่อตารางใหม่เป็นชื่อเก่าโดยใช้ sp_rename
  • สร้างคีย์ต่างประเทศใหม่

pS หากบันทึกธุรกรรมของคุณมีขนาดใหญ่ ... ตรวจสอบรุ่นการกู้คืนของคุณ หากรูปแบบการกู้คืนของคุณไม่simpleนานเท่าไหร่นับตั้งแต่คุณสำรองข้อมูลบันทึกครั้งล่าสุด


คุณหมายถึงเมื่อคุณสำรองข้อมูลบันทึกการสำรองฐานข้อมูลจะไม่ทำให้บันทึกมีขนาดเล็กลง
HLGEM

@HLGEM: ถูกต้องฉันเพิ่งอ่านบทความจาก Paul Randal ในหัวข้อนั้น แม้ว่าจะเป็นสิ่งที่คาดไม่ถึง แต่ถ้าคุณทำสำรองข้อมูลอย่างเต็มรูปแบบไฟล์บันทึกของคุณจะเติบโตขึ้นเรื่อย ๆ
Andomar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.