SQLServer数据库操作

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;  –重建表中特定索引

滚动至顶部