• 移动Sql Server数据库的脚本


    前段时间做过这么一件事情,把原本放在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
  • 相关阅读:
    【Ogre编程入门与进阶】第二章 Ogre相关知识回顾 【转载】
    Ogre1.7.2 + CEGUI0.7.5环境配置 【转载】 需要配制出自己的基础环境
    JS_模拟广告栏跟随效果
    JS_模拟电商网站放大镜效果
    JS_图片轮播事件
    JS_DOM事件之鼠标事件之随鼠标移动
    JS_DOM之小球随鼠标移动事件
    JS_DOM事件温习
    JS_原型和继承之小案例
    JS_生成随机矩形位置/矩形大小_面向对象_原型+构造函数模式
  • 原文地址:https://www.cnblogs.com/aarond/p/sqlserver.html
Copyright © 2020-2023  润新知