ฉันลองการทดลองต่อไปนี้และได้ผลลัพธ์ที่คล้ายกัน ในทั้งสองกรณี fn_dblog () แสดงการย้อนกลับที่เกิดขึ้นและดูเหมือนว่าจะเกิดขึ้นเร็วกว่าใน Scenario 2 มากกว่าใน Scenario 1
โดยวิธีการที่ฉันวางทั้ง MDF และ LDF ในดิสก์ภายนอกเดียว (USB 2.0) เดียวกัน
ข้อสรุปเบื้องต้นของฉันคือไม่มีความแตกต่างในการดำเนินการย้อนกลับในกรณีนี้และอาจมีความแตกต่างของความเร็วที่เห็นได้ชัดคือระบบย่อย I / O ที่เกี่ยวข้อง นั่นเป็นเพียงสมมติฐานการทำงานของฉันในขณะนี้
สถานการณ์ที่ 1:
- สร้างฐานข้อมูลด้วยไฟล์บันทึกที่เริ่มต้นที่ 1MB เติบโตเป็น 4MB และมีขนาดสูงสุด 100MB
- เปิดธุรกรรมที่ชัดเจนเรียกใช้เป็นเวลา 10 วินาทีแล้วยกเลิกด้วยตนเองภายใน SSMS
- ดูที่ fn_dblog () นับและบันทึกขนาดสำรองและตรวจสอบ DBCC SQLPERF (LOGSPACE)
สถานการณ์ที่ 2:
- สร้างฐานข้อมูลด้วยไฟล์บันทึกที่เริ่มต้นที่ 1MB เติบโตเป็น 4MB และมีขนาดสูงสุด 100MB
- เปิดธุรกรรมที่ชัดเจนเรียกใช้จนกระทั่งบันทึกแสดงข้อผิดพลาดเต็ม
- ดูที่ fn_dblog () นับและบันทึกขนาดสำรองและตรวจสอบ DBCC SQLPERF (LOGSPACE)
ผลการตรวจสอบประสิทธิภาพ:
สถานการณ์ที่ 1:
สถานการณ์ที่ 2:
รหัส:
ใช้ [ต้นแบบ];
ไป
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
เริ่ม
แก้ไขฐานข้อมูล [SampleDB] SET SINGLE_USER
ด้วยการย้อนกลับทันที
DROP DATABASE [SampleDB];
END;
ไป
สร้างฐานข้อมูล [SampleDB] บนหลัก
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
เข้าสู่ระบบ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
ไป
ใช้ [SampleDB];
ไป
- เพิ่มโต๊ะ
สร้างตาราง dbo.test
(
c1 CHAR (8000) ไม่ใช่ NULL DEFAULT REPLICATE ('a', 8000)
) เปิด [หลัก];
ไป
- ตรวจสอบให้แน่ใจว่าเราไม่ได้เป็นแบบจำลองการกู้คืนแบบง่าย ๆ
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
ไป
- สำรองไฟล์บันทึก
BACKUP LOG SampleDB
TO DISK = 'NUL';
ไป
- ตรวจสอบพื้นที่บันทึกที่ใช้
DBCC SQLPERF (LOGSPACE);
ไป
- มีกี่ระเบียนที่มองเห็นได้ด้วย fn_dblog ()
SELECT * จาก fn_dblog (NULL, NULL); - ประมาณ 9 ในกรณีของฉัน
/ **********************************
สถานการณ์ 1
********************************** /
- เปิดธุรกรรมใหม่แล้วย้อนกลับ
เริ่มต้นการทำธุรกรรม
INSERT INTO dbo.test ค่าเริ่มต้น;
GO 10000 - ให้เปิดใช้งานเป็นเวลา 10 วินาทีแล้วกดยกเลิกในหน้าต่างค้นหา SSMS
- ยกเลิกการทำธุรกรรม
- ควรใช้เวลาสองสามวินาทีเพื่อเสร็จสิ้น
- ไม่จำเป็นต้องย้อนกลับการทำธุรกรรมเนื่องจากการยกเลิกได้ทำเพื่อคุณแล้ว
-- แค่ลองดู. คุณจะได้รับข้อผิดพลาดนี้
- ข่าวสารเกี่ยวกับ 3903, ระดับ 16, สถานะ 1, บรรทัด 1
- คำขอทำธุรกรรมย้อนกลับไม่มีธุรกรรมเริ่มต้นที่สอดคล้องกัน
ธุรกรรมย้อนกลับ;
- พื้นที่บันทึกที่ใช้คืออะไร สูงกว่า 100%
DBCC SQLPERF (LOGSPACE);
ไป
- มีกี่ระเบียนที่มองเห็นได้ด้วย fn_dblog ()
เลือก *
จาก fn_dblog (NULL, NULL); - ประมาณ 91,926 ในกรณีของฉัน
- การสำรองบันทึกทั้งหมดแสดงโดย fn_dblog ()?
เลือก SUM ([บันทึกสำรอง]) AS [รวมบันทึกสำรอง]
จาก fn_dblog (NULL, NULL); - ประมาณ 88.72MB
/ **********************************
สถานการณ์ที่ 2
********************************** /
- ระเบิดฐานข้อมูลและเริ่มต้นใหม่
ใช้ [ต้นแบบ];
ไป
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
เริ่ม
แก้ไขฐานข้อมูล [SampleDB] SET SINGLE_USER
ด้วยการย้อนกลับทันที
DROP DATABASE [SampleDB];
END;
ไป
สร้างฐานข้อมูล [SampleDB] บนหลัก
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
เข้าสู่ระบบ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
ไป
ใช้ [SampleDB];
ไป
- เพิ่มโต๊ะ
สร้างตาราง dbo.test
(
c1 CHAR (8000) ไม่ใช่ NULL DEFAULT REPLICATE ('a', 8000)
) เปิด [หลัก];
ไป
- ตรวจสอบให้แน่ใจว่าเราไม่ได้เป็นแบบจำลองการกู้คืนแบบง่าย ๆ
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
ไป
- สำรองไฟล์บันทึก
BACKUP LOG SampleDB
TO DISK = 'NUL';
ไป
- ตอนนี้เรามาระเบิดไฟล์บันทึกภายในธุรกรรมของเรา
เริ่มต้นการทำธุรกรรม
INSERT INTO dbo.test ค่าเริ่มต้น;
ไป 10,000
- การย้อนกลับไม่เคยเกิดไฟไหม้ ลองมัน. คุณจะได้รับข้อผิดพลาด
- ข่าวสารเกี่ยวกับ 3903, ระดับ 16, สถานะ 1, บรรทัด 1
- คำขอทำธุรกรรมย้อนกลับไม่มีธุรกรรมเริ่มต้นที่สอดคล้องกัน
ธุรกรรมย้อนกลับ;
- ล็อกไฟล์เต็ม 100% หรือไม่
DBCC SQLPERF (LOGSPACE);
- มีกี่ระเบียนที่มองเห็นได้ด้วย fn_dblog ()
เลือก *
จาก fn_dblog (NULL, NULL); - ประมาณ 91,926 ในกรณีของฉัน
ไป
- การสำรองบันทึกทั้งหมดแสดงโดย fn_dblog ()?
เลือก SUM ([บันทึกสำรอง]) AS [รวมบันทึกสำรอง]
จาก fn_dblog (NULL, NULL); - 88.72MB
ไป