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:
- Buat database dengan file log yang dimulai pada 1MB, tumbuh dalam potongan 4MB, dan memiliki ukuran maksimal 100MB.
- Buka transaksi eksplisit, jalankan selama 10 detik, dan kemudian batalkan secara manual dalam SSMS
- Lihatlah jumlah fn_dblog () dan catat ukuran cadangan dan periksa DBCC SQLPERF (LOGSPACE)
Skenario 2:
- Buat database dengan file log yang dimulai pada 1MB, tumbuh dalam potongan 4MB, dan memiliki ukuran maksimal 100MB.
- Buka transaksi eksplisit, jalankan hingga log penuh kesalahan muncul
- Lihatlah jumlah fn_dblog () dan catat ukuran cadangan dan periksa DBCC SQLPERF (LOGSPACE)
Hasil Monitor Kinerja:
Skenario 1:
Skenario 2:
Kode:
GUNAKAN [master];
PERGILAH
JIKA DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
MULAI
ALTER DATABASE [SampleDB] SET SINGLE_USER
DENGAN SEGERA ROLLBACK;
DROP DATABASE [SampleDB];
AKHIR;
PERGILAH
BUAT DATABASE [SampleDB] TENTANG UTAMA
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
LOG ON
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, UKURAN = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
PERGILAH
GUNAKAN [SampleDB];
PERGILAH
- Tambahkan tabel
CREATE TABLE dbo.test
(
c1 CHAR (8000) BUKAN NULL DEFAULT REPLICATE ('a', 8000)
) ON [PRIMARY];
PERGILAH
- Pastikan kita tidak model pemulihan semu-sederhana
CADANGAN DATABASE SampleDB
TO DISK = 'NUL';
PERGILAH
- Cadangkan file log
LOG CADANGAN SampleDB
TO DISK = 'NUL';
PERGILAH
- Periksa ruang log yang digunakan
DBCC SQLPERF (LOGSPACE);
PERGILAH
- Berapa banyak catatan yang terlihat dengan fn_dblog ()?
SELECT * FROM fn_dblog (NULL, NULL); - Sekitar 9 dalam kasus saya
/ **********************************
SKENARIO 1
******************************** /
- Buka transaksi baru dan kemudian gulung kembali
TRANSAKSI AWAL
Masukkan ke dalam dbo.test NILAI DEFAULT;
GO 10000 - Biarkan dijalankan selama 10 detik dan kemudian tekan batal di jendela permintaan SSMS
- Batalkan transaksi
- Perlu beberapa detik untuk menyelesaikannya
- Tidak perlu mengembalikan transaksi, karena pembatalan sudah melakukannya untuk Anda.
-- Cobalah. Anda akan mendapatkan kesalahan ini
- Msg 3903, Level 16, Negara Bagian 1, Jalur 1
- Permintaan TRANSAKSI ROLLBACK tidak memiliki TRANSAKSI BEGIN yang sesuai.
TRANSAKSI ROLLBACK;
- Apa ruang log yang digunakan? Di atas 100%
DBCC SQLPERF (LOGSPACE);
PERGILAH
- Berapa banyak catatan yang terlihat dengan fn_dblog ()?
PILIH *
FROM fn_dblog (NULL, NULL); - Sekitar 91.926 dalam kasus saya
- Total cadangan log ditunjukkan oleh fn_dblog ()?
SELECT SUM ([Cadangan Log]) AS [Total Cadangan Log]
FROM fn_dblog (NULL, NULL); - Sekitar 88,72MB
/ **********************************
SKENARIO 2
******************************** /
- Menerbangkan DB dan memulai dari awal
GUNAKAN [master];
PERGILAH
JIKA DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
MULAI
ALTER DATABASE [SampleDB] SET SINGLE_USER
DENGAN SEGERA ROLLBACK;
DROP DATABASE [SampleDB];
AKHIR;
PERGILAH
BUAT DATABASE [SampleDB] TENTANG UTAMA
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
LOG ON
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, UKURAN = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
PERGILAH
GUNAKAN [SampleDB];
PERGILAH
- Tambahkan tabel
CREATE TABLE dbo.test
(
c1 CHAR (8000) BUKAN NULL DEFAULT REPLICATE ('a', 8000)
) ON [PRIMARY];
PERGILAH
- Pastikan kita tidak model pemulihan semu-sederhana
CADANGAN DATABASE SampleDB
TO DISK = 'NUL';
PERGILAH
- Cadangkan file log
LOG CADANGAN SampleDB
TO DISK = 'NUL';
PERGILAH
- Sekarang, mari kita meledakkan file log dalam transaksi kita
TRANSAKSI AWAL
Masukkan ke dalam dbo.test NILAI DEFAULT;
GO 10000
- Kembalikan tidak pernah terjadi. Cobalah. Anda akan mendapatkan kesalahan.
- Msg 3903, Level 16, Negara Bagian 1, Jalur 1
- Permintaan TRANSAKSI ROLLBACK tidak memiliki TRANSAKSI BEGIN yang sesuai.
TRANSAKSI ROLLBACK;
- Apakah file log 100% penuh?
DBCC SQLPERF (LOGSPACE);
- Berapa banyak catatan yang terlihat dengan fn_dblog ()?
PILIH *
FROM fn_dblog (NULL, NULL); - Sekitar 91.926 dalam kasus saya
PERGILAH
- Total cadangan log ditunjukkan oleh fn_dblog ()?
SELECT SUM ([Cadangan Log]) AS [Total Cadangan Log]
FROM fn_dblog (NULL, NULL); - 88.72MB
PERGILAH