มีฐานข้อมูลจำนวนมากบนเซิร์ฟเวอร์ SQL ของลูกค้าของฉัน ฐานข้อมูลเหล่านี้อยู่ระหว่างการพัฒนาเพื่อให้นักพัฒนาสามารถออกแบบปรับโครงสร้างทำการแก้ไขข้อมูลและอื่น ๆ มีฐานข้อมูลบางส่วนที่เปลี่ยนแปลงได้ยาก ลูกค้าของฉันต้องรักษาความปลอดภัยทั้งหมด (สำรองข้อมูล) และใช้เวลาในการจัดการสภาพแวดล้อม (บริษัท ไม่มีตำแหน่งผู้ดูแลฐานข้อมูลที่ บริษัท ) หลังจากการสนทนาที่ยาวนานลูกค้าได้ตัดสินใจใช้กลยุทธ์การสำรองข้อมูลเต็มรูปแบบรายวันเนื่องจากความสะดวกในการกู้คืน
ดังนั้นนี่คือบทสรุปของสถานการณ์:
- จำนวนฐานข้อมูลสามารถเปลี่ยนแปลงได้ทุกวัน
- ฐานข้อมูลที่เปลี่ยนแปลง (หมายถึงข้อมูลและ / หรือโครงสร้างที่มีการเปลี่ยนแปลง) จะถูกสำรอง
- ฐานข้อมูลที่ไม่เปลี่ยนแปลงจะไม่ถูกสำรอง
- โซลูชันจะไม่ส่งผลกระทบต่อโครงสร้างฐานข้อมูล (ไม่ จำกัด ข้อกำหนด)
- "เครื่องมือสำรอง" นี้จะทำงานโดยอัตโนมัติ
ปัญหาหลัก: วิธีการตรวจสอบว่ามีการเปลี่ยนแปลงฐานข้อมูล ส่วนแรกของปัญหา (DDL เปลี่ยนแปลง) สามารถแก้ไขได้โดยการใช้ทริกเกอร์ DDL แต่การเปลี่ยนแปลงข้อมูล (การเปลี่ยนแปลง DML) เป็นปัญหา เป็นไปไม่ได้ที่จะใช้ทริกเกอร์ DML กับทุกตารางของฐานข้อมูลทั้งหมดเพื่อติดตามการเปลี่ยนแปลง (ประสิทธิภาพการจัดการวัตถุที่ขยายเพิ่ม ... ) เอ็นจิ้นการสำรองข้อมูลต้องติดตามการเปลี่ยนแปลงทั้งหมดเพื่อทำเครื่องหมายแต่ละฐานข้อมูลว่าพร้อมสำหรับการสำรองข้อมูล
Change Data Captureเป็นวิธีแก้ปัญหา แต่ดูเหมือนว่าหนักเกินไป (ต้องใช้ SQL Server Enterprise Edition ด้วย)
อีกวิธีหนึ่งคือการติดตามการเปลี่ยนแปลงไฟล์ฐานข้อมูล (ขนาดหรือเวลาการเปลี่ยนแปลงล่าสุด) แต่ทำงานไม่ถูกต้อง: ฐานข้อมูลสามารถเปลี่ยนขนาดได้เมื่อเกินพื้นที่ว่างที่สงวนไว้ทั้งหมดและsp_spaceusedไม่ใช่วิธีแก้ปัญหา
การติดตามเป็นวิธีแก้ปัญหา แต่ทำให้เกิดปัญหาด้านประสิทธิภาพและต้องมีการจัดการเพิ่มเติม
มีวิธีใดบ้างในการคำนวณขนาดการใช้ฐานข้อมูลจริงโดยไม่มีผลกระทบต่อวัตถุการจัดการฐานข้อมูลอื่น (เช่นสถิติ .. ) ได้รับว่าการเปลี่ยนแปลงข้อมูลของตารางที่ไม่เปลี่ยนขนาดของตารางจะไม่ทำให้เกิด (ฉันคิดว่า) แต่มันดีกว่าไม่มีอะไร ฉันกำลังมองหาโซลูชันโดยตรงหรือโดยอ้อมสำหรับ SQL Server 2008
ขอบคุณสำหรับความคิดเห็นการแก้ปัญหาและความคิดใด ๆ
เพิ่ม:
นี่คือวิธีแก้ปัญหา (ขอบคุณMarian ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)