附加数据库注意事项
必须首先分离数据库。 尝试附加未分离的数据库将返回错误。
附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用。 如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。
在附加数据库时,如果 MDF 和 LDF 文件位于不同目录并且其中一条路径包含 \\?\GlobalRoot,该操作将失败。
需要 CREATE DATABASE
、CREATE 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脚本附加数据库成功后需要刷新数据库文件夹才能查看结果。