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

WBOY
发布: 2016-06-07 16:19:27
原创
877 人浏览过

您现在的位置:首页>教程>编程开发>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

 

--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

 

 

相关文章

标签:

[返回三联首页] [返回mssql数据库栏目] / [加入三联文集]

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!