我尝试了以下实验,并获得了相似的结果。在这两种情况下,fn_dblog()都显示发生回滚,并且在方案2中它似乎比在方案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:
码:
USE [master];
走
IF DATABASEPROPERTYEX(N'SampleDB',N'Version')> 0
开始
ALTER DATABASE [SampleDB] SET SINGLE_USER
立即回滚;
DROP DATABASE [SampleDB];
结束;
走
在主数据库上创建数据库[SampleDB]
(
NAME = N'SampleDB'
,FILENAME = N'E:\ data \ SampleDB.mdf'
,大小= 3MB
,文件增长= 1MB
)
登入
(
NAME = N'SampleDB_log'
,FILENAME = N'E:\ data \ SampleDB_log.ldf'
,大小= 1MB
,MAXSIZE = 100MB
,FILEGROWTH = 4MB
);
走
USE [SampleDB];
走
-添加表格
创建表dbo.test
(
c1 CHAR(8000)非空默认副本('a',8000)
)在[PRIMARY]上;
走
-确保我们不是伪简单的恢复模型
备份数据库SampleDB
TO DISK ='NUL';
走
-备份日志文件
备份日志SampleDB
TO DISK ='NUL';
走
-检查已用的日志空间
DBCC SQLPERF(LOGSPACE);
走
-使用fn_dblog()可以看到多少条记录?
SELECT * FROM fn_dblog(NULL,NULL); -在我的情况下大约9
/ **************************************
场景1
************************************** /
-打开一个新交易,然后回滚
开始交易
插入dbo.test默认值;
GO 10000-让其运行10秒钟,然后在SSMS查询窗口中单击``取消''
-取消交易
-需要几秒钟才能完成
-无需回滚交易,因为取消已经为您完成了。
- 去尝试一下。您会收到此错误
-消息3903,第16级,状态1,第1行
-ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。
回滚交易;
-使用的日志空间是多少?高于100%。
DBCC SQLPERF(LOGSPACE);
走
-使用fn_dblog()可以看到多少条记录?
选择 *
从fn_dblog(NULL,NULL); -就我而言大约91,926
-由fn_dblog()显示的总日志储备?
SELECT SUM([日志保留])AS [总日志保留]
从fn_dblog(NULL,NULL); -约88.72MB
/ **************************************
场景2
************************************** /
-吹走数据库并重新开始
USE [master];
走
IF DATABASEPROPERTYEX(N'SampleDB',N'Version')> 0
开始
ALTER DATABASE [SampleDB] SET SINGLE_USER
立即回滚;
DROP DATABASE [SampleDB];
结束;
走
在主数据库上创建数据库[SampleDB]
(
NAME = N'SampleDB'
,FILENAME = N'E:\ data \ SampleDB.mdf'
,大小= 3MB
,文件增长= 1MB
)
登入
(
NAME = N'SampleDB_log'
,FILENAME = N'E:\ data \ SampleDB_log.ldf'
,大小= 1MB
,MAXSIZE = 100MB
,FILEGROWTH = 4MB
);
走
USE [SampleDB];
走
-添加表格
创建表dbo.test
(
c1 CHAR(8000)非空默认副本('a',8000)
)在[PRIMARY]上;
走
-确保我们不是伪简单的恢复模型
备份数据库SampleDB
TO DISK ='NUL';
走
-备份日志文件
备份日志SampleDB
TO DISK ='NUL';
走
-现在,让我们在事务中删除日志文件
开始交易
插入dbo.test默认值;
去10000
-永不触发回滚。尝试一下。您会得到一个错误。
-消息3903,第16级,状态1,第1行
-ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。
回滚交易;
-日志文件是否100%已满?
DBCC SQLPERF(LOGSPACE);
-使用fn_dblog()可以看到多少条记录?
选择 *
从fn_dblog(NULL,NULL); -就我而言大约91,926
走
-由fn_dblog()显示的总日志储备?
SELECT SUM([日志保留])AS [总日志保留]
从fn_dblog(NULL,NULL); -88.72MB
走