移动过程中错误命名 MS SQL 服务器 MSBD 和模型 DB 日志文件名

移动过程中错误命名 MS SQL 服务器 MSBD 和模型 DB 日志文件名

我在 SQL 2008R2 上给自己提出了一个有趣的问题。我将 MSDB 和 Model 数据库移到了新驱动器,但在此过程中,我调换了每个数据库的日志文件名,现在它们被颠倒了。SQL 将启动,我可以使用以下脚本检查数据库文件名:

SELECT name,
physical_name AS CurrentLocation,
state_desc
FROM sys.master_files

这证实了名称颠倒的事实。然而,我用来引起问题的脚本返回了“数据库不存在”错误。

ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBLog, FILENAME = ‘F:\SQLLogs\MSDBLog.ldf’);
GO
ALTER DATABASE Model
MODIFY FILE (NAME = ModelLog, FILENAME = ‘F:\SQLLogs\ModelLog.ldf’);
GO

交换文件名以匹配错误配置会导致 SQL 无法启动。

有什么想法可以解决此问题,而无需重建系统数据库?

答案1

我很高兴地说,我找到了解决问题的方法。我遇到的一个根本问题是,我误将错误消息“文件不存在”误认为是数据库文件本身,而不是数据库中的逻辑文件名。我将在下面提供我起草的检查脚本,它帮助我克服了困难。

我最终解决这个问题所采取的步骤:

  1. 关闭 TCP/IP 连接并打开命名管道,以确保仅有本地访问数据库。
  2. 使用 3608 跟踪标志从命令行启动 SQL,以防止启动除 master 之外的任何其他数据库。我需要多次启动和停止 SQL,因此我保留了此 CMD 行。“NET START MSSQLSERVER /T3608”和“NET STOP MSSQLSERVER”
  3. 运行我的脚本以显示数据库上的命名(按 ID、3 和 4 列出),然后适当修改并运行名称更正脚本。见下文。

该脚本向我展示了我在转置过程中所造成的确切问题:

SELECT database_id, name,
physical_name AS CurrentLocation,
state_desc
FROM sys.master_files
WHERE database_id = 3 OR database_id = 4
go

database_id 3 是模型,4 是 MSDB

考虑到这一点,将更正后的信息替换到以下脚本中是有效的(尽管需要重新启动一些服务)

ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBLog, FILENAME = 'D:\MSSQL\DATA\MSDBLog.ldf');
GO
ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\MSSQL\DATA\MSDBData.mdf');
GO
ALTER DATABASE model
MODIFY FILE (NAME = modellog, FILENAME = 'D:\MSSQL\DATA\modellog.ldf');
GO
ALTER DATABASE model
MODIFY FILE (NAME = modeldev, FILENAME = 'D:\MSSQL\DATA\model.mdf');
GO

在某些情况下,如果名称错误,我需要使用(请注意下面的交换 - 除非您有这个确切的交换问题,否则请不要使用):

ALTER DATABASE model
MODIFY FILE (NAME = msdbdata, NEWNAME = modeldev );
GO

相关内容