如何通过脚本仅还原数据和日志文件,忽略其他文件

时间:2013-12-03 20:22:36

标签: sql-server sqlcmd

我非常懒,所以我花了好几个小时写一个批处理文件来处理将数据库恢复到sql server并在发生之后对它进行一大堆修改。

不同的人向我发送我正在使用的数据库。

我只需要数据库和事务日志,跳过任何其他文件。目前,我的大多数数据库都有以下工作。

此部分在批次中。

SQLCMD -S %SName% -U %UName% -P %Pwd% -v varDBName=%DBName% varDBPath=%1 varSQLLogPath=%SQLLogPath% varSQLDataPath=%SQLDataPath% -i "%RunningPath%\RestoreScript.sql" -o "%RunningPath%\Restore_Log.txt"

这是我正在调用的恢复脚本。

RESTORE DATABASE [$(varDBName)] FROM DISK = N'$(varDBPath)' WITH FILE = 1, MOVE N'MQ1CS_Data' TO N'$(varSQLDataPath)\$(varDBName).MDF', MOVE N'MQ1CS_Log' TO N'$(varSQLLogPath)\$(varDBName).LDF',  NOUNLOAD, REPLACE, STATS = 10

我遇到的问题是我正在尝试恢复的数据库有第三个文件,名为sysFT_OpenIssuesFT。我猜这个变化的文件名取决于DBA如何设置它。有没有办法只恢复上面两个文件?数据库是否可以在没有第三个完整文本文件的情

如何编写该SQL脚本,以便只恢复数据和日志文件而不进行其他操作?

1 个答案:

答案 0 :(得分:1)

每个数据库可以有多个数据文件甚至日志文件。但即使您只有1个数据和1个日志文件,文件的逻辑名称对于每个数据库仍然可能不同。

您可以使用以下代码从备份文件中检索所有文件:

CREATE TABLE #filelist
(
    LogicalName NVARCHAR(128),
    PhysicalName NVARCHAR(260),
    Type CHAR(1),
    FileGroupName NVARCHAR(128),
    Size NUMERIC(20,0),
    MaxSize NUMERIC(20,0),
    FileId TINYINT,
    CreateLSN NUMERIC(25,0),
    DropLSN NUMERIC(25, 0),
    UniqueID uniqueidentifier,
    ReadOnlyLSN NUMERIC(25,0),
    ReadWriteLSN NUMERIC(25,0),
    BackupSizeInBytes BIGINT,
    SourceBlockSize INT,
    FileGroupId INT,
    LogGroupGUID UNIQUEIDENTIFIER,
    DifferentialBaseLSN NUMERIC(25,0),
    DifferentialBaseGUID UNIQUEIDENTIFIER,
    IsReadOnly BIT,
    IsPresent BIT,
    TDEThumbprint VARBINARY(32)
);

INSERT INTO #filelist
    EXEC('RESTORE FILELISTONLY  FROM  DISK = N''$(varDBPath)''');

SELECT * FROM #filelist;

DROP TABLE #filelist;

使用临时表#filelist中的文件名,您应该能够创建正确的恢复语句。