附加数据库注意事项

必须首先分离数据库。 尝试附加未分离的数据库将返回错误。

附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用。 如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。

在附加数据库时,如果 MDF 和 LDF 文件位于不同目录并且其中一条路径包含 \\?\GlobalRoot,该操作将失败。

需要 CREATE DATABASECREATE ANY DATABASE 或 ALTER ANY DATABASE 权限。

分离再重新附加只读数据库后,会丢失有关当前差异基准的备份信息。 “差异基准” 是数据库或其文件或文件组子集中所有数据的最新完整备份。 如果没有基准备份信息,master 数据库会变得与只读数据库不同步,这样之后进行的差异备份可能会产生意外结果。 因此,如果对只读数据库使用差异备份,在重新附加数据库后,应通过进行完整备份来建立新的差异基准。

附加时,数据库会启动。 通常,附加数据库时会将数据库重置为它分离或复制时的状态。 但是,附加和分离操作都会禁用数据库的跨数据库所有权链接。

附加日志文件的要求在某些方面取决于数据库是读写的还是只读的,如下所示:

  • 对于读写数据库,通常可以附加新位置中的日志文件。 不过,在某些情况下,重新附加数据库需要使用其现有的日志文件。 因此,请务必保留所有分离的日志文件,直到在不需要这些日志文件的情况下成功附加了数据库。

    如果读写数据库具有单个日志文件,并且您没有为该日志文件指定新位置,附加操作将在旧位置中查找该文件。 如果找到了旧日志文件,则无论数据库上次是否完全关闭,都将使用该文件。 但是,如果未找到旧文件日志,数据库上次是完全关闭且现在没有活动日志链,则附加操作将尝试为数据库创建新的日志文件。

  • 如果附加的主数据文件是只读的,则 数据库引擎 假定数据库也是只读的。 对于只读数据库,日志文件在数据库主文件中指定的位置上必须可用。 因为 SQL Server 无法更新主文件中存储的日志位置,所以无法生成新的日志文件。

使用SSMS数据库管理工具附加数据库

1、连接服务器-》在对象资源管理器窗口展开数据库文件夹-》右键点击数据库文件夹-》选择附加。

2、在附加数据库弹出框-》点击添加(查找必需的主数据库文件。 当用户选择 .mdf 文件时,就会在 “要附加的数据库” 网格的相应字段中自动填充合适的信息。)。

3、在定位数据库文件弹出框中-》选择指定路径下分离的数据库文件-》点击确定。

4、在附加数据库弹出框-》要附加的数据库窗格(显示所选数据库的有关信息。):MDF 文件位置(显示选定 MDF 文件的路径和文件名。);数据库名称(显示数据库的名称。);附加为(根据需要,可以指定要附加数据库的其他名称。);“所有者”(提供数据库可能所有者的下拉列表,您可以根据需要从其中选择其他所有者。);“状态”(显示下表中相应的数据库状态。),状态一图标为无图标,状态文本为无文本,描述为此对象的附加操作尚未启动或者可能挂起。 这是打开该对话框时的默认值;状态二图标为绿色的右向三角形,状态文本为正在进行,描述为已启动附加操作,但是该操作未完成;状态三图标为绿色的选中标记,状态文本为成功,描述为已成功附加该对象;状态四图标为包含白色十字形的红色圆圈,状态文本为错误,描述为附加操作遇到错误,未成功完成;状态五图标为包含左、右两个黑色象限和上、下两个白色象限的圆圈,状态文本为已停止,描述为由于用户停止了附加操作,该操作未成功完成;状态六图标为包含一个指向逆时针方向的曲线箭头的圆圈,状态文本为已回滚,状态描述为附加操作已成功,但已对其进行回滚,因为在附加其他对象的过程中出现了错误。-》删除(从 “要附加的数据库” 网格中删除选定文件。)-》数据库详细信息窗格:原始文件名(显示属于数据库的已附加文件的名称。);文件类型(指示文件类型,即 “数据” 或 “日志”。);当前文件路径(显示所选数据库文件的路径。 可以手动编辑该路径。);消息(显示空消息或 “找不到文件” 超链接。)-》点击确定。

5、查看附加结果(不需要刷新即可在对象资源管理器窗口查看)。

使用T-SQL脚本附加数据库

语法

--语法一
--声明数据库引用
use other_database_name;
go --附加数据库
create database database_name
on (filename='mdf_path'),
(filename='ldf_path')
for attach
go --语法二
--声明数据库引用
use other_database_name;
go --附加数据库
create database database_name
on (
name='logical_file_name'
,filename='filestream_path'
,size= size_number [ KB | MB | GB | TB ]
,maxsize= { max_size_number [ KB | MB | GB | TB ] | unlimited }
,filegrowth= growth_increment [ KB | MB | GB | TB | % ]
),
(
name='logical_log_file_name'
filename='log_filestream_path'
,size= size_number [ KB | MB | GB | TB ]
,maxsize= { max_size_number [ KB | MB | GB | TB ] | unlimited }
,filegrowth= growth_increment [ KB | MB | GB | TB | % ]
)
for { attach with
[ enable_broker | new_broker | error_broker_conversations ]
[,restricted_user]
[,filestream ( directory_name={ 'directory_name' | NULL })]
| attach_rebuild_log }
go

