zoukankan      html  css  js  c++  java
  • 移动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
  • 相关阅读:
    C#创建自定义配置节
    linux下安装nginx
    linux查看防火墙状态和对外开放的端口状态
    js 获取二级域名
    .net core 获取本地ip及request请求端口
    《趣谈 Linux 操作系统》学习笔记(二):对 Linux 操作系统的理解
    《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
    Redis Cluster集群
    Redis的主从复制与Redis Sentinel哨兵机制
    Redis持久化方案
  • 原文地址:https://www.cnblogs.com/aarond/p/sqlserver.html
Copyright © 2011-2022 走看看