我可以用两年前的 ldf 恢复当前的 mdf 吗?

Si *_*Ako 2 sql-server sql-server-2000

我的 SQL Server 2000(又名版本 8.0)在电源故障后无法恢复数据库。我发现的唯一备份是当前的 mdf 文件和两年前的 ldf 文件。

我可以使用当前的 mdf 文件和旧的 ldf 文件恢复数据库吗?

Cha*_*ace 5

忽略两年前的 LDF 文件,它此时不相关。

您唯一的选择是重新连接 MDF,而不连接 LDF,并让 SQL Server 重建它。

我建议您此时复制一份 MDF,以防出现其他问题。

CREATE DATABASE YourNewDb
ON (FILENAME = 'YourMDFHere') 
FOR ATTACH_REBUILD_LOG;
Run Code Online (Sandbox Code Playgroud)

如果数据库没有设置检查点并干净地关闭,那么这可能会失败。在这种情况下,您可以使用未记录的FOR ATTACH_FORCE_REBUILD_LOG. 您将丢失任何正在进行的交易,包括尚未设置检查点的已提交交易。

如果有任何事务未设置检查点,数据库的状态可能会不一致。例如,外键可能不正常,其他内部系统表可能不正确。

DBCC CHECKDB ('YourNewDb')
  WITH EXTENDED_LOGICAL_CHECKS, TABLOCK, NO_INFOMSGS;
Run Code Online (Sandbox Code Playgroud)

不使用任何未记录的功能进行重建的另一个选项是创建一个新数据库并将文件复制到其中。首先创建一个使用原始文件的新数据库。

CREATE DATABASE YourNewDb
ON PRIMARY (
    NAME = N'LogicalMDFName', 
    FILENAME = N'NewMDFFileHere'
) 
LOG ON (
    NAME = N'LogicalLDFName',
    FILENAME = N'NewLDFFileHere'
);

ALTER DATABASE YourNewDb SET OFFLINE WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

将旧 MDF 文件复制到新位置。然后执行以下操作:

ALTER DATABASE YourNewDb SET EMERGENCY;
ALTER DATABASE YourNewDb SET SINGLE_USER;
DBCC CHECKDB ('YourNewDb', REPAIR_ALLOW_DATA_LOSS)
  WITH EXTENDED_LOGICAL_CHECKS, TABLOCK, NO_INFOMSGS;
ALTER DATABASE YourNewDb SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)

您的数据中也可能存在CHECKDB无法验证的逻辑不一致。例如,您可能有一个显示用户操作的历史记录表,但该操作并不存在于其自己的表中,或者您可能有较晚但没有较早的行。您需要亲自验证这一点。


最后注意事项:

  • 总是,总是,总是,总是,总是,总是进行备份并测试它们
  • MDF 和 LDF 文件不是备份。SQL Server 具有非常好的内置备份系统,允许您进行完整备份、差异备份和日志备份,并进行时间点恢复。
  • SQL Server 2000 大约 10 年前就已经停产了。现在是您升级的时候了,因为它现在缺少许多安全和性能更新,并且缺少许多新功能。