误区20:#需要一个完整的备份,日志备份链被破坏后重新
启动日志链
错误 自上次事务日志备份以来,事务日志备份将备份所有事务日志。如果没有日志备份,那么从最后一次完整备份开始。有几种
类型的
操作中断事务日志的
连续性,也就是说,在新的日志链
重新启动之前,SQL Server不能备份日志:
从完全
恢复模式或大容量事务日志恢复模式过渡到简单恢复模式
从数据库
镜像恢复
no_log或truncate_only时指定日志备份(
选项在SQL Server 2008中已
取消)
更多请看:后备份日志与no_log使用,滥用和非法跟踪标志
下面的例子说明了这一点:
复制代码代码如下所示:
创建数据库logchaintest;
去
修改数据库logchaintest集完全恢复;
去
备份数据库logchaintest
磁盘= c: sqlskills logchaintest bck'with初始化;
去
备份日志logchaintest磁盘= c: sqlskills logchaintest_log1 bck'with初始化;
去
修改数据库logchaintest集回收简单;
去
修改数据库logchaintest集完全恢复;
去
结果是:
复制代码代码如下所示:
168页已
处理的database'logchaintest的file'logchaintest(位于
文件1)。
2页已处理的database'logchaintest的file'logchaintest_log(位于文件1)。
备份数据库成功处理了170页,花费了0.224秒(5.916兆字节/秒)。
3页已处理的database'logchaintest的file'logchaintest_log(位于文件1)。
备份日志成功处理了3页,花费了0.121秒(0.137兆字节/秒)。
我首先创建了一个数据库,并将其
设置为完全恢复模式。这是日志链的起点,然后转到简单恢复模式,然后转到完全恢复模式。
接下来,我尝试做日志备份。
复制代码代码如下所示:
备份日志logchaintest磁盘= c: sqlskills logchaintest_log2 bck'with初始化;
去
错误信息如下:
复制代码代码如下所示:
消息4214,第16级,状态1,第一行
由于当前没有数据库备份,所以无法
执行备份日志。
消息3013,第16级,状态1,第一行
备份日志正在终止异常。
SQL Server记录了我销毁日志链的操作,由于日志备份操作以来的上次日志备份,所以无法备份所有日志,因此SQL Server不允许我备份日志。
错误的是我们现在需要完全备份来恢复日志链,但事实上,我只需要做一个差异备份。
复制代码代码如下所示:
备份数据库logchaintest磁盘=想: test_bak logchaintest_log1 bck'with init,差;
去
备份日志logchaintest磁盘=想: test_bak logchaintest_log1 bck'with初始化;
去
所得结果:
复制代码代码如下所示:
64页已处理的database'logchaintest的file'logchaintest(位于文件1)。
1页已处理的database'logchaintest的file'logchaintest_log(位于文件1)。
带有差异的备份数据库成功处理了65页,花费了0.119秒(4.267兆字节/秒)。
1页已处理的database'logchaintest的file'logchaintest_log(位于文件1)。
备份日志成功处理了1页,花费了0.052秒(0.150兆字节/秒)。
必须说,这种方式比较酷,因为不需要完整的备份来继续日志备份。
如果您的备份
策略包含一个文件或文件组备份,你会需要一个单一的文件差异备份继续日志备份。但前提是,备份的跨度超过了LSN的长度,当然这是一个更深层次的话题。
它也揭示了一个误解!