我一直在使用下面的代码在午夜删除并创建一个名为(当前年份数据库)_daily的新备份,以便我的团队测试新的脚本或对我们的学生信息系统的更新。
它去年全年都有效,而今年由于我不知道的原因,脚本抛出了一个错误。
这是脚本:
USE master;
GO
-- the original database (use 'SET @DB = NULL' to disable backup)
DECLARE @SourceDatabaseName varchar(200)
DECLARE @SourceDatabaseLogicalName varchar(200)
DECLARE @SourceDatabaseLogicalNameForLog varchar(200)
DECLARE @query varchar(2000)
DECLARE @DataFile varchar(2000)
DECLARE @LogFile varchar(2000)
DECLARE @BackupFile varchar(2000)
DECLARE @TargetDatabaseName varchar(200)
DECLARE @TargetDatbaseFolder varchar(2000)
-- ****************************************************************
SET @SourceDatabaseName = '[DST18000RD]' -- Name of the source database
SET @SourceDatabaseLogicalName = 'DST18000RD' -- Logical name of the DB ( check DB properties / Files tab )
SET @SourceDatabaseLogicalNameForLog = 'DST18000RD_log' -- Logical name of the DB ( check DB properties / Files tab )
SET @BackupFile = 'F:\Dev_Databases\Temp\backup.dat' -- FileName of the backup file
SET @TargetDatabaseName = 'DST18000RD_Daily' -- Name of the target database
SET @TargetDatbaseFolder = 'F:\Dev_Databases\Temp\'
-- ****************************************************************
SET @DataFile = @TargetDatbaseFolder + @TargetDatabaseName + '.mdf';
SET @LogFile = @TargetDatbaseFolder + @TargetDatabaseName + '.ldf';
-- Disconnect any users using @TargetDatabaseName
USE [master];
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id('DST18000RD_Daily')
EXEC(@kill);
-- Backup the @SourceDatabase to @BackupFile location
IF @SourceDatabaseName IS NOT NULL
BEGIN
SET @query = 'BACKUP DATABASE ' + @SourceDatabaseName + ' TO DISK = ' + QUOTENAME(@BackupFile,'''')
PRINT 'Executing query : ' + @query;
EXEC (@query)
END
PRINT 'OK!';
-- Drop @TargetDatabaseName if exists
IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TargetDatabaseName)
BEGIN
SET @query = 'DROP DATABASE ' + @TargetDatabaseName
PRINT 'Executing query : ' + @query;
EXEC (@query)
END
PRINT 'OK!'
-- Restore database from @BackupFile into @DataFile and @LogFile
SET @query = 'RESTORE DATABASE ' + @TargetDatabaseName + ' FROM DISK = ' + QUOTENAME(@BackupFile,'''')
SET @query = @query + ' WITH MOVE ' + QUOTENAME(@SourceDatabaseLogicalName,'''') + ' TO ' + QUOTENAME(@DataFile ,'''')
SET @query = @query + ' , MOVE ' + QUOTENAME(@SourceDatabaseLogicalNameForLog,'''') + ' TO ' + QUOTENAME(@LogFile,'''')
PRINT 'Executing query : ' + @query
EXEC (@query)
PRINT 'OK!'
该脚本不是我的脚本,我整理了两个脚本来获取所需的信息。我们的旧数据库DST17000RD,此脚本仍然可以完美运行。在新数据库DST18000RD上,出现以下错误:
Executing query : BACKUP DATABASE [DST18000RD] TO DISK = 'F:\Dev_Databases\Temp\backup.dat'
Processed 1209552 pages for database 'DST18000RD', file 'DST18000RD' on file 23.
Processed 2 pages for database 'DST18000RD', file 'DST18000RD_log' on file 23.
BACKUP DATABASE successfully processed 1209554 pages in 139.942 seconds (67.525 MB/sec).
OK!
OK!
Executing query : RESTORE DATABASE DST18000RD_Daily FROM DISK = 'F:\Dev_Databases\Temp\backup.dat' WITH MOVE 'DST18000RD' TO 'F:\Dev_Databases\Temp\DST18000RD_Daily.mdf' , MOVE 'DST18000RD_log' TO 'F:\Dev_Databases\Temp\DST18000RD_Daily.ldf'
Msg 3234, Level 16, State 2, Line 3
Logical file 'DST18000RD' is not part of database 'DST18000RD_Daily'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.
OK!
需要注意的一些事情可能只是我在错误的树上吠叫。 DST17000RD数据库为兼容级别SQL Server 2012(110),DST18000RD数据库为SQL Server 2017(140)。在创建新数据库之前的几个月,服务器已升级并迁移。
感谢您的帮助。据我所知,我觉得脚本在尝试为* _daily数据库复制文件之前没有重命名MDF和LDF文件?老实说,我不确定。我是一个伪装的DBA,可以根据需要自学。预先感谢您的帮助!
答案 0 :(得分:0)
错误告诉您db文件的逻辑名称错误:
SET @SourceDatabaseLogicalName = 'DST18000RD' -- Logical name of the DB ( check DB properties / Files tab )
并运行:
RESTORE FILELIST ONLY FROM DISK = 'F:\Dev_Databases\Temp\backup.dat'
要查看正确的逻辑文件名。
答案 1 :(得分:0)
问题是您正在尝试在数据库还原期间更改文件逻辑名,即使使用MOVE
子句也无法更改。
MOVE
子句允许您更改物理文件的位置和名称,但不对逻辑名称做任何事情。
修复
您将不得不使用数据库的现有逻辑名,但是一旦恢复了数据库,然后使用ALTER DATABASE
命令使用以下命令来更改文件的逻辑名:
USE [master];
GO
ALTER DATABASE [DST18000RD]
MODIFY FILE ( NAME = DST17000RD , NEWNAME = DST18000RD );
GO