首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在日志备份期间,数据是备份到操作的开始还是结束?

在日志备份期间,数据是备份到操作的开始还是结束?
EN

Database Administration用户
提问于 2019-10-30 11:49:58
回答 2查看 2.1K关注 0票数 19

假设我正在运行日志备份,而日志备份需要10分钟才能完成。在这10分钟的窗口中,将运行进一步的事务。给定下面的示例,日志备份实际上包含哪些事务?

  1. 事务A提交
  2. 事务B打开
  3. 日志备份开始
  4. 事务C打开
  5. 事务B提交
  6. 日志备份完成
  7. 事务C提交
EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-10-30 18:09:45

日志备份文件应包含到备份完成时为止的所有事务(包括尚未提交的事务),您可以按如下方式验证它:

代码语言:javascript
运行
复制
CREATE DATABASE MyDB;
ALTER DATABASE MyDB SET RECOVERY FULL;

USE MyDB;
CREATE TABLE LogTest (numbers int);

一旦创建了数据库和测试中将要使用的表,就可以进行第一个完全备份,这样以后就可以进行日志备份了。

代码语言:javascript
运行
复制
BACKUP DATABASE MyDB 
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_FULL.bak';

现在已经完成了完全备份,让我们在表中插入一些数据:

代码语言:javascript
运行
复制
USE MyDB;

INSERT INTO LogTest(numbers) VALUES (1);

BEGIN TRAN
INSERT INTO LogTest(numbers) VALUES (2);

请注意,第二个插入位于尚未提交的BEGIN TRAN下。接下来,我们将使用函数[fn_dblog ]检查日志文件的内容,然后再进行日志备份。

代码语言:javascript
运行
复制
SELECT [Current LSN], [Operation], [SPID], [Transaction Name], [Begin Time], [End Time] FROM fn_dblog(NULL, NULL);

在图中我们可以看到与第一和第二INSERT相关的LSNs。

代码语言:javascript
运行
复制
BACKUP LOG MyDB 
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn';

进行了日志备份,我们可以使用以下查询使用函数fn_转储_dblog读取其内容:

代码语言:javascript
运行
复制
SELECT [Current LSN], [Transaction ID], [Transaction Name], [Operation], [Begin Time] 
FROM fn_dump_dblog (NULL, NULL, N'DISK', 1, N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn',
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);

正如我们所看到的,那些与未完成的事务相关的LSNs实际上在事务日志备份上,即使它们没有提交。问题是,作为微软说

事务日志是数据库的关键组件。如果出现系统故障,您将需要该日志将数据库恢复到一致状态。

因此,在执行日志备份的还原之后,与那些未完成的事务相关的数据将被回滚,以保持数据库处于一致状态(请参见恢复和事务日志)。

您可以考虑安全(可以恢复)所有已提交的事务。可以通过删除数据库MyDB和还原上述步骤生成的备份来验证它。

票数 23
EN

Database Administration用户

发布于 2019-10-30 12:11:47

事务日志包含事务日志完成时已完全提交的所有事务。

要使用上面的示例,事务日志包含A和B。这类似于完整备份,后者包含备份完成时提交的所有事务的尾日志备份。

本网站是优秀的进一步阅读。https://sqlbak.com/academy/transaction-log-backup

票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/252191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档