Home > Database > Mysql Tutorial > body text

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

WBOY
Release: 2016-06-07 16:19:27
Original
879 people have browsed it

您现在的位置:首页>教程>编程开发>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数据库栏目] / [加入三联文集]

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!