zoukankan      html  css  js  c++  java
  • Sqlserver CheckPoint 在三种恢复模式中的不同表现

    准备:

    日志截断在下列情况下发生: 

    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

  • 相关阅读:
    微信小程序缓存
    微信小程序下拉刷新和上拉加载
    小程序杂乱知识点
    2017-01-11小程序常规增删改查
    2017-01-11小程序form表单提交
    20170105数据库表设计知识点
    20170103需要修改的地方
    关于类protected、private、public的方法
    java基础巩固之java实现文件上传
    Java四个常用正则表达
  • 原文地址:https://www.cnblogs.com/wanglg/p/3994430.html
Copyright © 2011-2022 走看看