var*_*ble 5 sql-server backup restore transaction-log
我们配置了完整备份和日志备份。
在恢复过程中,我们应用完整备份和后续日志备份。
我知道,如果我进行手动完整备份(非仅复制模式),那么它将破坏差异链。但在本例中没有差异备份。然而,存在事务日志链。由于仅非复制完整备份,该链是否会受到负面影响?
如果我们只是带着你的问题来分析msdb数据库中存储的信息,那么答案是:是的,一个没有设置BACKUP DATABASE ...
参数的COPY_ONLY
,会对备份链(历史...)产生影响。
这是因为一旦执行database_backup_lsn
FULL 语句,与备份信息一起存储的(LSN = Log Sequence Number)就会更改。BACKUP DATABASE...
后续事务日志 (TLOG) 备份引用完整备份。如下图所示:
在2021-09-11 22:19:17.000创建的日志备份引用了database_backup_lsn
LSN 1221000000228000037
,该 LSN 是first_lsn
大约一周前发生的最后一次完整备份。
在2021-09-11 23:15:13.000创建的日志备份引用了database_backup_lsn
LSN 1221000000714400037
,这是在2021-09-11 22:34:32.000first_lsn
发生的完整数据库备份的LSN 。
如果自给定的完整备份以来您有一个完整的 TLOG 备份链,那么就不会产生任何影响。您可以使用完整数据库备份和后续的 TLOG 备份文件将数据库恢复到任意时间点。
但是,如果您的 TLOG 备份链已损坏,则您只能使用完整备份和任何可用的 TLOG 备份来恢复数据库,直至丢失 TLOG 文件。
如何判断备份日志链是否损坏?(DBA Stackexchange 答案)
完整备份包含数据库的一致状态。(警告:您必须恢复此文件才能证明这一点。或者备份仅在恢复后才有效。)
TLOG 备份包含自上次备份(FULL 或 TLOG)以来所有已提交的事务。备份包含 afirst_lsn
和 a last_lsn
。由于这些通常是按顺序排列的,因为上last_lsn
一个 TLOG 备份的备份是下first_lsn
一个 TLOG 备份的备份,所以您应该有一个连续的 TLOG 备份序列,这将允许您将数据库恢复到任何时间点,前提是您有完整的 TLOG 备份链。
该COPY_ONLY
参数只是告诉SQL Server执行完整备份,但不重置database_backup_lsn
存储在msdb中的备份历史记录。所有后续 TLOG 备份仍将基于上次创建的不带该COPY_ONLY
参数的完整备份。
在没有该标志的情况下执行完整备份COPY_ONLY
将改变信息在 GUI 中的显示方式。GUI 通常会根据指定的时间显示使数据库恢复到一致状态所需的最后一次完整、差异和 TLOG 备份。这是因为 GUI 读取 msdb 备份历史信息。
为了您的方便,我添加了我使用的脚本。
/* ==================================================================
Author......: hot2use
Date........: 25.04.2018
Version.....: 0.1
Server......: localhost (first created for)
Database....: msdb
Owner.......: -
Table.......: various
Type........: Script
Name........: ADMIN_Retrieve_Backup_History_Information.sql
Description.: Retrieve backup history information from msdb database
............
............
............
History.....: 0.1 h2u First created
............
............
================================================================== */
SELECT /* Columns for retrieving information */
-- CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SRVNAME,
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_start_date,
msdb.dbo.backupset.backup_finish_date,
-- msdb.dbo.backupset.expiration_date,
CASE msdb.dbo.backupset.type
WHEN 'D' THEN 'Full'
WHEN 'I' THEN 'Diff'
WHEN 'L' THEN 'Log'
END AS backup_type,
-- msdb.dbo.backupset.backup_size / 1024 / 1024 as [backup_size MB],
msdb.dbo.backupmediafamily.logical_device_name,
msdb.dbo.backupmediafamily.physical_device_name,
-- msdb.dbo.backupset.name AS backupset_name,
-- msdb.dbo.backupset.description,
msdb.dbo.backupset.is_copy_only,
msdb.dbo.backupset.is_snapshot,
msdb.dbo.backupset.checkpoint_lsn,
msdb.dbo.backupset.database_backup_lsn,
msdb.dbo.backupset.differential_base_lsn,
msdb.dbo.backupset.first_lsn,
msdb.dbo.backupset.fork_point_lsn,
msdb.dbo.backupset.last_lsn
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset
ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
/* ----------------------------------------------------------------------------
Generic WHERE statement to simplify selection of more WHEREs
-------------------------------------------------------------------------------*/
WHERE 1 = 1
/* ----------------------------------------------------------------------------
WHERE statement to find Device Backups with '{' and date n days back
------------------------------------------------------------------------------- */
-- AND physical_device_name LIKE '{%'
/* -------------------------------------------------------------------------------
WHERE statement to find Backups saved in standard directories, msdb.dbo.backupfile AS b
---------------------------------------------------------------------------------- */
-- AND physical_device_name LIKE '[fF]:%' -- STANDARD F: Backup Directory
-- AND physical_device_name NOT LIKE '[nN]:%' -- STANDARD N: Backup Directory
-- AND physical_device_name NOT LIKE '{%' -- Outstanding Analysis
-- AND physical_device_name NOT LIKE '%$\Sharepoint$\%' ESCAPE '$' -- Sharepoint Backs up to Share
-- AND backupset_name NOT LIKE '%Galaxy%' -- CommVault Sympana Backup
/* -------------------------------------------------------------------------------
WHERE Statement to find backup information for a certain period of time, msdb.dbo.backupset AS b
----------------------------------------------------------------------------------
AND (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7) -- 7 days old or younger
AND (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) <= GETDATE()) -- n days old or older
*/
/* -------------------------------------------------------------------------------
WHERE Statement to find backup information for (a) given database(s)
---------------------------------------------------------------------------------- */
-- AND database_name IN ('AdventureWorks2012') -- database names
-- AND database_name IN ('rtc') -- database names
/* -------------------------------------------------------------------------------
ORDER Clause for other statements
---------------------------------------------------------------------------------- */
--ORDER BY msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_finish_date -- order clause
---WHERE msdb..backupset.type = 'I' OR msdb..backupset.type = 'D'
ORDER BY
--2,
2 DESC,
3 DESC
Run Code Online (Sandbox Code Playgroud)
完整(或差异)备份不会影响或破坏日志备份顺序。这与您是否指定 COPY_ONLY 无关。
不过,它将影响恢复 GUI 以及它选择的备份作为恢复序列的基础。但这只是 GUI 的事情。
如果您在没有 copy_only 的情况下进行备份,恢复 GUI 将从该备份开始恢复序列(直到您执行下一次完整备份)。
如果您在没有copy_only 的情况下进行备份,那么这将不会成为恢复顺序的基础。