语法解析

--语法解析
--other_database_name
--其它数据库,不能使用要附加的数据库进行附加。

--database_name
--新数据库的名称。数据库名称在SQL Server的实例中必须唯一,并且必须符合标识符规则。

--mdf_path
--数据库分离的数据文件完整路径。

--ldf_path
--数据库分离的日志文件完整路径。

--name
--指定文件的逻辑名称。 指定filename时,
--需要使用name,除非指定for attach子句之一。 无法将filestream文件组命名为primary。

--logical_file_name
--在SQL Server中引用文件时所用的逻辑名称。 Logical_file_name在数据库中必须唯一,并且必须符合标识符规则。
--名称可以是字符或Unicode常量,也可以是常规标识符或分隔标识符。

--filename
--指定操作系统(物理)文件名称。

--filestream_path
--数据库数据文件完整路径

--logical_log_file_name
--数据库日志名称。

--log_filestream_path
--数据库日志文件完整路径

--size
--指定文件的大小。
--将 os_file_name 指定为UNC路径时,不能指定SIZE。 SIZE不适用于FILESTREAM文件组。

--size_number
--文件的初始大小。

--maxsize
--指定文件可增大到的最大大小。将os_file_name指定为UNC路径时,不能指定maxsize。

--max_size_number
--最大的文件大小。可以使用 KB、MB、GB 和 TB 后缀。默认值为 MB。指定一个整数,不包含小数位。
--如果未指定 max_size,文件将一直增长到磁盘变满为止。Max_size 是一个整数值。对于大于2147483647的值,使用更大的单位。

--unlimited
--指定文件将增长到磁盘充满。在SQL Server中,指定为不限制增长的日志文件的最大大小为2TB,而数据文件的最大大小为16TB。

--filegrowth
--指定文件的自动增量。文件的filegrowth设置不能超过max_size_number设置。将os_file_name指定为UNC路径时,不能指定filegrowth。
--filegrowth不适用于filestream文件组。

--growth_increment
--每次需要新空间时为文件添加的空间量。
--该值可以MB、KB、GB、TB 或百分比 (%)为单位指定。
--如果未在数量后面指定MB、KB 或%,则默认值为MB。
--如果指定%,则增量大小为发生增长时文件大小的指定百分比。 定的大小舍入为最接近的64KB的倍数,最小值为64KB。
--值为0时表明自动增长被设置为关闭,不允许增加空间。

--enable_broker
--指定对指定的数据库启用Service Broker。 也就是说,启动了消息传递,
--并且在sys.databases 目录视图中将is_broker_enabled设置为true。数据库保留现有的Service Broker标识符。

--new_broker
--在sys.databases和还原数据库中都创建一个新的service_broker_guid值,并通过清除结束所有会话端点。
--Broker已启用,但未向远程会话端点发送消息。必须使用新标识符重新创建任何引用旧Service Broker标识符的路由。

--error_broker_conversations
--结束所有会话,并产生一个错误指出数据库已附加或还原。
--Broker一直处于禁用状态直到此操作完成,然后再将其启用。数据库保留现有的Service Broker标识符。

--restricted_user
--对于attach,可以指定restricted_user选项。
--restricted_user只允许db_owner固定数据库角色成员以及dbcreator和sysadmin固定服务器角色成员连接到数据库,
--不过对连接数没有限制。无资格用户的尝试将被拒绝。

--filestream
--将包含filestream选项“目录名称”的数据库附加到SQL Server实例中将提示SQL Server验证Database_Directory名称是否唯一。

--directory_name={ 'directory_name' | NULL }
--适用于: SQL Server 2012 (11.x) 到 SQL Server 2017
--与Windows兼容的目录名称。此名称应在SQL Server实例的所有Database_Directory名称中唯一。
--无论SQL Server排序规则设置如何,唯一性比较都不区分大小写。在此数据库中创建FileTable之前,应设置此选项。
--仅在将containment设置为partial之后,才允许使用以下选项。如果将containment设置为none,将发生错误。

--for attach_rebuild_log
--指定通过附加一组现有的操作系统文件来创建数据库。该选项只限于读/写数据库。
--必须有一个指定主文件的 <filespec> 项。如果缺少一个或多个事务日志文件,将重新生成日志文件。
--attach_rebuild_log自动创建一个新的1MB的日志文件。此文件放置于默认的日志文件位置。
--for attach_rebuild_log具有以下要求:完全关闭数据库。所有数据文件(MDF 和 NDF)都必须可用。
--通常,FOR ATTACH_REBUILD_LOG 用于将具有大型日志的可读/写数据库复制到另一台服务器,
--在这台服务器上,数据库副本频繁使用,或仅用于读操作,因而所需的日志空间少于原始数据库。
--不能对数据库快照指定for attach_rebuild_log。

