开发者社区> 华章计算机> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《数据库基础及实践技术——SQL Server 2008》一3.6 分离和附加数据库

简介: 本节书摘来自华章出版社《 数据库基础及实践技术——SQL Server 2008》一 书中的第3章,第3.6节,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

3.6 分离和附加数据库

利用分离和附加数据库的操作可以实现将数据库从一台计算机移动到另一台计算机,或者从一个实例移动到另一个实例的目的。
数据库被分离后,其所包含的数据文件和日志文件不再受数据库管理系统的管理,因此,用户可以复制或剪切该数据库的全部文件,然后将它们放置到另一台计算机上,或者本计算机的其他位置上。然后,通过附加的方法可以将数据库恢复到同一台数据库服务器上,或者附加到其他数据库服务器上。
如果要将数据库移动或复制到同一台服务器的不同SQL Server实例中,或者要移动数据库的数据文件或日志文件的位置,分离和附加数据库是一种有用的方法。

3.6.1 分离数据库

分离数据库是指将数据库从SQL Server实例中删除,但不实际删除数据库的数据文件和日志文件。这与删除数据库不同,删除数据库会将数据库的所有数据文件和日志文件删除,而分离数据库会保持数据库的数据文件和日志文件的完整和一致。
数据库被分离后用户就不能再使用该数据库了,分离数据库实际就是让数据库的数据文件和日志文件不受数据库管理系统的管理,使用户可以将数据库的数据文件和日志文件复制到另一台计算机上或者同一台计算机的其他地方。
分离数据库可以用图形化的方法实现,也可以通过Transact-SQL语句实现。

  1. 用图形化方法实现
    在SQL Server Management Studio中分离数据库的步骤如下:

1)在SQL Server Management Studio的对象资源管理器中,展开“数据库”节点,在要分离的数据库上单击鼠标右键,在弹出的快捷菜单中选择“任务”→“分离”命令(如图3-21所示,假设这里分离的是Students数据库),弹出如图3-22所示的窗口。
2)“要分离的数据库”列表框中列出了要分离的数据库名,用户可在此验证这是否为要分离的数据库。

screenshot

screenshot

3)若当前有用户连接到了被分离的数据库,则默认情况下是不能执行分离操作的。例如,图3-23中就有一个活动连接,此时如果单击“确定”按钮,则弹出如图3-24所示的错误提示对话框。为避免出现这样的分离失败情况,可选中“删除连接”复选框,这时再进行分离就不会出错了。
4)默认情况下,分离操作将在分离数据库时保留过期的优化统计信息。若要更新现有的优化统计信息,可选中“更新统计信息”复选框。
5)“状态”列显示了当前数据库的状态(“就绪”表示可以被分离;“未就绪”表示不可以被分离)。
6)如果状态是“未就绪”,则“消息”列将显示未就绪原因的超链接信息,如图3-23所示。当被分离的数据库有一个或多个“活动连接”时,“消息”列将显示有多少个“活动连接”(如图3-23中的“1活动连接”)。因此,在分离数据库之前,必须选中“删除连接”复选框来断开所有与数据库的活动连接。
7)分离数据库准备就绪后,单击“确定”按钮开始分离数据库。

screenshot

  1. 用T-SQL语句实现
    分离数据库使用的是sp_detach_db系统存储过程,其语法格式为:
sp_detach_db [ @dbname= ] 'dbname' 
    [ , [ @skipchecks= ] 'skipchecks' ] 

各参数说明如下。
[ @dbname = ] 'dbname':要分离的数据库的名称。
[ @skipchecks = ] 'skipchecks':指定跳过还是运行“更新统计信息”。skipchecks的数据类型为nvarchar(10),默认值为NULL。如果要跳过“更新统计信息”,则指定true;如果要显式运行“更新统计信息”,则指定false。
【例3-16】分离Students数据库,并跳过“更新统计信息”。

EXEC sp_detach_db 'Students', 'true'

3.6.2 附加数据库

与分离数据库对应的操作是附加数据库。附加数据库就是将分离的数据库重新附加到数据库管理系统中,可以附加到本机的另一个SQL Server实例上,也可以附加到另一台数据库服务器上。在附加数据库之前,应先将要附加的数据库所包含的全部数据文件和日志文件放置到合适的位置。
在附加数据库时,必须指定主要数据文件的物理存储位置和文件名,因为主要数据文件中包含查找组成该数据库的其他文件所需的信息。如果在复制数据库文件时更改了其他文件(包括辅助数据文件和日志文件)的存储位置,则还应该明确指出所有已改变了存储位置的文件的实际存储位置信息。否则,SQL Server 将试图基于存储在主要数据文件中的文件位置信息附加其他文件,而这将导致附加数据库失败。
附加数据库可以用图形化的方法实现,也可以通过Transact-SQL语句实现。下面以附加之前分离的Students数据库为例,说明附加数据库的实现过程。

  1. 用图形化方法实现
    在SQL Server Management Studio中附加数据库的步骤如下:

1)在SSMS的对象资源管理器中,连接到要附加数据库的SQL Server实例上,展开该实例。
2)在“数据库”节点上单击鼠标右键,在弹出的快捷菜单中选择“附加”命令,弹出如图3-25所示的窗口。

screenshot

3)单击“添加”按钮,然后在弹出的“定位数据库文件”窗口中指定Students数据库的主要数据文件所在的磁盘位置,并选中主要数据文件(这里为F:Data文件夹中的Students.mdf),单击“确定”按钮,回到“附加数据库”窗口,此时该窗口形式如图3-26所示。
4)单击“确定”按钮完成附加数据库操作。

  1. 用T-SQL语句实现
    附加数据库的T-SQL语句是CREATE DATABASE,语法格式如下:
