只有mdf文件的数据库附加失败的修复方法分享(置疑、只读)

这里为大家详细介绍“只有mdf文件的数据库附加失败的修复方法分享(置疑、只读)”。

问题描述

当我们在 SQL Server 管理器中尝试附加一个数据库时,有时会出现以下错误:

Msg 5172, Level 16, State 15, Line 1
无法恢复附加数据库,因为该数据库副本与现有数据库冲突。选择的回滚操作无法执行。原因是,在包含初始快照的设备上找到了要附加到现有的数据库的同名文件。使用 RESTORE FILELISTONLY 来确定文件的逻辑名称。
Msg 1802, Level 16, State 4, Line 1
无法恢复附加数据库(名为 'mydatabase' 的数据库)。 

这通常是由于附加数据库的 MDF 数据文件存在冲突引起的,可能是数据库已经存在,或者附加的文件中与现有数据库有相同的文件名。

解决方法

方法一:使用 T-SQL 执行附加数据库

如果使用 SQL Server 管理器附加数据库存在问题,我们可以尝试使用 T-SQL 命令来附加数据库。

首先,在 SQL Server 管理器中打开一个新的查询窗口,在该窗口中输入以下命令:

CREATE DATABASE [mydatabase] ON 
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\mydatabase.mdf' )
FOR ATTACH_REBUILD_LOG;

请注意,[mydatabase] 是新数据库的名称,而 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\mydatabase.mdf 是 MDF 数据文件的路径和名称。这个命令会重新建立数据库的事务日志以解决附加失败的问题。

方法二:将 MDF 文件移动到新的位置

如果附加时出现问题,可能是由于数据库已经存在,或者附加的文件中与现有数据库有相同的文件名。在这种情况下,我们可以尝试将 MDF 数据文件移动到一个新的位置,然后再附加它。

如下示例,首先将现有的 MDF 文件移动到一个新的位置(例如,C:\Backup\mydatabase.mdf),然后执行以下命令:

CREATE DATABASE [mydatabase] ON 
( FILENAME = N'C:\Backup\mydatabase.mdf' )
FOR ATTACH_REBUILD_LOG;

方法三:将数据库设置为只读模式

如果我们无法移动 MDF 文件或从外部访问它,我们可以尝试将数据库设置为只读模式,这样我们就可以在不需要实际附加数据库的情况下访问其中的数据。在只读模式下运行附加操作可以避免修改数据库或冲突问题,因此,无需附加日志文件即可附加数据库。

如下示例,我们可以通过以下 T-SQL 命令将数据库设置为只读模式:

USE master;
GO
ALTER DATABASE [mydatabase] SET READ_ONLY WITH ROLLBACK IMMEDIATE;
GO

接下来,我们可以使用以下命令将 MDF 文件附加到只读数据库中:

CREATE DATABASE [mydatabase] ON 
( FILENAME = N'C:\Backup\mydatabase.mdf' )
FOR ATTACH;

请注意,我们在这里省略了 FOR ATTACH_REBUILD_LOG,这意味着我们只将 MDF 数据文件附加到只读数据库中。

以上是几种修复只有 MDF 文件的数据库附加失败的方法,我们可以根据实际情况选择合适的方法进行操作。

希望这能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:只有mdf文件的数据库附加失败的修复方法分享(置疑、只读) - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Python中Scrapy+adbapi提高数据库写入效率实现

    让我为您详细讲解“Python中Scrapy+adbapi提高数据库写入效率实现”的完整攻略。 1. Scrapy简介 Scrapy是一个开源的Python网络爬虫框架,它可以轻松地从网页中提取所需要的数据。Scrapy自带的Item Pipeline功能可以方便地将爬取到的数据存储到各种类型的数据库中。 2. adbapi介绍 adbapi是Twisted…

    database 2023年5月21日
    00
  • Docker容器使用宿主机上的mongod/redis等服务详解

    下面我将详细讲解“Docker容器使用宿主机上的mongod/redis等服务”的完整攻略。 1. 使用桥接网络和host网络 Docker容器可以使用宿主机上的服务,有两种方式可以实现:使用桥接网络和使用host网络。 1.1 使用桥接网络 Docker默认会为每一个容器创建一个自己的网络。如果在容器内需要访问宿主机上的服务,可以通过将容器加入到宿主机上的…

    database 2023年5月22日
    00
  • MySQL单表查询常见操作实例总结

    MySQL单表查询常见操作实例总结 MySQL的单表查询是数据库操作的基础,多数时候我们的操作都是围绕着单表查询来展开的。在这里,我将总结了几种常见的MySQL单表查询的操作,包括:SELECT、DISTINCT、WHERE、AND、OR、IN、BETWEEN、LIKE、ORDER BY、GROUP BY、HAVING、LIMIT等。 SELECT SELE…

    database 2023年5月22日
    00
  • php变量与字符串的增删改查操作示例

    针对“php变量与字符串的增删改查操作示例”的完整攻略,我为您提供如下内容。 1. 变量的定义、修改和获取 1.1 变量的定义 在php中,变量是通过$符号实现的,定义变量非常简单,直接声明即可,例如: $name = "张三"; $age = 20; $height = 170.5; 1.2 变量的修改 变量的修改也非常简单,直接对变量…

    database 2023年5月21日
    00
  • 详细深入聊一聊Mysql中的int(1)和int(11)

    当我们在设计MySQL表时,常常会使用int类型作为列的数据类型,但是int还可以指定长度,比如int(1)和int(11)两种类型。在这里,我们来深入聊一聊它们之间的不同。 int(1)与int(11)的区别 事实上,int(1)和int(11)在存储数据时并没有真正的差异,它们都占据四个字节的存储空间,存储的范围也一样。它们的唯一区别在于,int(1)在…

    database 2023年5月18日
    00
  • MySQL里的found_row()与row_count()的解释及用法

    下面是关于“MySQL里的found_row()与row_count()的解释及用法”的详细攻略。 什么是found_row()和row_count()? found_row() found_row()函数是MySQL特有的函数,可以用于获取查询到的实际行数。它只对当前查询有效,一旦执行下一条查询,则它的结果就变成了下一条查询的行数。在查询语句中,found…

    database 2023年5月19日
    00
  • 配置ogg异构oracle-mysql(1)基础环境配置

    一、环境描述: 192.168.0.164 ( Oracle ) —> 192.168.0.165 (Mysql ) 版本: 操作系统:redhat5.8 Oracle:  11.2.0.3 Mysql:     5.5.37 goldgate: 11.2.0.1.3 for oracle 11.2.0.1.1 for mysql 测试用户: 在ora…

    MySQL 2023年4月12日
    00
  • MYSQL如何查看操作日志详解

    MySQL是一种常用的数据库管理系统,而操作日志则是MySQL数据库中一个非常重要的部分,它可以记录MySQL数据库中的所有操作,包括增删改查等等。在MySQL数据库中,我们可以通过以下步骤来查看操作日志: 步骤一:配置MySQL操作日志 MySQL的操作日志有两种类型:二进制日志与慢查询日志。为了方便日后检索,我们通常会开启这两种日志。我们可以按照以下步骤…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部