我们正在替换我们失败的业务中的文件服务器,并且在SQL Server数据库的某些表中有大约。 200k记录,其中的列存储了旧文件服务器上托管的文件的UNC文件路径。
我目前正在使用以下代码来实现更新,遗憾的是,它失败了抱怨事务日志已满,我最终还是要恢复数据库。
DECLARE @currentServerName as nvarchar(50)
DECLARE @newServerName as nvarchar(50)
DECLARE @likeMatch as nvarchar(50)
SET @currentServerName = N'\\dom-fls-p01.localdom\';
SET @newServerName = N'\\dom-filesrv.localdom\';
SET @likeMatch = @currentServerName + '%';
UPDATE [DownloadQueue]
SET [LocalPath] = @newServerName + SUBSTRING([LocalPath], LEN(@currentServerName)+1, LEN([LocalPath])-LEN(@currentServerName))
WHERE [LocalPath] LIKE @likeMatch
UPDATE [DetectionFile]
SET [OriginalFileLocation] = @newServerName + SUBSTRING([OriginalFileLocation], LEN(@currentServerName)+1, LEN([OriginalFileLocation])-LEN(@currentServerName))
WHERE [OriginalFileLocation] LIKE @likeMatch
UPDATE [FileTransferOperation]
SET [TargetPath] = @newServerName + SUBSTRING([TargetPath], LEN(@currentServerName)+1, LEN([TargetPath])-LEN(@currentServerName))
WHERE [TargetPath] LIKE @likeMatch
UPDATE [WorkQueue]
SET [Location] = @newServerName + SUBSTRING([Location], LEN(@currentServerName)+1, LEN([Location])-LEN(@currentServerName))
WHERE [Location] LIKE @likeMatch
有人能提出更好的方法来实现我的目标吗?
谢谢,
济。
聚苯乙烯。是的,我们正在将其更改为新的CName,以便将来的替换不需要数据库更新:)
答案 0 :(得分:2)
您可以尝试以下解决方案之一
在启动UPDATE
之前,先对数据库进行日志备份。在所有UPDATES
完成后进行日志备份。您可以,因为没有事务边界(BEGIN TRAN
,COMMIT
)独立运行这些边界,您可以在每个UPDATE
语句后进行日志备份。这样的事情。
UPDATE [DownloadQueue] SET [LocalPath] = @newServerName + SUBSTRING([LocalPath], LEN(@currentServerName)+1, LEN([LocalPath])-LEN(@currentServerName)) WHERE [LocalPath] LIKE @likeMatch
运行日志备份
BACKUP LOG <DatbaseName>
下一次更新声明
UPDATE [DetectionFile] SET [OriginalFileLocation] = @newServerName + SUBSTRING([OriginalFileLocation], LEN(@currentServerName)+1, LEN([OriginalFileLocation])-LEN(@currentServerName)) WHERE [OriginalFileLocation] LIKE @likeMatch
运行日志备份
BACKUP LOG <DatbaseName>
依旧......
更改为简单恢复模型并运行UPDATE
。切换回完整恢复模型并进行完整备份。
切换到简单恢复模式后,如果Update
由于事务日志空间仍然失败。您也可以尝试批量运行Update
。获取批量大小,比如10k记录并运行特定批次的UPDATE
,然后发出CHECKPOINT
然后继续下一批。
如果所有其他方法都失败,请增加日志文件空间
答案 1 :(得分:1)
听起来你只需要备份&amp;在运行此之前截断tlog。如果可能的话,它还有助于增加最大日志大小。
如果仍然无法完成,请分批运行(Update top (10000)
)直到日志填满,再次备份日志,重复完成。