英文地址:
 
SQL Server 文档中为移动数据库文件描述了两种方法。第一种:分离数据库,然后移动数据库文件,最后再附加数据库。第二种:设置数据库为脱机状态,运行ALTER DATABASE 语句改变数据库文件的位置, 然后将数据库置为联机状态。
这2中方法都有一个很大的问题,就是数据库必须要在脱机状态下才能操作。另外一个问题是DBA必须拥有访问数据库文件所在文件夹的权限。在一个大的组织环境下,DBA通常不具有移动文件的充分权限。再者,分离和附加数据库的方法还需要更改数据库拥有者,然后重置数据库为他们的默认的设置(e.g., ENABLE_BROKER)。
另一个方法:
为了避免上述问题,我有一个不同的方法来移动数据库文件。首先使用ALTER DATABASE 语句新建一个文件,然后使用带有EMPTYFILE 选项的DBCC SHRINKFILE语句移动数据。最后,使用另外一个ALTER DATABASE语句删除空文件。这样的数据库文件迁移操作可以在数据库联机状态下实现。
为了举例说明这个方法,我创建了2个脚本,你可以在自己的环境中运行它们。
SQL Server 2008 和SQL Server 2005版本中都可以使用。
下面是脚本的运行过程: 图1所示是第一个脚本, 创建了具有2个文件组的数据库文件: PRIMARY (包含一个数据文件test_primary_dat) 和SECONDARY(包含一个数据文件test_secondary_dat). 在SECONDARY 文件组中, 建立了一张表,填写了部分示例数据。
Listing 1: Script That Creates a Database with a Table on a Secondary File Group
Nakarada-Kordic%20103412%20Listing%201.jpg


下图是第2个脚本, 在SECONDARY 文件组增加了数据库文件test_secondary_dat_NEW. 注意,为了示例的简单性,test_secondary_dat_NEW和 test_secondary_dat 建立在相同的文件夹下. 在实际场景中, 你应该在拥有更多空间的磁盘上建立新增的数据库文件。
Listing 2: Script That Moves the Data and Removes the Old File
Nakarada-Kordic%20103412%20Listing%202.jpg


第二个脚本使用了带有EMPTYFILE 选项的DBCC SHRINKFILE 语句把数据在数据库联机状态下从
 (test_secondary_dat) 移动到了(test_secondary_dat_NEW) ,然后删除了旧的空数据库文件。第二个图片中标注 A的部分,DBCC SHOWFILESTATS 语句用来捕获数据库文件的大小 和查看是否转移数据成功。这条语句的输出包括每一个物理文件的记录. 每一个记录包括一些列,其中一个是UsedExtents说明了数据所使用的文件的空间. 注意 UsedExtents的值 包括系统元数据,所以即使数据库文件中无数据也不会显示为0。
这种转移数据库文件的方法有一些小限制. 首先,这种方法比文档中提供的两种方法慢. 但是, 从数据库可用的角度出发,实际上这种方法要更快一些,因为中途不会出现数据库不可用的时候。.其次,这个方法不能用来移动系统对象。然后, DBCC SHRINKFILE 语句会导致索引碎片, 所以你应该在数据文件转移后进行索引的维护。