51CTO向您推荐《SQL Server 2008深度应用》,相信通过本专题,能让您更深刻的了解SQL Server 2008。
在SQL Server 7.0中,微软推出了sp_attach_db和sp_attach_single_file_db系统存储过程。它对于SQL Server数据库管理员执行下面的任务是非常方便的:
使用sp_attach_db系统存储过程直接将.MDF和.LDF文件附加到服务器。
使用sp_attach_single_file_db系统存储过程只附加.MDF文件。
使用sp_detach_db将数据库从一个服务器分离,复制.MDF文件到另一个服务器上,然后使用sp_attach_db系统存储过程重新附加这些文件到两个服务器上。
尽管它对于SQL Server数据库管理员是很有用的,但是在使用这两个存储过程时是有一些限制的。限制如下:
你不能附加多个日志文件
你不能附加16个以上的文件
在SQL Server 2008中,微软宣布上面的系统存储过程将在未来的版本中被废弃。而他们在“Create Database”SQL语句中添加了一个从句“For Attach”。
这篇文章将介绍使用“For Attach”从句的多种方法,以克服在使用sp_attach_db和sp_attach_single_file_db时要面临的限制。
假设我们有一个数据库叫“MyDB1”,它有一个.MDF文件和一个.LDF文件。使用下面的事务SQL语句创建这个数据库。再假设.MDF文件和.LDF文件的位置是“C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database DataData File for Monthly ArchiveMicrosoft SQL Server 2008 Data File”。
- Use Master
- go
- CREATE DATABASE MyDB1
- ON
- ( NAME = MyDB1_dat,
- FILENAME = 'C:Program Files
- Microsoft SQL ServerMSSQL10.SQL2008MSSQLDATA
- Summary Database DataData File for Monthly Archive
- Microsoft SQL Server 2008 Data FileMyDB1.mdf',
- SIZE = 10,
- MAXSIZE = 50,
- FILEGROWTH = 5 )
- LOG ON
- ( NAME = MyDB1_log,
- FILENAME = 'C:Program Files
- Microsoft SQL ServerMSSQL10.SQL2008MSSQLDATA
- Summary Database DataData File for Monthly Archive
- Microsoft SQL Server 2008 Data FileMyDB1.ldf',
- SIZE = 5MB,
- MAXSIZE = 25MB,
- FILEGROWTH = 5MB )
- GO
现在,让我们分离该数据库,并尝试使用sp_detach_db和 sp_attach_db将它重新附加。执行下面的事务SQL语句。
- use master
- go
- sp_detach_db 'MyDB1'
- go
- sp_attach_db 'MyDb1',
- 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.mdf',
- 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.ldf'
- GO
- 你可以使用具有“For Attach”从句的“Create database”命令附加上相同的数据库文件,如下所示。
- use master
- go
- sp_detach_db 'MyDB1'
- go
- CREATE DATABASE MyDB1
- ON
- (
- FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.mdf'
- ),
- (
- FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.ldf'
- ) for Attach
- go
现在,让我们分离数据库MyDB1,然后删除.ldf文件,再然后使用sp_attach_single_file_db系统存储过程通过执行下面的TSQL命令将它重新附加上。
- use master
- go
- sp_detach_db 'MyDB1'
- go
- exec master..xp_cmdshell 'del "C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.ldf"'
- go
注意:我使用xp_cmdshell来删除.ldf文件。如果xp_cmdshell没有激活,那么你将得到下面的错误。
错误:
- Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
- SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell'
- because this component is turned off as part of the security configuration for
- this server. A system administrator can enable the use of 'xp_cmdshell' by using
- sp_configure. For more information about enabling 'xp_cmdshell', see
- "Surface Area Configuration" in SQL Server Books Online.
你可以使用下面的事务SQL语句来激活xp_cmdshell。
- use master
- go
- sp_configure 'show advanced options',1
- go
- reconfigure with override
- go
- sp_configure 'xp_cmdshell',1
- go
- reconfigure with override
- go
或者,你可以在MS-DOS命令提示符中使用Windows资源管理器的“Del”命令来删除.ldf文件。
现在,让我们只使用sp_attach_single_file_db来附加.MDF文件。执行下面所示的命令。
- use master
- go
- sp_attach_single_file_db 'MyDB1',
- 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.mdf'
- go
结果
- File activation failure. The physical file name
- "C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.ldf" may be incorrect.
- New log file 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1_log.LDF' was created.
你可以只通过使用带有“For ATTACH_REBUILD_LOG”从句的“Create database”命令来附加相同的数据库.MDF文件,如下所示。
- use master
- go
- sp_detach_db 'MyDB1'
- go
- exec master..xp_cmdshell 'del
- "C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1_log.ldf"'
- go
注意:当日志文件被重新创建时,SQL Server自动对日志文件名称添加后缀“_log”。
- CREATE DATABASE MyDB1
- ON
- (
- FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database Data
- Data File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1.mdf'
- ) for ATTACH_REBUILD_LOG
结果:
- File activation failure. The physical file name "C:Program FilesMicrosoft SQL Server
- MSSQL10.SQL2008MSSQLDATASummary Database DataData File for
- Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1_log.LDF" may be incorrect.
- New log file 'C:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATASummary Database
- DataData File for Monthly ArchiveMicrosoft SQL Server 2008 Data FileMyDB1_log.LDF' was created.
总结
本文介绍了带有“For Attach”和“for ATTACH_REBUILD_LOG”用于一个单独的.MDF文件和一个单独的.LDF文件的“Create Database”语句的使用。
【编辑推荐】
- SQL Server 2008行数据和页数据压缩解密
- 图解SQL Server 2008 R2主数据服务安装
- 理解SQL Server 2008索引的存储结构
- SQL Server移动系统数据库开发详解
- SQL Server 2008 R2十大新特性解析