none
对事务日志截断机制不明白 RRS feed

  • 问题

  • --backup log    中 的 with no_truncate 会不会截断事务日志?
    ----以下所有 backup log 都有 with no_truncate
    --- a.开始时
    --用   dbcc log(aaaa,4)
    --- 有17 行 000040b3:00002aa3:0001 000040b3:00002aab:0003
    -- 10915-10923
    -- b. 插入,做完插入后有日志:230 行
    -- 000040b3:00002aa3:0001 --  000040b3:00002acd:0001
    --10915-10957
    -- c. 我要备份当前库
    --   backup log aaaa to disk='d:\c.logbak' with no_truncate
    --备份完是
    --000040b3:00002aa9:0001 -- 000040b3:00002acd:0001
    --10915 10957
    --219行
    -- d. 看日志文件中的
    --restore headeronly from disk='d:\c.logbak'
    --16563000001091500001 -- 16563000001095800001
    --10915-10958
    -- e.看现在是: 219行
    --000040b3:00002aa9:0001 -000040b3:00002acd:0001
    --10915-957
    --f.收库 ,收完了看是:

    --000040b3:00002ace:0001 000040b4:00006233:0001
    --10958-25139
    -- g.在备份库
    -- backup log aaaa to disk='d:\d.logbak' with no_truncate
    --74791
    --000040b4:00001912:0002 -000040b4:00006233:0001
    --6418- 25139
    -- h 在看
    --  rstore headeronly from disk='d:\d.logbak'
    --16563000001095800001 -- 16564000000641800002

    -- 是不是只要不收缩库, 我就可以直接用最后一个日志备份+ with no_truncate 恢复库
    --早上8点做的完整备份, 每隔一小时,做 日志备份, 下午两点库坏了, 但日志可读 ,
    -- 我在服务器上 用backup log aaaa to disk='d:\d.logbak' with no_truncate
    -- 在加上早上8点的完整,就可以全部还原.
    --我主要是对事务日志截断机制不明白.
    --手册上说,执行完备份就 把日志截断了, 不是很清楚
    --

     

    2010年4月19日 7:28

答案

  • --是不是只要不收缩库, 我就可以直接用最后一个日志备份+ with no_truncate 恢复库

    数据库的收缩和日志之间没有关系。

    数据库日志备份将日志中的内容复制到文件中,并将原有日志的inactive部分截断(数据库日志文件的物理大小并没有变化)。

    如果加入no_truncate选项,日志的备份不会将原有日志文件的inactive部分截断,只是进行copy操作。

    你可以在执行日志备份前后查看日志的内容,进行对比。这样就可以了解日志备份的机制了。

    如果你一直使用no_truncate进行日志备份,是可以通过最有一个日志备份进行将数据库还原的,应为日志包含了所有内容

    下面是一个查看当前数据库日志内容的语句,或者使用第三方工具,例如Log Explorer

    select [Current LSN],[Previous LSN],[Previous Page LSN],PartitionId,
     Operation,Context,[Transaction ID],[Log Record Fixed Length],[Log Record Length] from 
    sys.fn_dblog(null,null)
    

    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年4月19日 13:58
    版主

全部回复

  • 我主要是不明白截断机制, 在e步骤后, lsn和最早还是相同的, 但一收缩就没了,断开了,不是断开了,是全乱了.

    2010年4月19日 8:02
  • msdn 中关于事务截断是

    ----在备份事务日志时截断日志,前提条件是:

    BACKUP LOG 语句未指定 WITH NO_TRUNCATE 或 WITH COPY_ONLY。

    ----BACKUP LOG----

    指 定仅备份事务日志。该日志是从上一次成功执行的日志备份到当前日志的末尾。必须创建完整备份,才能创建第一个日志备份。

    注意:
    执行典型日志备份后,如果没有指定 WITH NO_TRUNCATE 或 COPY_ONLY,某些事务日志记录将变为不活动状态。一个或多个虚拟日志文件中的所有记录变为不活动状态后,日志将被截断。如果日志在常规日志备份后未被截断,则可能是某些操作延迟了日志截断。有关详细信息,请参阅管理事务日志。

    -------- 何时收缩日志?

    可以在数据库在线时执行收缩日志操作。在下列情况下,日志文件的物理大小将减小:

    • 发生自动收缩操作。
    • 执行引用日志文件的 DBCC SHRINKFILE 语句。
    • 执行 DBCC SHRINKDATABASE 语句。

    如果从来没有从事务日志中删除过日志记录,日志记录将会逐渐填满供物理日志文件使用的所有磁盘空间。日志截断可自动释放逻辑日志中的空间以供事务日志重新使用。

    除非由于某些原因导致延迟,日志截断将按照以下方式自动发生:

    • 简单恢复模式下,在检查点之后发生。
    • 完整恢复模式或大容量日志恢复模式下,在日志备份之后发生(如果自上次备份后出现检查点)。有关详细信息,请参阅本主题后面的“完整恢复模式和大容量日志恢复模式下的日志截断”部分。
    2010年4月19日 11:50
  • 是不是 我查看的是不同版本sql 的文档的过呀?

    这一快应该 一直没变吧

    我的理解是, 在完整恢复模式下,  当前库里边的日志链 start  lsn 和 end lsn   与日志备份中的是相连接的, 比如.(每天 "早8点完整备份,每隔一小时,日志备份, 第二天7:50在日志备份".  做成任务,那我最坏丢10分钟的数据.) 我只有相应备份文件在, 我能恢复到任一时点.

    在大容量下也应该是.

    看了毛颉的 "sqlserver 数据库的备份与恢复"  两星期了,还不清楚是怎么一回事情.

     

    2010年4月19日 12:04
  • --是不是只要不收缩库, 我就可以直接用最后一个日志备份+ with no_truncate 恢复库

    数据库的收缩和日志之间没有关系。

    数据库日志备份将日志中的内容复制到文件中,并将原有日志的inactive部分截断(数据库日志文件的物理大小并没有变化)。

    如果加入no_truncate选项,日志的备份不会将原有日志文件的inactive部分截断,只是进行copy操作。

    你可以在执行日志备份前后查看日志的内容,进行对比。这样就可以了解日志备份的机制了。

    如果你一直使用no_truncate进行日志备份,是可以通过最有一个日志备份进行将数据库还原的,应为日志包含了所有内容

    下面是一个查看当前数据库日志内容的语句,或者使用第三方工具,例如Log Explorer

    select [Current LSN],[Previous LSN],[Previous Page LSN],PartitionId,
     Operation,Context,[Transaction ID],[Log Record Fixed Length],[Log Record Length] from 
    sys.fn_dblog(null,null)
    

    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年4月19日 13:58
    版主