问题:
由于硬盘分区空间不够,我想将一个数据库存放的位置从一个分区转移到另外的分区,请问我该如何操作?

问题分析:
在新建一个数据库的时候,我们可以分别指定其数据文件(.mdf)以及事务日志文件(.ldf)存放的位置。如果需要重新指定一个数据库存放的位置,对于一般用户数据库与系统数据库而言,要分别用不同的方法来实现。

问题解答:
在SQL Server中,要将一个数据库存放的位置转移到另外的位置,可以利用数据库分离(sp_detach_db)和数据库附加(sp_attach_db)操作命令来完成。
由于用户数据库和系统数据库的不同,分为以下几种情况来处理。
(1)转移用户数据库。
首先,使用下面语句分离数据库:
use master
go
exec sp_detach_db 'DBName'
go
接着,将该数据库的数据文件和日志文件从旧的位置(如:D:/MSSQL/Data)拷贝到新的位置(如:E:/SQLData)。
最后,使用下面语句来重新附加数据库,即可:
use master
go
exec sp_attach_db @dbname='DBName',
     @filename1='E:/Sqldata/dbnamedata.mdf',
     @filename2='E:/Sqldata/dbnamelog.ldf'
go
(2)转移master数据库
首先,由于SQL Server每次启动的时候都需要读取master数据库,因此我们必须在企业管理器中改变SQL Server启动参数中master数据文件和日志文件的路径。
在SQL Server属性的“常规”选项卡下面有一个叫做[启动参数]的按钮,其中,-d用来指定master数据库文件的完全合法路径,而-l用来指定master日志文件的完全合法路径。
将这些参数修改为新的master数据文件和日志文件所在的路径,如:
-dE:/SQLData/master.mdf
-lE:/SQLData/mastlog.ldf
接着,停止SQL Server服务,将master.mdf文件和mastlog.ldf文件拷贝到新的位置,如上例中的E:/SQLData。
最后,只要重新启动服务即可。
(3)转移msdb数据库和model数据库
我们同样可以使用sp_detach_db和sp_attach_db来分离和附加这两个数据库。但是,对于msdb数据库,首先应确保SQL Server代理当前没有运行,否则sp_detach_db存储过程将运行失败,并返回如下消息:
无法除去数据库'msdb',因为它当前正在使用。
接着,必须用跟踪标记3608作为启动SQL Server服务,这样它不会恢复除master之外的任何数据库。
要添加跟踪标记3608作为SQL Server服务的启动参数,首先调出如前所示的“启动参数”对话框,再添加新参数-T3608。
添加跟踪标记3608后,停止并重新启动SQL Server,再如下分离msdb或者model数据库:
exec sp_detach_db 'msdb'
go
接着,将数据文件和日志文件转移到新的位置,然后再如下重新附加msdb或者model数据库:
use master
go
exec sp_attach_db @dbname='model',
     @filename1='mdf 文件新的路径',
     @filename2='ldf 文件新的路径'
go
最后,在企业管理器中,从“启动参数”框中删除-T3608跟踪标记,再停止并重新启动SQL Server。
(4)转移tempdb数据库
对于tempdb数据库而言,可以直接使用alter database语句来为数据文件和日志文件指定新的存放位置,如下所示:
use master
go
alter database tempdb modify file
(name=tempdbdev,filename='E:/Sqldata/tempdb.mdf')
go
alter database tempdb modify file
(name=templog,filename='E:/Sqldata/templog.ldf')
go