AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 299788
Accepted
J.D.
J.D.
Asked: 2021-09-18 09:43:30 +0800 CST2021-09-18 09:43:30 +0800 CST 2021-09-18 09:43:30 +0800 CST

为什么对我的数据库进行完整备份还原时出现错误“RESTORE 只能在还原完整备份时创建数据库...”?

  • 772

我已经制定了维护计划,每天对服务器上的所有数据库进行完整备份。我还设置了第二个维护计划,每 5 分钟备份一次事务日志。事务日志备份作业在晚上 11 点到凌晨 1 点之间停止并重新启动,以允许进行服务器级备份(在基础架构团队的建议下,可能会重新访问)。我不认为这应该是一个问题,因为我有另一台服务器遵循相同的模式,并且它的备份没有问题。

我正在尝试验证我的备份是否正常工作,但是每当我尝试使用之后的任何事务日志备份来恢复完整备份时,我都会立即收到以下错误:

备份还原错误

我正在尝试将备份还原到单独的服务器(相同的 SQL Server 版本),其主要目的是测试数据库备份的完整性。我正在尝试恢复的数据库当前在该服务器上不存在。

如果它有任何相关性,这些是我正在使用的还原选项:

恢复选项

在Aaron Bertrand 对类似问题的有趣回答之后,我现在正在使用该RESTORE HEADERONLY FROM DISK命令调查一些事情。首先,这些是我的完整备份文件的结果:

完整备份标头

该完整备份中仅存储一个数据库/文件。

此外,如果我RESTORE HEADERONLY FROM DISK在最后一次完整备份之后运行我的第一个事务日志备份文件、完整备份文件本身以及最后一次完整备份之前的最后一个事务日志备份文件,我会注意到以下 LSN:

LSN

我认为DatabaseBackupLSN所有备份的 都应该与FirstLSN这些备份之前的最后一个完整备份相匹配。对我来说奇怪的是,它们似乎都指向较旧的完整备份。

当我尝试生成 SSMS 尝试执行的还原脚本时,奇怪的是我得到了与工具提示相同的错误,并且它不会给我脚本:

恢复脚本

仔细检查后,当我选择所有备份(包括完整备份)时,SSMS 会自动删除完整备份并仅加载要还原的事务日志备份。我真的认为有一个损坏的备份链让 SSMS 感到困惑:

仅事务日志备份

如果我只选择要恢复的完整备份,那么它可以让我单击脚本按钮,这就是完整备份本身的脚本:

USE [master]
RESTORE DATABASE [MyDatabase] FROM  DISK = N'P:\MyDatabase\MyDatabase_backup_2021_09_16_223001_3540051.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5

此外,我的维护计划未设置为“仅复制备份”:

完整备份维护计划

作为参考,这里是完整备份维护计划中的数据库之一的 T-SQL 脚本:

BACKUP DATABASE [master] TO  DISK = N'\\OurDomain\Shares\SQL Backups\Full Backups\master\master_backup_2021_09_19_004931_6111907.bak' WITH  RETAINDAYS = 14, NOFORMAT, NOINIT,  NAME = N'master_backup_2021_09_19_004931_6111907', SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 10

如果我手动编写完整备份的还原以及在该完整备份之后发生的最接近事务日志备份的脚本,它会很好地还原完整备份并将数据库保留在其中,NORECOVERY但事务日志备份失败并出现以下错误:

手动脚本还原失败

这些是我编写的手动脚本:

USE [master]

RESTORE DATABASE [MyDatabase] 
FROM DISK = N'P:\MyDatabase\MyDatabase_backup_2021_09_16_223001_3540051.bak'
WITH NORECOVERY;

RESTORE LOG [MyDatabase]
FROM DISK = N'P:\MyDatabase\MyDatabase_backup_2021_09_16_223001_4008446.trn'
WITH RECOVERY;

奇怪的是,如果我尝试恢复在完全备份之前发生的最近的事务日志备份,我会得到完全相同的错误消息,引用完全相同的 LSN。所以就像我的事务日志备份没有遵循与我的完整备份相同的备份链?

我能想到的唯一其他相关信息是这些备份维护计划最初是在 SQL Server 2016 实例上设置的。该实例的服务器崩溃了,我们使用 SQL Server 2019 实例启动了一个全新的服务器。我将所有用户和系统数据库从备份(讽刺地)还原到新的 SQL Server 2019 实例。(我必须首先在 2016 实例上恢复系统数据库,并在它允许我在新的 2019 服务器上恢复它们​​之前进行就地升级。)我无法成功恢复到新服务器的唯一数据库是master数据库。到目前为止,其他一切似乎都运行良好。

sql-server backup
  • 2 2 个回答
  • 331 Views

2 个回答

  • Voted
  1. Tibor Karaszi
    2021-09-20T06:30:04+08:002021-09-20T06:30:04+08:00

    底线是您(不幸的是)不能依靠 SSMS 来帮助您进行恢复。因为它做的不对。我有一个案例,我在 2014 年报告了哪个 IMO 不好,其中 SSMS 尝试将还原序列基于 copy_only 备份,我已经提醒 MS 几次。这被置若罔闻,所以这对我来说是一个非常明确的信息。请参阅以下几个示例:http ://sqlblog.karaszi.com/?s=restore 。

    在你的情况下,我们没有足够的复制。如果没有 repro,我们只能说“似乎是 SSMS 中的错误”之类的话,我们无能为力。我们不知道您执行了哪些备份,我们不知道您在 GUI 中单击了什么,我们不知道您在第二台服务器上有哪些备份文件。等等。

    如果您希望我们测试您是否误解了 GUI,请给我们一个 repro。

    • 所有 T-SQL 命令开始,您在其中生成备份。
    • 简约的复制品和清晰的描述,准确地描述了您拥有的文件。
    • 您希望 GUI 生成的 TSQL 恢复命令。确保它们按预期工作。
    • 以及您单击 GUI 的确切方式,以便我们重现您的案例。

    也许对你来说是一个艰巨的任务,但没有这个,正如我所提到的,我们会留下“似乎是 SSMS 中的一个错误”......

    • 2
  2. Best Answer
    J.D.
    2021-09-21T07:33:13+08:002021-09-21T07:33:13+08:00

    我们的服务器级备份软件 Veeam 显然被配置为截断事务日志。在明智的 Tibor Karaszi 为我指出正确的方向之前,我不知道 Veeam 甚至可以在数据库级别进行交互:

    Veeam 很烂

    (这是在我存在之前很久就配置好的。旁注,我认为 Veeam 完全没有理由提供这个糟糕的选项。)

    将其更改为备份日志本身(而不是制定维护计划)将解决问题。但我更喜欢让 SQL Server 本地管理备份,因此我们只是在 Veeam Backup & Replication 软件中禁用了对备份的管理。

    在 Veeam Backup & Replication 软件的Edit Backup Job窗口下的Guest Processing屏幕中,我们取消选中“ Enable application-aware processing ”以禁用它。

    作为参考,这是 Veeam关​​于配置它以管理事务日志的文档。

    • 2

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve