一、前言 【数据库|SqlServer 数据库附加问题:不是主数据库文件】今天公司要切换数据库服务器,数据库文件大于2G,结果再附加到另一服务器的数据库里面,就产生了一个问题。如下:
标题:Microsoft SQL Server Management Studio
------------------------------
无法为此请求检索数据。(Microsoft.SqlServer.SmoEnum)
------------------------------
其他信息:
执行 Transact-SQL 语句或批处理时发生了异常。(Microsoft.SqlServer.ConnectionInfo)
------------------------------
E:\DATA\数据库名.mdf 不是主数据库文件。(Microsoft SQL Server,错误:5171)
二、解决方案 在网上找了很多方法,最后在CSDN上找到了相关的解决方式,经测试可用。
use master
go
sp_detach_db '数据库名' -- 分离数据库
go
sp_attach_db '数据库名','E:\数据库名.mdf','E:\数据库名.ldf' -- 附加数据库文件
go
网上看到的整理了一下。
在SQL Server 7.0中,微软推出了
sp_attach_db
和sp_attach_single_file_db
系统存储过程。它对于SQL Server数据库管理员执行下面的任务是非常方便的:
sp_attach_db
:直接将.MDF和.LDF文件附加到服务器。sp_attach_single_file_db
:只附加.MDF文件。sp_detach_db
:将数据库从一个服务器分离。复制.MDF文件到另一个服务器上,然后使用sp_attach_db
系统存储过程重新附加这些文件到两个服务器上。
- 不能附加多个日志文件。
- 不能附加16个以上的文件。
SQL语句中添加了一个从句"For Attach"。
下面介绍使用"For Attach"从句的多种方法,以克服在使用sp_attach_db和sp_attach_single_file_db时要面临的限制。
三、案例
-- 创建测试数据库
use master
go
CREATE DATABASE TestDB
ON
(
NAME = TestDB,
FILENAME = 'D:\TestDB.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5,
)
LOG ON
(
NAME = TestDB_log,
FILENAME = 'D"\TestDB_log.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB
)
GO-- 现在,让我们分离该数据库,并尝试使用sp_detach_db和sp_attach_db将它重新附加。
-- 执行下面的事务SQL语句。use master
go
sp_detach_db 'TestDB'
go
sp_attach_db 'TestDB', 'D:\TestDB.mdf', 'D:\TestDB_log.ldf'
go-- 你也可以使用具有"For Attach"从句的"Create database"命令附加相同的数据库文件,如下所示。use master
go
sp_detach_db 'TestDB'
goCREATE DATABASE TestDB
ON
(FILENAME = 'D:\TestDB.mdf'),
(FILENAME = 'D:\TestDB_log.ldf')
For Attach
go-- 现在,让我们分离数据库TestDB,然后删除.ldf文件,再然后使用sp_attach_single_file_db
-- 系统存储过程通过,执行下面的T-SQL命令将它重新附加上。use master
go
sp_detach_db 'TestDB'
go
exec master..xp_cmdshell 'del "D:\TestDB_log.ldf"'
go-- 你可以使用下面的事务SQL语句来激活xp_cmdshelluse master
go
sp_configure 'show advanced options',1
go
reconfigure with override
go
sp_configure 'xp_cmdshell',1
go
reconfigure with override
go-- 或者,你可以在MS-DOS命令提示符中使用Windows资源管理器的"Del"命令来删除.ldf文件。
-- 现在,让我们只使用sp_attach_single_file_db来附加.MDF文件。执行下面所示的命令。use master
go
sp_attach_single_file_db 'TestDB','D:\TestDB.mdf'
go-- 你可以只通过使用带有"For ATTACH_REBUILD_LOG"从句的"Create database"命令来附加
-- 相同的数据库.MDF文件,如下所示。use master
go
sp_detach_db 'TestDB'
go
exec master..xp_cmdshell 'del "D:\TestDB_log.ldf"'
go-- 注意:当日志文件被重新创建时,SQL Server自动对日志文件名称添加后缀"_log"。CREATE DATABASE TestDB
ON
(
FILENAME = 'D:\TestDB.mdf'
)
For ATTACH_REBUILD_LOG
四、参考 东升哥
转载于:https://www.cnblogs.com/jianxuanbing/p/7825475.html
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验