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
希望本文对大家有所帮助。