准备:
日志截断在下列情况下发生:
1、执行完 BACKUP LOG 语句时。
2、在每次处理检查点时(如果数据库使用的是简单恢复模式)。这包括 CHECKPOINT 语句所产生的显式检查点和系统生成的隐式检查点。例外情况是如果检查点发生在 BACKUP 语句仍活动时,则不截断日志
开始:
Sqlserver的恢复模式包括 简单恢复模式,大容量日志模式和完整恢复模式
当我们执行checkpoint的时候,实际是将缓存中的数据页数据更新到数据文件中。
而对于日志文件的改变又是如何表现的呢,我们一起通过实例看一下。
首先我们创建一个数据库(建库脚本省略)
设置数据库为简单恢复模式 添加五条记录
alter database dbtrain set recovery simple
insert into test values(1,'wwww')
go 5
再执行 DBCC log('DBTRain',2) 会看到当前活动日志的信息
如果再执行
checkpoint
DBCC log('DBTRain',2)
会看到日志被截断,只剩下checkpoint操作的日志记录
如果更换成完整恢复模式和大容量日志模式
alter database dbtrain set recovery full/bulk_logged
重复上面的动作会发现日志仍然被截断,这就让人很疑惑了。
原因就是因为我们是新创建的数据库,没有进行一次完整的备份,
并且一定要在完整恢复模式下做完整备份,一旦完整备份了就不要
随意变换恢复模式,不然会给你带来麻烦
在做备份之前还原模式就是简单,不管你怎么设置的。
如果不做完全备份的话保留事务日志是没有意义的。
查看数据库备份信息的脚本:
SELECT T1.Name AS DatabaseName, Isnull(Max(T2.recovery_model), 'No Backup Taken') AS recovery_model, 'Full' AS BackupType,
Isnull(CONVERT(VARCHAR(23), CONVERT(DATETIME, Max(T2.backup_finish_date), 131)), '') AS LastBackUpTaken FROM sys.sysdatabases T1
LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name WHERE type = 'D' GROUP BY T1.Name
--Get the most recent Diff backup taken
UNION ALL SELECT T1.Name AS DatabaseName, Isnull(Max(T2.recovery_model), 'No Backup Taken') AS recovery_model,
'Differential' AS BackupType, Isnull(CONVERT(VARCHAR(23), CONVERT(DATETIME, Max(T2.backup_finish_date), 131)), '') AS LastBackUpTaken
FROM sys.sysdatabases T1 LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name WHERE type = 'I' GROUP BY T1.Name
--Get the most recent Log backup taken
UNION ALL SELECT T1.Name AS DatabaseName,
Isnull(Max(T2.recovery_model), 'No Backup Taken') AS recovery_model, 'Log' AS BackupType,
Isnull(CONVERT(VARCHAR(23), CONVERT(DATETIME, Max(T2.backup_finish_date), 131)), '') AS LastBackUpTaken
FROM sys.sysdatabases T1 LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name WHERE type = 'L' GROUP BY T1.Name
--Get the databases with no backup yet taken
UNION ALL SELECT T1.Name AS DatabaseName, Isnull(Max(T2.recovery_model), 'No Backup Taken') AS recovery_model, 'No Backup' AS BackupType,
Isnull(CONVERT(VARCHAR(23), CONVERT(DATETIME, Max(T2.backup_finish_date), 131)), '') AS LastBackUpTaken FROM sys.sysdatabases T1
LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name WHERE type IS NULL GROUP BY T1.Name