将包含UNC路径的200,000多行更新为SQL Server表中的新主机名

时间:2015-04-09 05:42:38

标签: sql-server sql-server-2008

我们正在替换我们失败的业务中的文件服务器,并且在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,以便将来的替换不需要数据库更新:)

2 个答案:

答案 0 :(得分:2)

您可以尝试以下解决方案之一

  1. 在启动UPDATE之前,先对数据库进行日志备份。在所有UPDATES完成后进行日志备份。您可以,因为没有事务边界(BEGIN TRANCOMMIT)独立运行这些边界,您可以在每个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>
    

    依旧......

  2. 更改为简单恢复模型并运行UPDATE。切换回完整恢复模型并进行完整备份。

  3. 切换到简单恢复模式后,如果Update由于事务日志空间仍然失败。您也可以尝试批量运行Update。获取批量大小,比如10k记录并运行特定批次的UPDATE,然后发出CHECKPOINT然后继续下一批。

  4. 如果所有其他方法都失败,请增加日志文件空间

答案 1 :(得分:1)

听起来你只需要备份&amp;在运行此之前截断tlog。如果可能的话,它还有助于增加最大日志大小。

如果仍然无法完成,请分批运行(Update top (10000))直到日志填满,再次备份日志,重复完成。