当前位置:首页 > PHP教程 > PHP总结归纳

sqlserver数据库移动数据库路径的脚本示例

您现在的位置:首页>教程>编程开发>mssql数据库 > sqlserver数据库移动数据库路径的脚本示例 sqlserver数据库移动数据库路径的脚本示例 感谢 3lian8 的投递 时间:2013-12-06 来源:三联教程 前段时间做过这么一件事情,把原本放在c盘的所有数据库(除了sql

您现在的位置:首页 > 教程 > 编程开发 > mssql数据库 > sqlserver数据库移动数据库路径的脚本示例

sqlserver数据库移动数据库路径的脚本示例

感谢 3lian8 的投递 时间:2013-12-06 来源:三联教程 

前段时间做过这么一件事情,把原本放在c盘的所有数据库(除了sql server系统文件外)文件move到d盘,,主要是为了方便后续管理以及减少磁盘i/o阻塞(c,d是2个独立磁盘)。脚本需输入2个参数:目标数据库名字和目标目录

代码如下:

use master

go

declare

@dbname sysname,

@destpath varchar(256)

declare @db table(

name sysname,

physical_name sysname)

begin try

select

@dbname = 'targetdatabasename', --input database name

@destpath = 'd:sqldata' --input destination path

-- kill database processes

declare @spid varchar(20)

declare curprocess cursor for

select spid

from sys.sysprocesses

where db_name(dbid) = @dbname

open curprocess

fetch next from curprocess into @spid

while @@fetch_status = 0

begin

exec('kill ' + @spid)

fetch next from curprocess

end

close curprocess

deallocate curprocess

-- query physical name

insert @db(

name,

physical_name)

select

a.name,

a.physical_name

from sys.master_files a

inner join sys.databases b

on a.database_id = b.database_id

and b.name = @dbname

where a.type <=1

--set offline

exec('alter database ' + @dbname + ' set offline')

--move to dest path

declare

@login_name sysname,

@physical_name sysname,

@temp_name varchar(256)

declare curmove cursor for

select

name,

physical_name

from @db

open curmove

fetch next from curmove into @login_name,@physical_name

while @@fetch_status = 0

begin

set @temp_name = right(@physical_name,charindex('',reverse(@physical_name)) - 1)

exec('exec xp_cmdshell ''move "' + @physical_name + '" "' + @destpath + '"''')

exec('alter database ' + @dbname + ' modify file ( name = ' + @login_name

+ ', filename = ''' + @destpath + @temp_name + ''')')

fetch next from curmove into @login_name,@physical_name

end

close curmove

deallocate curmove

-- set online

exec('alter database ' + @dbname + ' set online')

-- show result

select

a.name,

a.physical_name

from sys.master_files a

inner join sys.databases b

on a.database_id = b.database_id

and b.name = @dbname

end try

begin catch

select error_message() as errormessage

end catch

go

 


.syntaxhighlighter{padding-top:20px;padding-bottom:20px;}

【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!