展会信息港展会大全

sqlserver数据库移动数据库路径的脚本示例
来源:互联网   发布日期:2016-02-18 16:43:34   浏览:1751次  

导读: 前段时间做过这么一件事情,把原本放在c盘的所有数据库(除了sql server系统文件外)文件Move到D盘,主要是为了方便后续管理以及减少磁盘I/O阻塞(C,D是2个独立磁盘)。脚本...

前段时间做过这么一件事情,把原本放在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

赞助本站

人工智能实验室

相关热词: 开发 编程 android

相关内容
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港