自動遷離的腳本(自動實現分離+複製文件+附加)

改系統表方法的具體實現腳本:-- 自動遷離的腳本(自動實現分離+複製文件+附加)

-- 注意根據需要修改下面的--** 註釋的部分.

-- 鄒建2006.07 (引用請保留此信息)

 
--步驟1
-- 備份數目錄信息和分離數據庫
IF OBJECT_ID('tempdb..#') IS NOT NULL
    DROP TABLE #
CREATE TABLE #(
    DbName sysname,
    Name sysname,
    FileName nvarchar(260),
    FilePath as LEFT(FileName, LEN(FileName) - CHARINDEX('/', REVERSE(FileName))))
EXEC sp_msforeachdb N'
--**     如果是所有的用戶數據庫都要處理, 則去掉下面兩句的註釋, 並且註釋掉後面的兩行
--IF N''?'' IN(N''master'', N''model'', N''msdb'', N''tempdb'')
--RETURN  -- 只能處理用戶數據庫
--**     如果是處理指定的用戶數據庫, 則保持現狀
IF N''?'' NOT IN(N''要分離的數據庫名'', N''AdventureWorks'')          --關鍵點
    RETURN  -- 只處理指定列表的數據庫
USE [?]
INSERT #(DbName, Name, FileName)
SELECT DB_NAME(), name, RTRIM(filename) FROM sysfiles
USE master
EXEC sp_detach_db N''?''
'

 
--步驟2
-- 複製數據庫文件

DECLARE @s nvarchar(4000), @D_Drive char(1)
SET @D_Drive = 'D'  --**   遷移到E 盤
DECLARE tb CURSOR LOCAL
FOR
SELECT N'xcopy "' + FileName + '" "' + STUFF(FilePath, 1, 1, @D_Drive) + '/" /y'
FROM #
OPEN tb
FETCH tb INTO @s
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT(@s)
    EXEC master.dbo.xp_cmdshell @s
    FETCH tb INTO @s
END
CLOSE tb
DEALLOCATE tb

 

-- 附加數據庫
DECLARE @dbname sysname
DECLARE tb CURSOR LOCAL
FOR
SELECT DISTINCT
    DbName
FROM #
OPEN tb
FETCH tb INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @s = N'EXEC sp_attach_db ' + QUOTENAME(@dbname, N'''')
    SELECT @s = @s + N',''' + STUFF(FileName, 1, 1, @D_Drive) + N''''
    FROM #
    WHERE DbName = @dbname
    EXEC sp_executesql @s
    FETCH tb INTO @dbname
END
CLOSE tb
DEALLOCATE tb

 

 

 

 

 

 

 

 

 

 

 

 

 

----------------------------------------------------------------應用
問題描述:
一臺服務器,聯了好幾個陣列,其實可以看作不同的邏輯驅動器,就假設爲c盤,d盤,e盤
sql server 2000 程序裝在了c盤,數據裝在了d盤
現在陣列d需要撤走,我需要把原來d盤的數據庫文件挪到e盤上,數據庫有100多個,
一個一個手動備份恢復時間不夠,而且我不知道數據庫文件的路徑變了以後會有什麼問題(我做了試驗,服務起不起來了)。
我應該如何做?
我試了一種辦法,就是把d盤的所有數據庫的數據文件和文件夾原封不動的拷貝到e盤,然後把d盤撤走,
把e盤的盤符改爲d,就可以了,但是總覺得屬於歪招,所以想知道正規做法是怎麼做的?

 

解決方法:
最省事的方法還是所謂的改盤符歪招. 這種方法也最節約時間.
正常的方法就是備份/還原(不推薦, 太慢)
或者是1樓的分離/附加, 如果只是變盤符, 可以寫自動化腳本
最歪的方法是改系統表, 直接把系統表中記錄的數據文件和日誌文件目錄改正確.
(SQL Server 2005已經無法修改系統表, 所以定義這種方法是最歪的)

 


 

發佈了20 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章