CREATE DATABASE database_name 
    ON <filespec> [ ,...n ] 
    FOR { ATTACH | ATTACH_REBUILD_LOG }

screenshot

各参数说明如下。
database_name:要附加的数据库的名称。
:同创建数据库语句的,用于指定要附加的数据库的主要数据文件。
FOR ATTACH:指定通过附加一组现有的操作系统文件来创建数据库。必须有一个指定主要数据文件的 项。至于其他文件的项,只需要指定与第一次创建数据库或上一次附加数据库时路径不同的文件即可。FOR ATTACH 对数据库文件具有如下两个要求:所有数据文件(MDF和NDF)都必须可用;如果存在多个日志文件,这些文件也都必须可用。
FOR ATTACH_REBUILD_LOG:指定通过附加一组现有的操作系统文件来创建数据库。该选项只限于可读/写的数据库。如果缺少一个或多个事务日志文件,将重新生成日志文件。必须有一个指定主要数据文件的项。FOR ATTACH_REBUILD_LOG有如下两个要求:通过附加来创建的数据库是关闭的;所有数据文件(MDF 和NDF)都必须可用。
FOR ATTACH_REBUILD_LOG选项通常用于将有大型日志的可读/写数据库复制到另一台服务器上,在这台服务器上,将频繁使用数据库副本或仅用于读操作,因而所需的日志空间少于原始数据库的日志空间。
【例3-17】附加之前分离的Students数据库。

CREATE DATABASE Students
  ON (FILENAME = 'F:\Data\Students.mdf')
  FOR ATTACH

【例3-18】假设已对Students数据库进行了分离操作,并将其中的“students_data1.ndf”和“students_log1.ldf”文件移动到了“F:Data”文件夹中(分离前这两个文件均在“D:Data”文件夹中)。移动数据库文件后,附加该数据库。

CREATE DATABASE Students
  ON ( FILENAME = 'F:\Data\students.mdf'),
     ( FILENAME = 'F:\Data\students_data1.ndf'),
     ( FILENAME = 'F:\Data\students_log1.ldf')
  FOR ATTACH

可以通过分离和附加数据库的操作,将用户数据库从低版本的SQL Server升级到高版本的SQL Server中。例如,将SQL Server 2000环境中的数据库升级到SQL Server 2008环境中。
实现迁移的过程为:
1)用sp_detach_db存储过程将数据库从低版本的SQL Server中分离出来。
2)将分离后的数据库的全部数据文件和日志文件复制到合适的位置,此步骤是可选的,如果不需要移动数据库文件的位置,则可略去此步骤。
3)使用带有FOR ATTACH或FOR ATTACH_REBUILD_LOG选项的CREATE DATABASE语句,将复制的文件附加到高版本的SQL Server实例上。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL Server日志文件过大 大日志文件清理方法 不分离数据库
原文:SQL Server日志文件过大 大日志文件清理方法 不分离数据库 SQL Server日志文件过大    大日志文件清理方法 ,网上提供了很多分离数据库——〉删除日志文件-〉附加数据库 的方法,此方法风险太大,过程也比较久,有时候也会出现分离不成功的现象。
1380 0
sql 2012先分离迁移mdf mlf 文件到别的机器后附加 数据库成只读的修复方法
SQL Server2008附加数据库之后显示为只读时解决方法   从本地分离的数据库文件放到远程服务器上,附加数据库出现数据库为(只读情况) 阅读了以下两篇文章: 第一篇:http://blog.csdn.net/love_zt_love/article/details/7861334 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定。
807 0
SQL拆分多规则的字符串分离数字。
--拆分多规则字符串 DECLARE @Codes NVARCHAR(MAX) SET @Codes = '6*BC-007,*BC-016,9*BC-015' --对于*BC-015这种情况,则Qty设置为1 SELECT * FROM dbo.
539 0
如何分离数据库 (SQL Server Management Studio)
在 SQL Server Management Studio 对象资源管理器中,连接到 SQL Server 数据库引擎的实例上,再展开该实例。 展开“数据库”,并选择要分离的用户数据库的名称。
482 0
函数计算 Python 连接 SQL Server
函数计算 Python 连接 SQL Server 自制脑图
0 0
SQL Server 2000 函数使用---CAST 和 CONVERT
日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。
0 0
【Sql Server】进阶之行数据转为列显示
在开发系统维护阶段,经常需要进行各种数据统计,各种报表之类的。 这个时候,行数据转数据显示就发挥作用了。 场景:行数据的某列值想作为字段列显示
0 0
【Sql Server】时间转换和查询时间范围查询不正确的原因
最近在做时间方法封装的时候发现了一个问题! 如果sql语句输出的时间字段转为了字符串输出,那么在使用此字段作为时间范围筛选时发现无效了,没法过滤对应的时间范围内记录
0 0
【Sql Server】基础之统计库龄语句,仅作为语句使用
知识点的综合使用 分组、数据转换、Case when then、max、min、count、sum、left join多表关联等知识点
0 0
【Sql Server】sql语句文件组分区函数分组方案对应分区表的简单步骤
本篇文章中,主要讲讲sql server数据库中通过sql语句方式对组分区函数的使用 在实际项目中,sql server数据库中有分区的概念,因为在一个表存在大量数据的情况下,需要通过分区方式保存数据来提供查询性能
0 0
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
用SQL做数据分析
立即下载
阿里云流计算 Flink SQL 核心功能解密
立即下载
Comparison of Spark SQL with Hive
立即下载