Untuk T-SQL Selasa bulan lalu, saya menulis tentang beberapa tanda jejak tidak berdokumen yang membantu Anda menjaga operasi pencadangan dan pemulihan yang berjalan lama. Bulan ini, topik Jes Borland adalah Acara yang Diperpanjang, dan saya pikir saya akan menunjukkan kemampuan baru di SQL Server 2016 yang sebagian besar membuat tanda pelacakan ini menjadi usang.
Jika Anda bermain dengan CTP2 (Anda dapat mengunduhnya di sini), Anda mungkin melihat kategori baru backup_restore
dan acara baru backup_restore_progress_trace
:
Menemukan acara baru dalam dialog Sesi Baru CTP2
Berikut adalah sesi XE cepat dan kotor untuk menangkap data untuk acara ini (Saya telah menambahkan komentar untuk memfilter hanya untuk mencadangkan atau hanya memulihkan operasi; secara default, keduanya disertakan):
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
Sekarang, katakanlah saya menjalankan operasi berikut – buat database, masukkan kembali sedikit data, lepaskan, dan pulihkan:
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;
Sekarang, kita dapat meminta data dari file target acara:
;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;
Untuk pencadangan, bendera pelacakan 3226 tidak menekan keluaran apa pun yang ditangkap oleh Peristiwa yang Diperpanjang. Saya telah meninggalkan kolom keluaran, karena filter, untuk singkatnya:
Pesan | Durasi (Milidetik) |
---|---|
BACKUP DATABASE dimulai | 0 |
Membuka database dengan kunci S | 0 |
Mendapatkan kunci operasi massal pada database | 0 |
Sinkronisasi dengan operasi lain pada database selesai | 19 |
Membuka kumpulan media cadangan | 7 |
Kumpulan media cadangan terbuka | 0 |
Menyiapkan media set untuk menulis | 0 |
Kumpulan media siap untuk dicadangkan | 0 |
Opsi efektif:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Menghapus bitmap diferensial | 4 |
Bitmap diferensial dihapus | 0 |
Menulis pos pemeriksaan | 6 |
Pos pemeriksaan selesai (berlalu =6 md) | 0 |
Mulai LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Memindai bitmap alokasi | 4 |
Pemindaian bitmap alokasi selesai | 0 |
Menghitung ukuran yang diharapkan dari total data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 byte | 0 |
Perkiraan ukuran total =658460672 byte (ukuran data =658440192 byte, ukuran log =20480 byte) | 0 |
Estimasi pekerjaan selesai | 0 |
LSN Terakhir:101:111960:1 | 0 |
Menulis metadata terkemuka | 0 |
BackupStream(0):Menulis metadata utama ke perangkat c:\temp\floob.bak | 1 |
Menghitung ukuran yang diharapkan dari total data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 byte | 1 |
Menyalin file data | 2 |
Jumlah pembaca file data =1 | 0 |
Membaca file data D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 0 |
BackupStream(0):Menulis MSDA ukuran 10048 luasan | 391 |
30 persen (198180864/658460672 byte) diproses | 554 |
60 persen (395313152/658460672 byte) diproses | 576 |
90 persen (593494016/658460672 byte) diproses | 184 |
Selesai membaca file data D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 2 |
BackupStream(0):Mengisi MSDA dengan 65536 byte | 0 |
BackupStream(0):Total ukuran MSDA =10048 luasan | 0 |
InitialExpectedSize=658440192 byte, FinalSize=658440192 byte, ExcessMode=0 | 0 |
LSN Terakhir:101:111960:1 | 0 |
Penyalinan file data selesai | 0 |
Menyalin log transaksi | 0 |
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 byte | 4 |
Penyalinan log transaksi selesai | 0 |
Menulis metadata tambahan | 0 |
BackupStream(0):Menulis metadata tambahan ke perangkat c:\temp\floob.bak | 0 |
Menulis akhir set cadangan | 30 |
Menulis catatan sejarah | 12 |
Penulisan catatan riwayat selesai (berlalu =11 md) | 0 |
BACKUP DATABASE selesai | 0 |
Data peristiwa untuk operasi pencadangan
Untuk pemulihan, Anda akan melihat baris berikut:
Pesan | Durasi (Milidetik) |
---|---|
KEMBALIKAN DATABASE dimulai | 0 |
Membuka kumpulan cadangan | 3 |
Memproses metadata terkemuka | 0 |
Perencanaan dimulai | 23 |
Opsi efektif:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
Perencanaan selesai | 0 |
Memulai pemulihan OFFLINE | 0 |
Database terlampir sebagai DB_ID=5 | 1 |
Menyiapkan wadah | 534 |
Kontainer sudah siap | 1097 |
Memulihkan kumpulan cadangan | 0 |
Perkiraan ukuran total yang akan ditransfer =658460672 byte | 0 |
Mentransfer data | 1 |
BackupStream(0):Memproses MSDA berukuran 10048 perluasan | 3282 |
BackupStream(0):MSDA Selesai | 0 |
Menunggu log zeroing selesai | 3 |
Log zeroing selesai | 0 |
BackupStream(0):Memproses MSTL (FID=2, VLFID=101, size=65536 byte) | 1024 |
Transfer data selesai | 14 |
Set cadangan dipulihkan | 45 |
Perputaran offline dimulai | 1 |
Memproses 68 header VLF | 69 |
Pemrosesan header VLF selesai | 11 |
LSN Pertama:101:111920:43, LSN Terakhir:101:111960:1 | 0 |
Hentikan LSN:101:111960:1 | 4 |
Perputaran offline selesai | 17 |
Perbaikan database selesai | 2 |
Transisi database ke ONLINE | 2 |
Memulai ulang basis data untuk ONLINE | 87 |
PostRestoreContainerFixups dimulai | 5 |
PostRestoreContainerFixups selesai | 2 |
PostRestoreReplicationFixup dimulai | 107 |
PostRestoreReplicationFixup selesai | 2 |
Database dimulai ulang | 9 |
Melanjutkan perayapan Teks Lengkap yang dihentikan | 6 |
Menulis catatan sejarah | 13 |
Penulisan catatan riwayat selesai (berlalu =13 md) | 2 |
Pemeliharaan MSDB selesai | 2 |
KEMBALIKAN DATABASE selesai | 0 |
Data peristiwa untuk operasi pemulihan
Jika Anda memecahkan masalah operasi pencadangan atau pemulihan yang lambat, Anda dapat dengan mudah memfilter durasinya, sehingga Anda hanya melihat peristiwa yang memerlukan waktu lebih dari n milidetik, misalnya. Satu-satunya hal yang tidak saya lihat dalam keluaran ini adalah cara untuk mengetahui apakah inisialisasi file instan berlaku selama pemulihan – Anda mungkin masih memerlukan tanda pelacakan 3004, seperti yang dijelaskan dalam posting saya untuk T-SQL Selasa bulan lalu.
Jangan lupa untuk menghentikan sesi (tetapi jangan ragu untuk menyimpan definisi sesi di server, sehingga Anda dapat menggunakannya lagi):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Saya tidak melakukan tes kinerja atau analisis dampak, tetapi secara umum, saya akan mengatakan bahwa – seperti tanda pelacakan – ini bukan sesuatu yang Anda ingin jalankan sepanjang waktu, tetapi hanya ketika memecahkan masalah operasi tertentu. Sedikit lebih mudah untuk menyiapkan sesi ini dan menanyakan data, IMHO, daripada mengaktifkan tanda pelacakan dan mengurai semua output dari log kesalahan SQL Server.