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
系统存储过程重新附加这些文件到两个服务器上。
尽管它对于SQL Server数据库管理员是很有用的,但是在使用这两个存储过程时是有一些限制的。限制如下:
- 不能附加多个日志文件。
- 不能附加16个以上的文件。
在SQL Server 2008中,微软宣布上面的系统存储过程将在未来的版本中被废弃。而他们在"Create Database"
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'
go
CREATE 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_cmdshell
use 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
四、参考
SqlServer 数据库附加问题:不是主数据库文件的更多相关文章
- CDbConnectionExt.php 23.2实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置
<?php /** * 实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置. * 具体使用主数据库还是从数据库,使用如下规则: * 1.CDbComm ...
- SQLServer之附加数据库
附加数据库注意事项 必须首先分离数据库. 尝试附加未分离的数据库将返回错误. 附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用. 如果任何数据文件的路径不同于首次创建数据库或上次附 ...
- MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏
************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...
- MS SQLServer 批量附加数据库
/************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注 ...
- sqlserver数据库附加分离备份还原命令
--获取所有数据库的名称 select [name] from master.dbo.sysdatabases where [name]='master' --判断数据库是否存在 if exists( ...
- 在SQLServer 2005附加SQLServer 2008数据库异常处理
远程服务器软件系统不算新,数据库是SQL Server 2005.本地开发基本是用新的软件系统.数据库采用SQL Server 2008. 这样在用远程服务器SQL 2005选择附加SQL 2008的 ...
- sql2008r2数据库附加的问题
sql2008r2数据库附加,一般都没有问题,但是偶尔也会出错,无法附加,一般的原因都是权限不够,主要是:Authenticated Users要开通完全控制功能,选中该用户(如果没有该用户,就添加) ...
- 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...
- 把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry
把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry ’3′ for key ‘PRIMARY’ 你的主键是不 ...
随机推荐
- POJ1032 Parliament(数论)
New convocation of The Fool Land's Parliament consists of N delegates. According to the present regu ...
- 经典算法研究系列:二、Dijkstra 算法初探
July 二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...
- 如何用java语言获取某个网页的源代码
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; public class W ...
- Django进阶篇【1】
注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...
- 我的第一个python web开发框架(6)——第一个Hello World
小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. ...
- XML编程
XML编程 XML及其语法 XML约束之DTD XML编程(CRUD---Create Read Update Delete) XML约束之Schema XML语法: XML文档的组成: 一个X ...
- WPF 验证没有通过无法保存数据(非常好)+ 虚似数据库
Validation control with a single validation rule is easy, but what if we need to validate a control ...
- Hadoop(五)搭建Hadoop与Java访问HDFS集群
前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...
- linux_base_commond_one
1.cd commond a. cd usr 切换到该目录下usr目录 b. cd ../ 切换到上一层目录 c.cd / 切换到系统根目录 d. cd ~ 切换到用户主目录 e. cd - 切 ...
- JavaScript设计模式--桥梁模式--XHR连接队列
针对该模式的例子现在不是很理解,写下来慢慢熟悉. 们要构建一个队列,队列里存放了很多ajax请求,使用队列(queue)主要是因为要确保先加入的请求先被处理.任何时候,我们可以暂停请求.删除请求.重试 ...