我在 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
我很高兴地说,我找到了解决问题的方法。我遇到的一个根本问题是,我误将错误消息“文件不存在”误认为是数据库文件本身,而不是数据库中的逻辑文件名。我将在下面提供我起草的检查脚本,它帮助我克服了困难。
我最终解决这个问题所采取的步骤:
- 关闭 TCP/IP 连接并打开命名管道,以确保仅有本地访问数据库。
- 使用 3608 跟踪标志从命令行启动 SQL,以防止启动除 master 之外的任何其他数据库。我需要多次启动和停止 SQL,因此我保留了此 CMD 行。“NET START MSSQLSERVER /T3608”和“NET STOP MSSQLSERVER”
- 运行我的脚本以显示数据库上的命名(按 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