分类

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > SQL Server > 正文
共享办公室出租
SQL SERVER分离数据库
SQL Server 暂无评论 阅读(2,437)

1、点击“程序》Microsoft SQL Server》企业管理》”,打开企业管理器

2、展开服务器组,然后展开服务器,选中要分离的数据库

3、点击鼠标右键“所有任务》分离数据库”,出现如下窗口

4、点击确定,该选定的数据库就被分离。

应注意,只有“使用本数据库的连接”数为0时,该数据库才能分离。所以分离数据库时尽量断开所有对要分离数据库操作的连接,如果还有连接数据库的程序,会出现数据库的连接状态窗口,显示正在连接此数据库的机器以及名称,点击清除按钮将从服务器强制断开现有的连接。

二、附加数据库

1、复制移动数据库文件

在附加数据库之前,您必须将与数据库关联的 .MDF(主数据文件).LDF(事务日志文件) 这两个文件复制到目标服务器上,或是同一服务器的不同文件目录下。这两个文件一般位于C:\Program Files\Microsoft SQL Server\MSSQL\Data目录下。

2、点击“程序》Microsoft SQL Server》企业管理》”,打开企业管理器

3、展开服务器组,然后展开服务器

4、右击"数据库",然后选择“所有任务》附加数据库”,弹出窗口

 

5、输入要附加的数据库的MDF名称。如果不确定文件位于何处,单击浏览("...")搜索。若要确保指定的 MDF 文件正确,请单击"验证"。在"附加为"框内,输入数据库的名称。数据库名称不能与任何现有数据库名称相同。指定数据库的所有者

6、单击"确定"按钮。新附加的数据库的数据库节点即创建在"数据库"文件夹中。

实践中碰到 数据库日志 很大(10G)占用了硬盘空间的情况处理:

2、修改数据库日志的名字

3、附加数据库,成功后可以删除数据库日志

最近尝试了一下SubVersion,觉得还不错,于是将现有项目的所有文件都添加到了版本库中。不过在对SQL Server的数据库文件进行版本控制时出现了一点小麻烦,大家都知道当SQL Server的数据库文件附加到数据库引擎上时是不能复制的,在这个时候SubVersion的客户端工具甚至不能检测到这些文件!于是在每次签入、签出的时候都要打开SQL Server Management Studio进行数据库的分离与附加,非常麻烦。

 

恰好SQL Server提供了一个命令行工具SQLCMD,于是我想能不能借助这个工具编写批处理文件,将数据库的分离和附加自动化呢?经过尝试之后发现这是可行的,下面介绍一下如何将此自动化。

 

首先说明一下我的项目目录的树形结构:

 

 

 

ArticleCenter是项目名称,在该文件夹下有一个Database子文件夹,里面只有mdf和ldf两个数据库文件。Attach.bat和Detach.bat分别是附加和分离数据库的批处理文件,直接双击这两个文件就可以执行相应的操作。

 

接下来看看如何使用SQLCMD,这个工具拥有很多的命令参数,但这里只使用了其中的几个:

 

sqlcmd -i <文件名>

-i参数后面跟一个sql文件的文件名,表示执行这个sql文件里的SQL语句。

 

sqlcmd -Q <SQL语句>

-Q参数后面跟一条SQL语句,表示执行该SQL语句。注意SQL语句要用双引号括起来,而且Q不能是小写。

 

另外,一般执行SQL语句之前都要连接和登录数据库引擎,这是通过-E,-S等参数指定的,如果省略这些参数,就是使用Window身份验证连接本地数据库引擎。关于SQLCMD就介绍到这里,如果对这个工具有兴趣的话,可以执行sqlcmd -?命令获取更多的帮助。

 

附加数据库的SQL语句如下:

 

USE [master]

GO

CREATE DATABASE [ArticleCenter_Database] ON

( FILENAME = N'E:\Zplutor\Documents\Projects\ArticleCenter\Database\ArticleCenter_Database.mdf' ),

( FILENAME = N'E:\Zplutor\Documents\Projects\ArticleCenter\Database\ArticleCenter_Database_log.ldf' )

FOR ATTACH

GO

 

这里有两条语句,而且比较长,我们可以先动态构造出这些语句,存放在文件中,然后通过sqlcmd -i命令来执行。下面就是Attach.bat文件的完整内容:

 

@echo off

 

ECHO USE [master] >> Create.sql

ECHO GO >> Create.sql

 

FOR %%I IN (*.mdf) DO ECHO CREATE DATABASE [%%~nI] ON >> Create.sql

FOR %%I IN (*.mdf) DO ECHO (FILENAME = N'%%~dpnxI'), >> Create.sql

FOR %%I IN (*.ldf) DO ECHO (FILENAME = N'%%~dpnxI') >> Create.sql

 

ECHO FOR ATTACH >> Create.sql

ECHO GO >> Create.sql

 

sqlcmd -i Create.sql

 

del Create.sql

 

ECHO.

PAUSE

 

为了让这个批处理更通用,不能将数据库名称和数据库文件路径硬编码到代码中,而是通过在运行时动态获取这些信息。对于批处理来说,FOR语句是最佳的选择。

 

FOR语句会遍历满足括号中条件的所有文件,将每个文件的完整文件名(这里的完整文件名指文件名加上扩展名)保存到指定的变量中(在这里这个变量就是%%I),然后执行DO后面的批处理语句。在这个语句中可以使用%%I标记,它将会被替换成完整文件名。

 

除了可以通过%%I来引用完整文件名之外,还可以通过以下的扩展标记来引用有关文件的更多信息:

 

%%~nI

该标记将被替换成文件名,不包括扩展名。

%%~xI

该标记将被替换成文件的扩展名。

%%~pI

该标记将被替换成文件的路径,该路径不包括驱动器盘符以及文件名。

%%~dI

该标记将被替换成文件所在驱动器的盘符。

 

以上标记可以任何搭配使用,例如%%~dpnxI将被替换成文件的完整路径。

 

第一条FOR语句对当前文件夹中的所有mdf文件执行DO后面的批处理语句,也就是将ECHO后面的内容输出到文件中,%%~nI将会被替换成文件名,不包含扩展名。第二条和第三条语句也是一样,其中%%~dpnxI将会被替换成文件的完整路经。

 

Attach.bat文件的内容就是如此简单,而Detach.bat就更简单了。分离数据库的SQL语句是:

 

EXEC master.dbo.sp_detach_db @dbname = N'ArticleCenter_Database', @keepfulltextindexfile=N'true'

 

由于只有一条语句,就不需要输出到文件中了,使用sqlcmd -Q命令即可。以下是Detach.bat文件中的内容:

 

@echo off

 

FOR %%I IN (*.mdf) DO sqlcmd -Q "EXEC master.dbo.sp_detach_db @dbname = N'%%~nI', @keepfulltextindexfile=N'true'"

 

ECHO.

PAUSE

 

希望本文对大家有所帮助。

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:SQL SERVER分离数据库 | Bruce's Blog

发表评论

留言无头像?