zoukankan      html  css  js  c++  java
  • 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_dbsp_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
    
    

    四、参考

    东升哥

  • 相关阅读:
    ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
    reportlab设置字体
    Ansible 配置文件详解
    Ansible 配置文件详解
    如何在 FineUIMvc 中引用第三方 JavaScript 库
    如何在 FineUIMvc 中引用第三方 JavaScript 库
    如何在 FineUIMvc 中引用第三方 JavaScript 库
    如何在 FineUIMvc 中引用第三方 JavaScript 库
    div和span显示在同一行
    div和span显示在同一行
  • 原文地址:https://www.cnblogs.com/jianxuanbing/p/7825475.html
Copyright © 2011-2022 走看看