gpt4 book ai didi

sql-server - 使用新文件名的 SQL Server 还原数据库

转载 作者:行者123 更新时间:2023-12-05 05:25:48 24 4
gpt4 key购买 nike

是否可以从备份中恢复 SQL Server 数据库,同时使用新名称创建 *.mdf*.ldf 文件?

假设我知道每个备份只有两个文件(一个mdf和一个ldf),但我不知道这些文件的确切名称和不幸的是,我无法从数据库名称中导出它们。

所有这一切的目的是创建批处理文件,该文件将从一组备份文件中恢复数据库。同时我必须解决文件名冲突的问题。

目前我有这个命令,它不适用于每个备份,因为一些数据库文件的命名与变量 %DATABASENAME% 不同:

...
RESTORE DATABASE [%NewDB%]
FROM DISK = N'%BACKUPFILENAME%'
WITH RECOVERY,
MOVE N'%DATABASENAME%' TO N'C:\%NewDB%.mdf',
MOVE N'%DATABASENAME%_Log' TO N'C:\%NewDB%_Log.ldf'
...

最佳答案

可以使用 RESTORE FILELISTONLY 获取备份中数据文件的详细信息.

您可以通过将此信息插入到临时表或表变量中来将此信息放入可用于构建还原语句的表中。将其集成到您现有的代码中:

DECLARE @fileListTable TABLE
(
LogicalName NVARCHAR(128),
PhysicalName NVARCHAR(260),
[Type] CHAR(1),
FileGroupName NVARCHAR(128),
SIZE NUMERIC(20,0),
MaxSize NUMERIC(20,0),
FileID BIGINT,
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)
)

--This schema works from SQL 2008 to SQL 2014.
--SQL 2005 didn't have the TDEThumbprint column, but is otherwise the same.

INSERT INTO @fileListTable EXEC('restore filelistonly
FROM DISK = N''%BACKUPFILENAME%''')

DECLARE @datafile NVARCHAR(128), @logfile NVARCHAR(128)

SELECT @datafile = LogicalName FROM @fileListTable WHERE Type = 'D'

SELECT @logfile = LogicalName FROM @fileListTable WHERE Type = 'L'

RESTORE DATABASE [%NewDB%]
FROM DISK = N'%BACKUPFILENAME%'
WITH RECOVERY,
MOVE @datafile TO N'C:\%NewDB%.mdf',
MOVE @logfile TO N'C:\%NewDB%_Log.ldf'

在有更多数据/日志文件的场景下,代码需要相应地更复杂。

解决文件名冲突可能性的一种方法是将时间戳、GUID 或其他合理的唯一标识符附加到新文件名。

关于sql-server - 使用新文件名的 SQL Server 还原数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29821433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com