我正在致力于将 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 文件大小没有变化。
通过检查数据本身我能够看到差异。