如何迁移数据库到另一个分区

原创 2006年07月09日 22:52:00

问题描述:

一台服务器,联了好几个阵列,其实可以看作不同的逻辑驱动器,就假设为c盘,d盘,e

sql server 2000 程序装在了c盘,数据装在了d

现在阵列d需要撤走,我需要把原来d盘的数据库文件挪到e盘上,数据库有100多个,一个一个手动备份恢复时间不够,而且我不知道数据库文件的路径变了以后会有什么问题(我做了试验,服务起不起来了)。

我应该如何做?

我试了一种办法,就是把d盘的所有数据库的数据文件和文件夹原封不动的拷贝到e盘,然后把d盘撤走,把e盘的盘符改为d,就可以了,但是总觉得属于歪招,所以想知道正规做法是怎么做的?

 

解决方法:

最省事的方法还是所谓的改盘符歪招. 这种方法也最节约时间.

正常的方法就是备份/还原(不推荐, 太慢)

或者是1楼的分离/附加, 如果只是变盘符, 可以写自动化脚本

最歪的方法是改系统表, 直接把系统表中记录的数据文件和日志文件目录改正确.(SQL Server 2005已经无法修改系统表, 所以定义这种方法是最歪的)

 

改系统表方法的具体实现脚本:

-- 自动迁离的脚本(自动实现分离+复制文件+附加)

-- 注意根据需要修改下面的--** 注释的部分.

-- 邹建2006.07 (引用请保留此信息)

 

-- 备份数目录信息和分离数据库

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''HelloWorldDB'', N''AdventureWorks'')

    RETURN  -- 只处理指定列表的数据库

USE [?]

INSERT #(DbName, Name, FileName)

SELECT DB_NAME(), name, RTRIM(filename) FROM sysfiles

 

USE master

EXEC sp_detach_db N''?''

'

 

-- 复制数据库文件

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

 

如何把大部分表中的数据迁移到另一个数据库中

需求描述:目前远程服务器有两个数据库AA和BB,两个数据库的数据库版本都为10.2.1.0.1,两个数据库中的用户不一样,但数据库中的表结构都是一样的,数据库AA表中的数据比数据库BB表中的数据多很多...

mysql数据库另一个版本

  • 2017年06月22日 15:08
  • 253.9MB
  • 下载

02-Hive一个表创建另一个表,表分区,分桶

声明:如果你是初学者,看我这篇文章的时候,看我上一篇会更好。 Hive表的创建:http://blog.csdn.net/qq_29622761/article/details/51564680这篇...

另一个成语数据库

  • 2017年03月28日 14:13
  • 10.36MB
  • 下载

ORACLE如何使用DBLINK连接另一个数据库

一. 实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中。 二. 实现方法步...

ORACLE如何使用DBLINK连接另一个数据库[整理]

一. 实现结果: 在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中。 二. 实现方法步...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何迁移数据库到另一个分区
举报原因:
原因补充:

(最多只允许输入30个字)