示例

--示例一
--声明数据库引用
use master;
go --附加数据库
create database testss
on (filename='D:\SQLServer\tests.mdf'),
(filename='D:\SQLServer\testslog.ldf')
for attach
go --示例二
--声明数据库引用
use master;
go --附加数据库
create database testss
on (
name='testss'
,filename='D:\SQLServer\tests.mdf'
,size=1021KB
,maxsize=1024MB
,filegrowth=1024MB
),
(
name='testsslog'
,filename='D:\SQLServer\testslog.ldf'
,size=1021KB
,maxsize=1024MB
,filegrowth=1024MB
)
for attach
with
enable_broker
,restricted_user
--,filestream ( directory_name='D:\SQLServer\')
go

示例结果:使用T-SQL脚本附加数据库成功后需要刷新数据库文件夹才能查看结果。

SQLServer之附加数据库的更多相关文章

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

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

  2. MS SQLServer 批量附加数据库

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

  3. Sqlserver 2012附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    环境: Win10系统 SQLSERver 2012 情况: 使用混合登陆方式,sa账户密码正确登陆后,附加.mdf文件出现此错误. 尝试解决方法一:使用管理员运行SQLSERver2012,sa账户 ...

  4. 【SQLServer】附加数据库失败

    一个参考:https://blog.csdn.net/zjx86320/article/details/25562361 如果类似Administrator.Everyone等都依照网上的权限改过之后 ...

  5. Sqlserver直接附加数据库和设置sa密码

    1.exec sp_attach_db 'test','E:\db\test.mdf','E:\db\test_log.ldf' 2.sp_password Null,'123','sa' 推荐一个微 ...

  6. ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库

    在开发机器上经常会遇到重装系统的问题,重装之前如果ORACLE没有及时备份的话重装之后就纠结了,数据还原很头疼. 各种娘中只能找到一些ORACLE安装与重装系统前目录相同的解决办法,目录不同就没招了. ...

  7. sqlserver附加数据库时,无法打开物理文件 "xx.mdf"。操作系统错误 5:"5

    sqlserver在附加数据库时,提示无法打开物理文件 "xx.mdf".操作系统错误 5:"5 此时可能你是用window验证方式登陆数据库的? 如果是这样,断开连接, ...

  8. sqlserver附加数据库时出错。有关详细信息,请单击“消息”列中的超链接

    在SqlServer中附加数据库时,有时会发生下面的错误. 解决 :可能的问题是放置附加数据库的文件夹的权限问题.如下解决.点击放置附加数据库的文件夹-->右键-->属性 权限要设置为完全 ...

  9. sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法

    sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法 金刚 sqlserver 附加数据库 拒绝访问 今天把项目拷贝到新硬盘里,发现在附加数据库中提示:操作系统错误5:"5拒绝 ...

随机推荐

  1. java并发之非阻塞算法介绍

    在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的. 为了更好的理解阻塞算 ...

  2. @component @bean区别

    from: http://stackoverflow.com/questions/10604298/spring-component-versus-bean http://stackoverflow. ...

  3. JDK源码分析-String、StringBuilder、StringBuffer

    String类的申明 public final class String implements java.io.Serializable, Comparable<String>, Char ...

  4. Undoing Merges

    I would like to start writing more here about general Git tips, tricks and upcoming features. There ...

  5. ajax技术基础详解

    一.概述 1.什么是ajax 可以与服务器进行[异步]交互的技术,浏览器无需刷新 2.什么时候出现ajax? -- XMLHttp 微软 1999年微软公司发布IE5版本,内嵌了ajax技术 什么时候 ...

  6. Python 字典(Dictionary) has_key()方法

    描述 Python 字典(Dictionary) has_key() 函数用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false. 语法 has_key()方法语法:dic ...

  7. (二)Maven的安装与环境配置

    主要内容 在Windows上安装Maven 安装目录分析 在Windows上安装Maven 本机环境:Windows10,JDK9.0.4. 想要安装Maven,需要下载Maven的zip文件,并将其 ...

  8. [Poi2014]FarmCraft 树状dp

    对于每个点,处理出走完其子树所需要的时间和其子树完全下载完软件的时间 易证,对于每个点的所有子节点,一定优先选择差值大的来给后面的时间 树规+贪心. #include<cstdio> #i ...

  9. 【英国毕业原版】-《伯明翰城市大学毕业证书》BCU一模一样原件

    ☞伯明翰城市大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...

  10. Java基础-方法重载和方法重写的区别

    什么是java方法重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)  ...