【发布时间】:2019-08-31 11:19:31
【问题描述】:
我昨天发帖是因为我们有一个基本上用于应用程序目的的数据库,但它使用的是“master”——确实很糟糕。我们创建了一个名为 school 的新数据库,现在正在使用它(与 master 的结构相同,但减去了正确重命名的表)。我试图将 .bak 文件从旧数据库(sql 2008 中的主数据库)恢复到新学校数据库(sql 2016 中的学校)。
问题是,运行脚本给了我一堆行,说它正在更新,然后恢复异常终止......我的数据库当时处于恢复挂起状态,我尝试运行紧急代码,但它似乎很坏,我我不确定 1. 为什么它首先失败了 2. 现在该怎么办。
下面是脚本代码和错误信息
use school;
DECLARE @TableSchema sys.sysname = N'dbo'
DECLARE @TableName sys.sysname = N'rolerights'
DECLARE @OldTableName sys.sysname = N'rolerigths'
DECLARE @OldTableWithSchema NVARCHAR(256) = QUOTENAME(@TableSchema) + '.' + QUOTENAME(@OldTableName)
DECLARE @TableWithSchema NVARCHAR(256) = QUOTENAME(@TableSchema) + '.' + QUOTENAME(@TableName)
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @TableName))
BEGIN
EXEC sp_rename @TableWithSchema, @OldTableName
END
DECLARE @Table TABLE ([LogicalName] varchar(128),[PhysicalName] varchar(128), [Type] varchar, [FileGroupName] varchar(128), [Size] varchar(128),
[MaxSize] varchar(128), [FileId]varchar(128), [CreateLSN]varchar(128), [DropLSN]varchar(128), [UniqueId]varchar(128), [ReadOnlyLSN]varchar(128), [ReadWriteLSN]varchar(128),
[BackupSizeInBytes]varchar(128), [SourceBlockSize]varchar(128), [FileGroupId]varchar(128), [LogGroupGUID]varchar(128), [DifferentialBaseLSN]varchar(128), [DifferentialBaseGUID]varchar(128),
[IsReadOnly]varchar(128), [IsPresent]varchar(128), [TDEThumbprint]varchar(128), [SnapshotUrl]varchar(128)
)
DECLARE @Path varchar(1000)='C:\Program Files\Microsoft SQL Server\MSSQL13.SQLEXPRESS\MSSQL\Backup\SQL2008backup.bak'
DECLARE @LogicalNameData varchar(128),@LogicalNameLog varchar(128)
INSERT INTO @table
EXEC('
RESTORE FILELISTONLY
FROM DISK=''' +@Path+ '''
')
SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')
SELECT @LogicalNameData, @LogicalNameLog
use master;
declare @MasterData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output
select @MasterData=substring(@MasterData, 3, 255)
select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData)))
print @MasterData
print @LogicalNameData
declare @MasterLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output
select @MasterLog=substring(@MasterLog, 3, 255)
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog)))
print @MasterLog
print @LogicalNameLog
declare @DefaultData nvarchar(512)
select isnull(@DefaultData, CONVERT(nvarchar(512), @MasterData))
declare @DefaultLog nvarchar(512)
select isnull(@DefaultLog, CONVERT(nvarchar(512), @MasterLog))
declare @NewDefaultData nvarchar(512) = @MasterData + '\' + 'school.MDF'
declare @NewDefaultLog nvarchar(512) = @MasterLog + '\' + 'school.LDF'
SET DEADLOCK_PRIORITY 10
ALTER DATABASE school
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE school FROM DISK=@Path
WITH MOVE @LogicalNameData TO @NewDefaultData,
MOVE @LogicalNameLog TO @NewDefaultLog,
REPLACE
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @OldTableName))
BEGIN
EXEC sp_rename @OldTableWithSchema, @TableName
END
他是应急脚本
ALTER DATABASE [school] SET EMERGENCY;
GO
ALTER DATABASE [school] set single_user
GO
DBCC CHECKDB ([school], REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;
GO
ALTER DATABASE [school] set multi_user
GO
还有错误:
Msg 5069, Level 16, State 1, Line 3
ALTER DATABASE statement failed.
Msg 946, Level 14, State 1, Line 5
Cannot open database 'school' version 677. Upgrade the database to the latest version.
Msg 946, Level 14, State 1, Line 7
Cannot open database 'school' version 677. Upgrade the database to the latest version.
Msg 5069, Level 16, State 1, Line 7
ALTER DATABASE statement failed.
查看原始日志...这就是失败的原因。显然抛出了关于文件流垃圾收集的异常......
FILESTREAM Failed to find the garbage collection table.
【问题讨论】:
标签: sql sql-server database-restore disaster-recovery