Đối với ngày thứ Ba T-SQL của tháng trước, tôi đã viết về một số cờ theo dõi không có tài liệu giúp bạn quản lý các hoạt động sao lưu và khôi phục lâu dài. Trong tháng này, chủ đề của Jes Borland là Sự kiện mở rộng và tôi nghĩ rằng tôi sẽ hiển thị các khả năng mới trong SQL Server 2016 mà phần lớn làm cho các cờ theo dõi này trở nên lỗi thời.
Nếu bạn đang chơi với CTP2 (bạn có thể tải xuống tại đây), bạn có thể nhận thấy một danh mục mới backup_restore
và sự kiện mới backup_restore_progress_trace
:
Khám phá sự kiện mới trong hộp thoại Phiên mới của CTP2
Đây là một phiên XE nhanh và bẩn để thu thập dữ liệu cho sự kiện này (Tôi đã thêm nhận xét để lọc để chỉ sao lưu hoặc chỉ khôi phục hoạt động; theo mặc định, cả hai đều được bao gồm):
CREATE EVENT SESSION [Backup progress] ON SERVER ADD EVENT sqlserver.backup_restore_progress_trace ( ACTION(package0.event_sequence) -- to only capture backup operations: --WHERE [operation_type] = 0 -- to only capture restore operations: --WHERE [operation_type] = 1 ) ADD TARGET package0.event_file ( SET filename = N'C:\temp\BackupProgress.xel' ); -- default options are probably ok GO ALTER EVENT SESSION [Backup progress] ON SERVER STATE = START; GO
Bây giờ, giả sử tôi chạy các thao tác sau - tạo cơ sở dữ liệu, sao lưu một chút dữ liệu, thả nó và khôi phục nó:
USE [master]; GO CREATE DATABASE floob; GO SELECT s1.* INTO floob.dbo.what FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects; GO BACKUP DATABASE floob TO DISK = 'c:\temp\floob.bak' WITH INIT, COMPRESSION, STATS = 30; GO DROP DATABASE floob; GO RESTORE DATABASE floob FROM DISK = 'c:\temp\floob.bak' WITH REPLACE, RECOVERY;
Bây giờ, chúng tôi có thể truy vấn dữ liệu từ tệp mục tiêu sự kiện:
;WITH x AS ( SELECT ts,op,db,msg,es FROM ( SELECT ts = x.value(N'(event/@timestamp)[1]', N'datetime2'), op = x.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'), db = x.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'), msg = x.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'), es = x.value(N'(event/action[@name="event_sequence"])[1]', N'int') FROM ( SELECT x = CONVERT(XML, event_data) FROM sys.fn_xe_file_target_read_file (N'c:\temp\Backup--Progress*.xel', NULL, NULL, NULL) ) AS y ) AS x WHERE op = N'Backup' -- N'Restore' AND db = N'floob' AND ts > CONVERT(DATE, SYSUTCDATETIME()) ) SELECT /* x.db, x.op, x.ts, */ [Message] = x.msg, Duration = COALESCE(DATEDIFF(MILLISECOND, x.ts, LEAD(x.ts, 1) OVER(ORDER BY es)),0) FROM x ORDER BY es;
Đối với một bản sao lưu, cờ theo dõi 3226 không ngăn chặn bất kỳ đầu ra nào được ghi lại bởi Sự kiện mở rộng. Tôi đã bỏ qua các cột đầu ra, do các bộ lọc, cho ngắn gọn:
Tin nhắn | Thời lượng (Mili giây) |
---|---|
CƠ SỞ DỮ LIỆU DỰ PHÒNG đã bắt đầu | 0 |
Mở cơ sở dữ liệu bằng S lock | 0 |
Có được khóa op hàng loạt trên cơ sở dữ liệu | 0 |
Đồng bộ hóa với các hoạt động khác trên cơ sở dữ liệu hoàn tất | 19 |
Mở bộ phương tiện dự phòng | 7 |
Bộ phương tiện dự phòng đang mở | 0 |
Chuẩn bị tập giấy viết | 0 |
Bộ phương tiện đã sẵn sàng để sao lưu | 0 |
Các tùy chọn hiệu quả:Checksum =0, Compression =1, Encryption =0, BufferCount =7, MaxTransferSize =1024 KB | 0 |
Xóa bitmap vi sai | 4 |
Các bitmap sai biệt bị xóa | 0 |
Viết điểm kiểm tra | 6 |
Điểm kiểm tra đã hoàn tất (trôi qua =6 mili giây) | 0 |
Khởi động LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Bản đồ bitmap phân bổ quét | 4 |
Quá trình quét bitmap phân bổ đã hoàn tất | 0 |
Tính toán kích thước dự kiến của tổng dữ liệu | 0 |
FID =1, DraftExtents =10047, IsDifferentialMapAccurate =0 | 0 |
TotalSize =658440192 byte | 0 |
Tổng kích thước ước tính =658460672 byte (kích thước dữ liệu =658440192 byte, kích thước nhật ký =20480 byte) | 0 |
Dự toán công việc đã hoàn tất | 0 |
LSN cuối cùng:101:111960:1 | 0 |
Viết siêu dữ liệu hàng đầu | 0 |
BackupStream (0):Ghi siêu dữ liệu hàng đầu vào thiết bị c:\ temp \ floob.bak | 1 |
Tính toán kích thước dự kiến của tổng dữ liệu | 0 |
FID =1, DraftExtents =10047, IsDifferentialMapAccurate =0 | 0 |
TotalSize =658440192 byte | 1 |
Sao chép tệp dữ liệu | 2 |
Số lượng trình đọc tệp dữ liệu =1 | 0 |
Đọc tệp dữ liệu D:\ SQL Server \ MSSQL13.SQL16 \ DATA \ floob.mdf | 0 |
BackupStream (0):Ghi MSDA có kích thước 10048 mức | 391 |
30 phần trăm (198180864/658460672 byte) được xử lý | 554 |
60 phần trăm (395313152/658460672 byte) được xử lý | 576 |
90 phần trăm (593494016/658460672 byte) được xử lý | 184 |
Đã đọc xong tệp dữ liệu D:\ SQL Server \ MSSQL13.SQL16 \ DATA \ floob.mdf | 2 |
BackupStream (0):Đệm MSDA với 65536 byte | 0 |
BackupStream (0):Tổng kích thước MSDA =10048 phạm vi | 0 |
InitialEosystemSize =658440192 byte, FinalSize =658440192 byte, LeftMode =0 | 0 |
LSN cuối cùng:101:111960:1 | 0 |
Sao chép xong các tệp dữ liệu | 0 |
Sao chép nhật ký giao dịch | 0 |
MediaFamily (0):FID =2, VLFID =101, DataStreamSize =65536 byte | 4 |
Sao chép xong nhật ký giao dịch | 0 |
Viết siêu dữ liệu theo sau | 0 |
BackupStream (0):Ghi siêu dữ liệu theo sau vào thiết bị c:\ temp \ floob.bak | 0 |
Viết phần cuối của tập sao lưu | 30 |
Viết hồ sơ lịch sử | 12 |
Việc ghi các bản ghi lịch sử đã hoàn tất (trôi qua =11 mili giây) | 0 |
CƠ SỞ DỮ LIỆU DỰ PHÒNG đã hoàn tất | 0 |
Dữ liệu sự kiện cho hoạt động sao lưu
Để khôi phục, bạn sẽ thấy các hàng sau:
Tin nhắn | Thời lượng (Mili giây) |
---|---|
BẮT ĐẦU KHÔI PHỤC CƠ SỞ DỮ LIỆU | 0 |
Mở bộ sao lưu | 3 |
Xử lý siêu dữ liệu hàng đầu | 0 |
Bắt đầu lập kế hoạch | 23 |
Tùy chọn hiệu quả:Checksum =0, Compression =1, Encryption =0, BufferCount =6, MaxTransferSize =1024 KB | 0 |
Lập kế hoạch hoàn tất | 0 |
Bắt đầu khôi phục ngoại tuyến | 0 |
Cơ sở dữ liệu được đính kèm dưới dạng DB_ID =5 | 1 |
Chuẩn bị vùng chứa | 534 |
Các thùng chứa đã sẵn sàng | 1097 |
Khôi phục bộ sao lưu | 0 |
Tổng kích thước ước tính để chuyển =658460672 byte | 0 |
Truyền dữ liệu | 1 |
BackupStream (0):Xử lý MSDA có kích thước 10048 phạm vi | 3282 |
BackupStream (0):Đã hoàn thành MSDA | 0 |
Đang đợi quá trình ghi nhật ký hoàn tất | 3 |
Hoàn tất ghi nhật ký | 0 |
BackupStream (0):Xử lý MSTL (FID =2, VLFID =101, size =65536 byte) | 1024 |
Quá trình truyền dữ liệu hoàn tất | 14 |
Bộ sao lưu được khôi phục | 45 |
Bắt đầu chuyển tiếp ngoại tuyến | 1 |
Xử lý 68 tiêu đề VLF | 69 |
Quá trình xử lý tiêu đề VLF hoàn tất | 11 |
LSN đầu tiên:101:111920:43, LSN cuối cùng:101:111960:1 | 0 |
Dừng LSN:101:111960:1 | 4 |
Chuyển tiếp ngoại tuyến đã hoàn tất | 17 |
Quá trình sửa cơ sở dữ liệu đã hoàn tất | 2 |
Chuyển cơ sở dữ liệu sang ONLINE | 2 |
Khởi động lại cơ sở dữ liệu TRỰC TUYẾN | 87 |
PostRestoreContainerFixups bắt đầu | 5 |
PostRestoreContainerFixups đã hoàn tất | 2 |
PostRestoreReplicationFixup bắt đầu | 107 |
PostRestoreReplicationFixup hoàn tất | 2 |
Cơ sở dữ liệu được khởi động lại | 9 |
Tiếp tục mọi thu thập thông tin Fulltext bị tạm dừng | 6 |
Viết hồ sơ lịch sử | 13 |
Việc ghi các bản ghi lịch sử đã hoàn tất (trôi qua =13 mili giây) | 2 |
Bảo trì MSDB đã hoàn tất | 2 |
KHÔI PHỤC CƠ SỞ DỮ LIỆU đã hoàn tất | 0 |
Dữ liệu sự kiện cho hoạt động khôi phục
Nếu bạn đang khắc phục sự cố hoạt động sao lưu hoặc khôi phục chậm, bạn có thể dễ dàng lọc khoảng thời gian để bạn chỉ thấy các sự kiện kéo dài hơn n mili giây chẳng hạn. Điều duy nhất tôi không thấy trong đầu ra này là bất kỳ cách nào để biết liệu khởi tạo tệp tức thì có hiệu lực trong quá trình khôi phục hay không - bạn vẫn có thể cần cờ theo dõi 3004, như được mô tả trong bài đăng của tôi cho T-SQL thứ Ba của tháng trước.
Đừng quên dừng phiên (nhưng hãy giữ định nghĩa phiên trên máy chủ để bạn có thể sử dụng lại):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Tôi đã không thực hiện bất kỳ bài kiểm tra hiệu suất hoặc phân tích tác động nào, nhưng nói chung, tôi sẽ nói rằng - giống như các cờ theo dõi - đây không phải là thứ bạn muốn chạy mọi lúc, mà chỉ khi khắc phục sự cố một hoạt động cụ thể. Việc thiết lập phiên này và truy vấn dữ liệu, IMHO, dễ dàng hơn một chút so với việc bật cờ theo dõi và phân tích cú pháp tất cả kết quả đầu ra từ nhật ký lỗi của SQL Server.