首先让我说我不是DBA,但是我负责将我们当前的开发服务器中不到100个MS-SQL 2008数据库移动到新的/更好/更快的开发服务器上。
由于这只是一个本地开发服务器,暂时停机是可以接受的,但我正在寻找一种方法来移动所有的数据库(最好是批量)。
我知道我可以把每一个都拿出来,然后在新的服务器上恢复它,但是考虑到数据库的数量,我正在寻找更有效的方法。
我不反对学习一个新的软件,编写代码或者任何其他的要求,只要它加快了这个过程。
1)移动文件后,以下脚本将生成T-SQL以创build数据库。 在这之前做这个步骤是很重要的。
SELECT 'create database ' + QUOTENAME(DB_NAME(d.database_id)) + ' on ' + STUFF(( SELECT ',(name = ''' + name + ''', filename = ''' + [physical_name] + ''')' FROM sys.[master_files] AS mf WHERE [mf].[database_id] = d.[database_id] FOR XML PATH('') ), 1, 1, '') + ' for attach' FROM sys.[databases] AS d WHERE d.name NOT IN ('master', 'model', 'tempdb', 'msdb')
如果新服务器上的数据文件的path与旧服务器上的数据文件的path不同,则可以编辑脚本中的文件名(或者在查询中做一些更奇特的事情来自动完成)。
2)以下代码将生成一个T-SQL脚本,将所有非系统数据库的数据库状态设置为脱机。 如果您的计划是将原始服务器设置为离线(这不是一个坏主意),那么这个步骤是不必要的,因为数据库文件不会被服务器使用。
select 'alter database ' + quotename(name) + ' set offline' from sys.[databases] as d WHERE d.name NOT IN ('master', 'model', 'tempdb', 'msdb')
3)通过closures原始服务器或从原始服务器上的步骤2执行T-SQL来使数据库脱机
4)将文件移动到新的服务器
5)在新服务器上执行步骤2中的脚本。
由于您要还原到相同版本的SQL Server,因此在执行此任务时,我在环境中执行了以下操作:
1)通过T-3608标志使该服务器保持纯主模式,从而将主数据库备份从源恢复到目的地。
2)恢复主服务器后,应确保新的开发服务器具有与旧服务器相同的文件夹结构。 例如。 如果mdf文件需要转到“e:\ data”,请确保在新服务器上设置了该文件夹。 确保提前记下每个数据库的path,以便您可以将mdf和ldf文件放在新服务器的相同位置上
3)现在,closures旧的开发服务器。 复制和粘贴包括model和msdb在内的所有数据库的mdf和ldf(tempdb将被重新创build)。
4)将文件粘贴到新服务器上的相同位置后,删除tace标志并正常启动sql服务。
5)将有可能的sql无法启动,请检查eventviewer的错误。
6)如果你发现一个数据库位于错误的位置,但是SQL期望在其他位置,你必须再次使用跟踪标志,改变文件的位置来指向新的目录。
如果上述步骤更容易掌握,请继续,并发布任何其他问题,使用备份和恢复方法(长,但容易)。
谢谢Chandan
如果数据库版本相同,则可以在使数据库脱机后物理移动文件; 首先收集所有数据库名称:
SELECT Name FROM sys.databases WHERE owner_sid <> 1
然后把他们脱机:
EXEC sp_msforeachdb 'ALTER DATABASE ? SET OFFLINE'
现在将物理的mdf和ldf文件移动到新的服务器上,并为CREATE创build同一组数据库:
CREATE DATABASE $foo ON (FILENAME = 'mdf_location'), (FILENAME = 'log_location') FOR ATTACH
注意:不要为master数据库执行此操作,它将不起作用。
进行正常的备份和恢复。