Letters2";"AA"-"ZZ" non-unique 2-char strings
10 -- "SomeMoney"; 0.0000 to 99.9999 non-unique numbers
11 -- "SomeDate" ; >=01/01/2000 and <01/01/2010 non-unique
12 -- "SomeHex12"; 12 random hex characters (ie, 0-9,A-F)
13 SELECT TOP 1000000
14 SomeID = IDENTITY( INT,1,1 ),
15 SomeInt = ABS(CHECKSUM(NEWID())) % 50000 + 1 ,
16 SomeLetters2 = CHAR(ABS(CHECKSUM(NEWID())) % 26 + 65)
17 + CHAR(ABS(CHECKSUM(NEWID())) % 26 + 65) ,
18 SomeMoney = CAST(ABS(CHECKSUM(NEWID())) % 10000 / 100.0 AS MONEY) ,
19 SomeDate = CAST(RAND(CHECKSUM(NEWID())) * 3653.0 + 36524.0 AS DATETIME) ,
20 SomeHex12 = RIGHT(NEWID(), 12)
21 INTO dbo.LogTest
22 FROM sys.all_columns ac1
23 CROSS JOIN sys.all_columns ac2 ;
24 DBCC SQLPERF(LOGSPACE) ;
?
?
可以看到日志文件已经膨胀到近100MB,日志已经近93%满(每个
数据库上看到的结果都会不一样)。如果我们插入更多的数据,它会继续增长来容纳更多的数据,文件大小我们可以在本地硬盘的对应目录上进行确认(数据文件已经增长到54M)。
?
我们可以用刚才的代码再次备份数据文件,同样也不会对数据文件、日志文件和日志空间使用率造成影响。现在我们备份下事务日志文件,再次检查下文件大小。
?
1 -- now backup the transaction log
2 BACKUP Log TestDB
3 TO DISK ='C:\Backups\TestDB_log.bak'
4 WITH INIT;
5 GO
6 DBCC SQLPERF(LOGSPACE) ;
日志文件还是一样的物理大小,但是通过备份文件,SQL Server可以截断日志,在“不活动”VLFs里日志文件标记空间作为重用;更多的日志记录会被添加而不需要物理增长文件。当然还有,我们把日志捕获到备份文件,这样的话我们可以使用这个文件作为
数据库恢复进程,如果我们想把TestDB数据库恢复到上一状态。
?
小结
?
在这篇文章里,我们介绍了事务日志,解释了SQL Server如何使用它来维护数据的一致性(consistency)和完整性(integrity),通过预写式日志(write-ahead logging)机制。我们也介绍了并简洁演示了,一个DBA如何捕获事务日式文件内容到备份文件,它可以被重用来恢复数据库,作为恢复过程的一部分。最后,我们强调了备份在控制事务日志文件大小的重要性。