一、前言

今天公司要切换数据库服务器,数据库文件大于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 数据库附加问题:不是主数据库文件的更多相关文章

  1. CDbConnectionExt.php 23.2实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置

      <?php   /** * 实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置. * 具体使用主数据库还是从数据库,使用如下规则: * 1.CDbComm ...

  2. SQLServer之附加数据库

    附加数据库注意事项 必须首先分离数据库. 尝试附加未分离的数据库将返回错误. 附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用. 如果任何数据文件的路径不同于首次创建数据库或上次附 ...

  3. MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏

    ************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...

  4. MS SQLServer 批量附加数据库

    /************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注 ...

  5. sqlserver数据库附加分离备份还原命令

    --获取所有数据库的名称 select [name] from master.dbo.sysdatabases where [name]='master' --判断数据库是否存在 if exists( ...

  6. 在SQLServer 2005附加SQLServer 2008数据库异常处理

    远程服务器软件系统不算新,数据库是SQL Server 2005.本地开发基本是用新的软件系统.数据库采用SQL Server 2008. 这样在用远程服务器SQL 2005选择附加SQL 2008的 ...

  7. sql2008r2数据库附加的问题

    sql2008r2数据库附加,一般都没有问题,但是偶尔也会出错,无法附加,一般的原因都是权限不够,主要是:Authenticated Users要开通完全控制功能,选中该用户(如果没有该用户,就添加) ...

  8. 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)

    解剖SQLSERVER 第八篇  OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...

  9. 把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry

    把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry ’3′ for key ‘PRIMARY’ 你的主键是不 ...

随机推荐

  1. Racing Car Computer dp

    Racing Car Computer Input: Standard Input Output: Standard Output   The racing cars of today are equ ...

  2. MySQL之增删改查

    前言:以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表上,未涉及多表操作. 前提:在进行" ...

  3. Java高新技术 JDK1.5之新特性

      Java高新技术  JDK1.5的新特性 知识概要:                 (1)静态导入 (2)可变参数 (3)增强for循环 (4)基本数据类型的自动拆箱和装箱 静态导入     ...

  4. UWP 唤起应用商城,邮件

    UWP做到收尾工作的时候,一般需要在应用内做一个关于页面,用于放你的邮箱链接,商店评论链接等.. 一:打开链接 打开链接有两种做法 1.用 HyperlinkButton  (超链接按钮)这个控件,给 ...

  5. JVM性能调优,GC

    刚刚做完了一个项目的性能测试,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下. 主要从以下几部分来说明,关于内存和内存泄露.溢出的概念,区分内存泄露和内存溢出:内存的区域划分,了解GC回收机制 ...

  6. ubuntu 下修改文件访问权限chmod 777 -R *血的教训!没事别乱开权限!用谁开谁的就行。。。最后不要用这个命令,文件操作全部改用终端

    本文转自: 个人建议 Ubuntu下修改目录权限命令如下:chmod 600 name (只有所有者有读和写的权限)chmod 644 name (所有者有读和写的权限,组用户只有读的权限)chmod ...

  7. 03Vue事件

    Vue提供了事件的绑定,方法写在methods对象中. 绑定dom中有两种方法: 方法一:v-on:click/dblclcick/mouseOver/mouseOut="方法名" ...

  8. 一段批处理脚本(for 嵌套)

    需求: 1.服务器上有一堆按日期生成的目录,已经有N个月了,需要只取当前月份的目录. 2.目录中有一系列文件,文件名字不一样,但存在一定的重复规律. 3.需要从服务器上拷贝文件到本地,自动去重,拷贝到 ...

  9. 从入门到放弃之IO

    浅说IO 学到现在利用过的特殊符号不少组合起来很多都有让人眼前一亮的用法,在这里先聊聊I/O的一些相关知识. 本文开始之前先介绍一下需要知道的一些小知识和需要注意的地方. 在linux中也是有优先级的 ...

  10. C++中的endl

    从开始接触C++到现在,一直以为语句 cout << "hello world!" << endl; 中的endl只是一个相当于C中的换行'\n':直到今天 ...