SQLServer数据库附加与分离操作
1、附加数据库
语句格式:
exec sp_attach_db @dbname=N’db_name’,@filename1=N’filepath\db_filename’,@filename2=N’filepath\log_filename’
其中,如果主数据库文件和log文件在相同路径下,则最后一个log文件地址参数可以省略
例:
exec sp_attach_db @dbname=N’ASTdb2016′,@filename1=N’C:\outsysdb\db008\2016\zsys2016.mdf’
2、分离数据库
语句格式:
exec sp_detach_db @dbname=N’db_name’;
执行分离语句时可能会报正在使用的错误:“无法分离数据库db_name,因为它当前正在使用”,则可在执行分离语句前置一句:
use master
3、备份数据库
语句格式:
backup database db_name to disk=’path:\db.bak’ [with init];
其中:with init参数为覆盖所有备份集,加入后备份文件比较小,如果不小备份文件会比较大。
例如:
backup database testdb to disk=’D:\testdb.bak’ –testdb为数据库
4、恢复数据库
语句格式:
restore database db_name from disk=’path:\db.bak’ with replace;
例:
restore database testdb from disk=’D:\testdb.bak’ with replace –testdb为数据库
但实际上直接用这个语句去恢复数据库都会不成功,因为数据库会有使用状态而无法恢复,所以,如果要顺利用语句来恢复数据库,还需要加些前置的操作,主要目的是断开正在使用的连接。
过程很简单,基本思路是:先取得数据库被系统使用的所有进程(通常不止一个),创建进程ID号的结果集,使用游标逐一取得每一个ID并将其结束,最后成功恢复数据库。
具体过程如下(仍以testdb为示例数据库):
use master
declare @spid varchar(50)
declare @spidsql varchar(200)
select spid from sysprocesses where dbid=db_id(‘testdb’) –这句是查询使用进程,可不写
set @spidsql=’declare getspid cursor for select spid from sysprocesses where dbid=db_id(”testdb”)’
exec (@spidsql) –创建进程结果集和游标
open getspid
fetch next from getspid into @spid
while @@fetch_status<>-1
begin
exec (‘kill ‘ + @spid)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
restore database testdb from disk=’D:\testdb.bak’ with replace –恢复数据库
5、重建数据库索引
alter index all on table_name rebuild; –重建表中所有索引
alter index index_name on table_name rebuild; –重建表中特定索引