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

  • 相关阅读:
    防抖、节流函数
    vue如何监听数组的变化
    scss的循环和数组
    linux更新node版本
    函数节流和防抖函数
    vue-cli 使用,更新
    webstorm自动编译scss
    git冲突的处理
    linuix 安装 mysql8
    脚本安装mysql 8
  • 原文地址:https://www.cnblogs.com/wanglg/p/3994430.html
Copyright © 2011-2022 走看看