如何将 100 个数据库从一台 MS-SQL 2008 服务器迁移到另一台?(寻求自动化)

如何将 100 个数据库从一台 MS-SQL 2008 服务器迁移到另一台?(寻求自动化)

首先我要说的是,我不是一名 DBA,但我负责将近 100 个 MS-SQL 2008 DB 从我们当前的开发服务器迁移到新的/更好/更快的开发服务器。

由于这只是一个本地开发服务器,因此暂时停机是可以接受的,但我正在寻找一种方法来移动所有数据库(最好是批量移动)。

我知道我可以对每一个进行备份,然后在新服务器上恢复它,但考虑到数据库的数量,我正在寻找一种更有效的方法。

我并不反对学习新的软件、编写代码或任何其他要求,只要它能加快进程。

答案1

1) 移动文件后,以下脚本将生成 T-SQL 来创建数据库。在执行其他任何操作之前,执行此步骤非常重要。

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')

如果新服务器上数据文件的路径与旧服务器上的路径不同,您可以编辑脚本中的文件名(或者在查询中做一些更花哨的事情来自动为您执行此操作)。

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)通过关闭原始服务器或在原始服务器上执行步骤 2 中的 T-SQL,使数据库脱机

4)将文件移动到新服务器

5) 在新服务器上执行步骤2中的脚本。

答案2

由于您要恢复到相同版本的 SQL Server,因此当此任务出现时,我在我的环境中执行以下操作:

1)通过 T-3608 标志使该服务器保持处于仅主模式,将主数据库备份从源恢复到目标。

2) 恢复主服务器后,应确保新开发服务器具有与旧服务器相同的文件夹结构。例如,如果 mdf 文件需要转到“e:\data”,请确保在新服务器上设置此文件夹。确保提前记下每个数据库的路径,以便您可以将 mdf 和 ldf 文件放在新服务器上的相同位置

3) 现在,关闭旧的开发服务器。复制并粘贴所有数据库(包括模型和 msdb)的 mdf 和 ldf(将重新创建 tempdb)。

4) 将文件粘贴到新服务器上的相同位置后,删除 tace 标志并正常启动 sql 服务。

5) 有可能无法启动 SQL,请检查事件查看器中是否存在错误。

6)如果您发现一个数据库位于错误的位置,但 SQL 期望它位于其他位置,则必须再次使用跟踪标志并更改文件的位置以将其指向新目录。

如果上述步骤对您来说更容易掌握,请继续发布任何问题,否则请使用备份和恢复方法(很长但很容易)。

谢谢 Chandan

答案3

如果数据库版本相同,则可以在使数据库脱机后物理移动文件;首先收集所有数据库名称:

SELECT Name FROM sys.databases WHERE owner_sid <> 1

然后将其离线:

EXEC sp_msforeachdb 'ALTER DATABASE ? SET OFFLINE'

现在将物理 mdf 和 ldf 文件移动到新服务器,并为 CREATE 编写同一组数据库脚本:

CREATE DATABASE $foo ON 
  (FILENAME = 'mdf_location'), 
  (FILENAME = 'log_location') FOR ATTACH

注意:不要对主数据库执行此操作,否则将不起作用。
进行正常备份和恢复。

相关内容