Dalam SQL Server 2008 R2, bagaimana dua kemunduran ini berbeda:
Jalankan
ALTER
pernyataan, selama beberapa menit, lalu tekan 'Batalkan Pelaksana'. Butuh beberapa menit untuk mengembalikan sepenuhnya.Jalankan
ALTER
pernyataan yang sama , tetapi ini memastikan bahwaLDF
file tidak cukup besar untuk menyelesaikannya dengan sukses. SetelahLDF
batas dipenuhi dan tidak ada 'autogrowth' diperbolehkan, eksekusi permintaan segera berhenti (atau rollback terjadi) dengan pesan kesalahan ini:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
Bagaimana kedua hal ini berbeda pada poin-poin berikut?
Mengapa 'kembalikan' kedua itu terjadi secara instan? Saya tidak sepenuhnya yakin apakah itu bisa disebut rollback. Dugaan saya adalah, log transaksi ditulis sebagai eksekusi berlangsung dan setelah menyadari bahwa tidak ada cukup ruang untuk menyelesaikan tugas, itu hanya berhenti dengan beberapa pesan 'akhir', tanpa komit.
Apa yang terjadi ketika rollback pertama membutuhkan banyak waktu (apakah rollback adalah single threaded)?
2.1. Apakah SQL Server kembali dan membatalkan entri yang dibuat dalamLDF
file?
2.2. TheLDF
ukuran file semakin kecil pada akhir rollback (dariDBCC SQLPERF(LOGSPACE)
)Satu pertanyaan tambahan: Selama skenario kedua, SQL Server mulai mengkonsumsi
LDF
file dengan cukup cepat. Dalam kasus saya, itu meningkat dari 18% penggunaan menjadi 90% penggunaan dalam beberapa menit pertama (<4 menit). Tapi begitu mencapai 99%, ia tinggal di sana selama 8 menit, sementara penggunaannya berfluktuasi antara 99,1% hingga 99,8%. Ini naik (99,8%) dan turun (99,2%) dan naik lagi (99,7%) dan turun (99,5%) beberapa kali sebelum kesalahan dilemparkan. Apa yang terjadi di balik layar?
Setiap tautan MSDN yang dapat membantu menjelaskan hal ini lebih dihargai.
Atas saran Ali Razeghi, saya menambahkan perfmon: Disk Bytes/sec
Jawaban:
Seperti ditunjukkan di atas, setelah menjalankan lebih banyak tes, saya sampai pada kesimpulan yang dihitung. Saya merangkum semuanya menjadi posting blog di sini , tetapi saya akan menyalin beberapa konten ke posting ini untuk anak cucu.
Dugaan (berdasarkan beberapa tes)
Sampai sekarang, saya tidak memiliki penjelasan yang jelas mengapa ini terjadi. Tapi berikut adalah perkiraan saya berdasarkan artefak yang dikumpulkan selama tes.
Kembalikan terjadi di kedua skenario. Salah satunya adalah rollback eksplisit (pengguna menekan tombol Batal), yang lainnya implisit (Sql Server membuat keputusan itu secara internal).
Dalam kedua skenario, lalu lintas yang menuju ke file log konsisten. Lihat gambar di bawah ini:
Skenario 1:
Skenario 2:
Salah satu artefak yang memperkuat garis pemikiran ini adalah menangkap Jejak Sql selama kedua skenario.
Perilaku yang tidak dapat dijelaskan:
Setiap ide untuk membantu menjelaskan perilaku ini dengan cara yang lebih baik dipersilakan.
sumber
Saya mencoba percobaan berikut dan mendapatkan hasil yang serupa. Dalam kedua kasus, fn_dblog () menunjukkan rollback yang terjadi dan tampaknya terjadi lebih cepat di Skenario 2 daripada di Skenario 1.
By the way, saya menempatkan baik MDF dan LDF pada disk eksternal (USB 2.0) tunggal yang sama.
Kesimpulan awal saya adalah bahwa tidak ada perbedaan dalam operasi rollback dalam kasus ini, dan mungkin perbedaan kecepatan yang jelas terkait subsistem I / O. Itulah hipotesis kerja saya saat ini.
Skenario 1:
Skenario 2:
Hasil Monitor Kinerja:
Skenario 1:
Skenario 2:
Kode:
sumber