我正在致力于将 SQL Server 从 SQL 2016 迁移到 SQL 2022。
我有一个过程,在从完整磁带(来自第三方供应商)恢复数据库(到“待机/只读”状态)之后,我应该将每个每小时日志文件(bak)添加到这个“待机/只读”数据库中。
我试图将在 SQL 2016(过去 4 年)中运行的 T-SQL 代码运行到这个新环境(SQL 2022)中,我收到的第一个错误消息是关于这一部分的:
EXEC master.sys.xp_cmdshell @cmd
因此,我使用 Google 搜索并运行了以下代码:
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
当我运行代码时,似乎没有错误消息,但我没有看到数据库的日志文件的大小增加。
我将整个 T-SQL 代码放在这里以供参考:
USE Master;
GO
SET NOCOUNT ON
-- 1 - Variable declaration
DECLARE @dbName sysname
DECLARE @fileName sysname
DECLARE @standby sysname
DECLARE @backupPath NVARCHAR(500)
DECLARE @cmd NVARCHAR(500)
DECLARE @fileList TABLE (backupFile NVARCHAR(255))
DECLARE @lastFullBackup NVARCHAR(500)
DECLARE @lastDiffBackup NVARCHAR(500)
DECLARE @backupFile NVARCHAR(500)
-- 2 - Initialize variables
SET @dbName = 'us_xxxx_multi_replica1'
SET @fileName = 'LOG_us_xxxx_multi_replica'
SET @backupPath = 'F:\Yesterday\'
SET @standby = 'F:\us_xxxx_multi_replica_RollbackUndo_2024-09-17_19-33-23.bak'
-- 3 - get list of files
SET @cmd = 'DIR /b "' + @backupPath + '"'
INSERT INTO @fileList(backupFile)
EXEC master.sys.xp_cmdshell @cmd
-- 5 - check for log backups
DECLARE backupFiles CURSOR FOR
SELECT backupFile
FROM @fileList
WHERE backupFile LIKE '%.bak'
AND backupFile LIKE @fileName + '%'
OPEN backupFiles
-- Loop through all the files for the database
FETCH NEXT FROM backupFiles INTO @backupFile
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'RESTORE LOG [' + @dbName + '] FROM DISK = '''
+ @backupPath + @backupFile + ''' WITH STANDBY = ''' + @standby + ''''
FETCH NEXT FROM backupFiles INTO @backupFile
EXEC (@cmd)
END
CLOSE backupFiles
DEALLOCATE backupFiles
下面是在 SQL 2022 中处理后的结果示例(我遇到了一个问题):
Processed 0 pages for database 'us_xxxx_multi_replica', file 'us_template_pccmulti_rrdb_replica' on file 1.
Processed 952 pages for database 'us_xxx_multi_replica', file 'us_template_pccmulti_rrdb_replica_log' on file 1.
System objects could not be updated in database 'us_xxxx_multi_replica' because it is read-only.
System objects could not be updated in database 'us_xxxx_multi_replica' because it is read-only.
RESTORE LOG successfully processed 952 pages in 1.845 seconds (4.029 MB/sec).
下面是我在 SQL 2016 中运行的结果示例(没有问题):
Processed 2336 pages for database 'us_xxx_multi_replica', file 'us_template_pccmulti_rrdb_replica_log' on file 1.
System objects could not be updated in database 'us_xxx_multi_replica' because it is read-only.
System objects could not be updated in database 'us_xxx_multi_replica' because it is read-only.
RESTORE LOG successfully processed 2336 pages in 0.531 seconds (34.361 MB/sec).
Processed 0 pages for database 'us_xxx_multi_replica', file 'us_template_pccmulti_rrdb_replica' on file 1.
可能存在什么问题?
顺便说一句,当在此虚拟机上安装 SQL 2022 时,已经安装了 SQL 2019(随虚拟机一起提供)。我们的 IT 手动安装了 SQL 2022,所以我想知道是否存在某种未正确设置的权限/配置问题。
因为当我在 SQL 2019 中运行此 T-SQL 代码时,我没有遇到以下问题
EXEC master.sys.xp_cmdshell @cmd
从一开始。
更新:
我没有找到为什么必须处理 SQL 2022 中的“xp_cmdshell”问题(但不是在 SQL 2019 中)的原因,但它运行良好。
我意识到 SQL 2016 中的 ldf 文件大小没有增加,而只有 mdf 文件大小增加。所以,我想我不必担心 ldf 文件大小没有变化。
通过检查数据本身我能够看到差异。
OP 就是你,“原始发帖者”(这是在评论部分询问的)。
看起来您预计 mdf 或 ldf 文件(数据库文件)的大小会在您恢复日志备份时增加和/或减少。是这样吗?
此外,您似乎遇到过这种情况,这种情况发生在早期版本的 SQL Server 上,但是使用相同的过程,这种情况不会发生在较新版本的 SQL Server 中?
此外,您似乎觉得在恢复日志备份时数据库文件的大小不会增加/减少是一个问题?
如果我理解了您的问题,按照我上面的描述:
您所看到的并没有什么不寻常的。最有可能的是,在您的“早期环境”中,源 SQL Server 会频繁收缩数据库文件,然后进行扩展,而当您恢复日志备份时,这种情况也会延续下去。
但负责备份的 DBA 可能已经意识到数据库文件频繁增大和缩小并不是一件好事。也就是说,应将其保持在应有的大小。这就是为什么您从较新的系统进行的日志备份在恢复时不会改变数据库文件的大小。