将 SQL Server 2000 数据库升级到 2008 R2 并启用新功能

sae*_*lic 23 migration sql-server-2000 sql-server-2008-r2

我最近将 SQL Server 2000 数据库升级到 2008 R2。


我所做的是:

  1. 关闭旧机器上的 SQL Server 2000 (express) 服务,
  2. 将数据文件(mydatabase.mdfmydatabase.ldf)移动到新机器,
  3. 运行 SQL Server Management Studio 2008,
  4. 连接到本地数据库引擎,
  5. 将数据文件附加到数据库。
  6. 修改数据库兼容级别为SQL 2008(100)。

问题:我还应该做些什么来完成迁移?

我想要:

  1. 使用校验和和完整恢复模型等新功能,
  2. 使这个数据库与在 SQL 2008 R2 中创建的完全一样,
  3. 使该数据库完全兼容、正确并且非常适合新的 SQL 2008 R2 数据库引擎。

换句话说:我只想知道如何正确且完全地将旧的 SQL 2000 数据库转换为新的 2008 R2 数据库,保持冷静,一切都做得对,并对所有新功能感到满意。


我问这个问题是因为我在互联网上发现很多网站都说了很多不同的东西让我感到困惑:有人说需要重建索引,有人说要做其他事情......现在我什么都不知道,所以我想听听有经验的人的意见和清晰的分步说明。我在一家非常小的公司工作,我一个人,我不想把事情搞砸。


先生,您的回答给我留下了深刻的印象,我没想到这么多。


所以一些评论:

  1. 该数据库现已投入生产。正如我所说,它是使用 deattach-attach 方法升级的,正如我在第一篇文章中所描述的和 MSDN 上所述:http : //msdn.microsoft.com/en-us/library/ms189625.aspx 它必须快速完成,所以我被迫这样做。让我们忘记它有多么不合适,而专注于当前的情况。

  2. 用户/权限在这里不是问题 - 只有少数并且权限很简单。

  3. 使用数据库的应用程序兼容 SQL 2000 到 2012 年,所以这也不是问题。

  4. 数据库文件 (MDF) 不大 - 只有大约 1GB。


还有几个问题:

  1. 你推荐使用备份/恢复方法,但我按照上面写的做了,所以我现在会遇到什么问题吗?一切正常,没有任何问题。

  2. 关于校验和和完整恢复模型:它在 SQL 2000 上不可用/启用,所以我现在想使用它们。你说我唯一需要做的就是在数据库属性中启用这些选项?我在某处读过,这还不够,我还应该重建索引或其他东西。我真的不知道,我只是问问。

  3. 我正在准备将此数据库迁移到 SQL 2012 - 所以首先它是从 SQL 2000 到 2008 R2,现在它将是从 2008 R2 到 2012(由于缺乏对 SQL 2000 数据库的支持,因此无法直接执行此操作) SQL 2012)。所以我知道我应该按照您的指南进行操作:在 2008 R2 中备份并在 2012 中恢复,然后执行其余提示,对吗?

  4. 请向我解释备份/恢复方法:它是否像将数据库转储到 SQL 查询,然后通过执行一堆查询来恢复它?请问这个方法顺便“整理”我的数据库吗?如果没有,如何手动对其进行碎片整理/优化?

  5. 由于我们使用 SQL 2000 Express 多年(没有管理界面),我们只是通过停止引擎和 RAR DATA 目录来进行备份。现在,就像我们在 SQL 2008 上一样,这不是比在 Management Studio 中使用备份功能更好吗?

  6. 具有频繁事务日志备份的完整恢复模式- 事务日志存储在哪里 - 是 LDF 文件吗?我如何正确备份它?


我知道我的问题可能听起来很愚蠢,我不是专业的数据库管理员,但我是这里唯一可以完成升级数据库引擎等“核心”任务的人。我也相信你的知识会对像我这样的其他人有很大帮助。

非常感谢您的时间和知识,我真的很感激。

Kin*_*hah 37

要做的首要步骤是在 SQL Server 2000 数据库上运行升级顾问并解决它报告的所有问题。

作为最佳实践,在您的 SQL Server 2000 旧数据库上使用升级顾问工具并将跟踪文件导入升级顾问工具进行分析。跟踪文件允许升级顾问检测在简单的数据库扫描中可能不会出现的问题,例如嵌入在应用程序中的 TSQL。您可以在典型时间使用 SQL Server 2000 服务器上的 SQL Profiler 捕获 TSQL 的跟踪,并使用升级顾问分析这些跟踪。

所以其余的步骤将是:

迁移当天:

  1. 使用sp_help_revlogin编写我们在 2000 服务器上登录的脚本。
  2. 从 sql 2000 服务器编写作业和链接服务器的脚本。
  3. 停止连接到 2000 服务器的网络服务器。确保没有应用程序连接到 2000 服务器。
  4. 备份你的数据库并在目标 sql 2008 R2 服务器上恢复。(注意:不要分离/附加,因为事情可能会出错,你最终会得到分离的数据库并且没有备份!)
  5. 在 2008 R2 服务器上恢复备份后,在 2008 R2 服务器上运行 sp_help_revlogin 的输出以重新创建登录。
  6. 同步孤立用户(如果有)并在新服务器上重新创建 sql 代理作业和链接服务器。
  7. 将还原的数据库上的兼容性级别更改为 100。
  8. 开启 all_errormsgs 和 data_purity 选项的 Dbcc checkdb : DBCC CHECKDB ('<db_name_goes_here>' ) WITH ALL_ERRORMSGS,NO_INFOMSGS, DATA_PURITY
  9. 在还原的数据库上运行 DBCC UPDATEUSAGE DBCC UPDATEUSAGE('database_name') WITH COUNT_ROWS
  10. 使用完整扫描更新所有表的统计信息: Update Statistics table_name with FULLSCAN
  11. 可选:检查碎片级别并根据碎片级别运行所有索引的重组/重建。您可以使用Ola 的脚本
  12. 使用重新编译所有 SP sp_recompile 'procedureName'
  13. 刷新您的看法 SP_REFRESHVIEW view_name
  14. 确保将数据库选项:页面验证更改为 CHECKSUM。
  15. 将恢复模型(如果不同于 sql 2000)更改为 FULL。如果您更改为完整恢复模式,请确保您经常执行事务日志备份。这将帮助您恢复时间点,并且不会使您的 T-Log 膨胀。
  16. 在 SQL Server 2005 及更高版本中,引入了数据库邮件。所以你必须从 SQLMail 迁移到数据库邮件。

    USE [master]
    GO
    sp_configure 'show advanced options',1
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    sp_configure 'Database Mail XPs',1
    GO
    RECONFIGURE 
    GO
    
    Run Code Online (Sandbox Code Playgroud)

此外,如果您有任何复制,则必须将其重置。如果任何 DR 像 logshipping 或 Mirroring(2005 年及以后的新项目,但在 2012 年折旧),那么您也必须重新设置它。

旧的 DTS 包需要使用C:\Program Files\Microsoft SQL Server\100\DTS\Binn\DTSMigrationWizard.exe(命令行)或使用包迁移向导迁移到 SSIS 。

此外,您可以使用我在https://dba.stackexchange.com/a/36701/8783 上找到的脚本。虽然它使用分离/附加方法,但我强烈建议您使用 BACKUP/RESTORE方法。相应地更改脚本。


作为旁注:

  • 在新服务器上打开即时文件初始化
  • 多个相同大小的tempdb 数据文件
  • 启用跟踪标志 1118
  • 正确配置最大和最小内存。特别是最大内存远离默认值。
  • 正确调整 MAXDOP 设置。有关更多详细信息,请参阅https://dba.stackexchange.com/a/36578/8783
  • 最好是安装sp_Blitz从布伦特奥扎尔。 运行它并解决它报告的关键和高优先级问题。
  • 你甚至可以使用SQL电源文件从kendalvandyke - SQL电源督工作与SQL Server的所有版本的SQL Server 2000至2012年从Windows 2000和Windows XP通过Windows Server 2012的和Windows和Windows Server和消费者的Windows操作系统的所有版本8. 也可用于规划升级 - 查看实例上正在使用的隐藏功能。
  • 为临时工作负载启用优化和默认备份压缩选项。

让我们解决您的问题...

我还应该做什么才能完成迁移?

参考我的回答。它将帮助您正确制定迁移计划。始终在 UAT(非生产)中测试您的迁移计划,同时由业务用户进行适当的应用程序测试。

使用校验和和完整恢复模型等新功能。

CHECKSUM是 SQL Server 2005 及更高版本中的新增功能。我已经将其作为上述迁移步骤的一部分进行了介绍。

full recovery model不是新的。这取决于您的业务类型,并决定了在发生灾难时您可能会丢失多少数据。

具有频繁事务日志备份的完整恢复模式将允许您通过减少数据丢失量来恢复时间点。

使该数据库与在 SQL Server 2008 R2 中创建的完全相同。

使该数据库完全兼容、正确并完美适用于新的 SQL 2008 R2 数据库引擎。

不完全理解这个!但以上迁移步骤会对您有所帮助。您只需100按照上述步骤恢复数据库并更改兼容性级别 10 。

我只想知道如何正确且完全地将旧的 SQL Server 2000 数据库转换为新的 2008 R2 数据库,保持冷静,一切都做得对,并对所有新功能感到满意。

您必须小心这一点,因为这也需要更改您的应用程序代码。如果您的应用程序代码更改为使用 SQL Server 2008 R2 中的新功能,那么您将不会遇到任何问题 - 前提是您已经在 UAT 或 DEV 环境中对您的应用程序进行了完整的回归测试。当您在 PROD 中进行实际迁移时,这会给您最大的信心。


注意:以上是我能记住的步骤,我很确定没有遗漏任何内容。如果我发现我遗漏了一些东西,那么我会在本网站上添加它或其他专家 - 随时添加!

上面概述的所有内容都需要首先在非生产环境中重放,以避免在实际迁移过程中出现任何意外。

----------

还有几个问题:

你推荐使用备份/恢复方法,但我按照上面写的做了,所以我现在会遇到什么问题吗?一切正常,没有任何问题。

如果一切正常并且您能够附加数据库,那么不,您不会遇到任何问题。分离/附加与备份/恢复只是一种关于如何将数据库移动到不同位置的方法。仅供参考..备份/恢复更安全可靠,就好像出现任何问题(在最坏的情况下),那么至少您有一个备份来恢复和恢复您的数据库。

关于校验和和完整恢复模型:它在 SQL Server 2000 上不可用/启用,所以我现在想使用它们。你说我唯一需要做的就是在数据库属性中启用这些选项?我在某处读过,这还不够,我还应该重建索引或其他东西。我真的不知道,我只是问问。

正如我所说,校验和是 2005 及更高版本中的新内容。它是一种机制,SQL Server 将通过它检测页面损坏,尤其是由于 I/O 导致的页面损坏。有关更多详细信息,请参阅我的答案here

要启用 CHECKSUM 并将恢复模式更改为 FULL,您可以使用以下 T-SQL 代码来完成:

USE master;
GO
ALTER DATABASE [your_database_name] -- change this !!
SET RECOVERY FULL, PAGE_VERIFY CHECKSUM;
GO
Run Code Online (Sandbox Code Playgroud)

注意:一旦您设置了数据库选项,当您从 2008R2 迁移到 2012 时,它将被持久化。

我正准备将此数据库迁移到 SQL Server 2012 - 首先是从 2000 到 2008 R2,现在是从 2008 R2 到 2012(由于 SQL 中缺乏对 2000 个数据库的支持,因此无法直接执行此操作服务器 2012)。所以我知道我应该按照您的指南进行操作:在 2008 R2 中备份并在 2012 中恢复,然后执行其余提示,对吗?

是的,请。正如我所说,备份还原是首选方法,除非您有充分的理由不这样做。

请向我解释备份/恢复方法:它是否像将数据库转储到 SQL 查询,然后通过执行一堆查询来恢复它?请问这个方法顺便“整理”我的数据库吗?如果没有,如何手动对其进行碎片整理/优化?

备份/恢复是...类似于在 Sybase、Oracle 或 MySQL 中使用的转储和加载。它只是 SQL Server 称之为 .. 备份/恢复。

必读:Paul Randall 的《了解 SQL Server 备份》

简单语法(完整语法参考BOL):

backup database database_name
to disk = 'D:\backup\database_name_full.bak'
with init, stats =10
Run Code Online (Sandbox Code Playgroud)

然后可以在目标服务器上进行还原,如下所示:

-- 假设目的地的磁盘布局与源服务器的不匹配

restore database database_name
from disk = 'D:\backup\database_name_full.bak'
move 'logical_data_fileName' to 'physical_path\database_name.mdf'
move 'logical_log_fileName' to 'physical_path\database_name_log.ldf'
with recovery, stats = 10
Run Code Online (Sandbox Code Playgroud)

-- 假设目标的磁盘布局与源服务器的匹配

restore database database_name
from disk = 'D:\backup\database_name_full.bak'
with recovery, stats = 10
Run Code Online (Sandbox Code Playgroud)

请问这个方法顺便“整理”我的数据库吗?如果没有,如何手动对其进行碎片整理/优化?

备份/恢复不会对您的数据库进行碎片整理。您必须根据碎片级别使用 Alter Index Reorganize 或 Rebuild。

由于您是 SQL Server 的新手,我强烈建议您使用 Ola Hallengren 的:

由于我们使用 SQL Server 2000 Express 多年(没有管理界面),我们只是通过停止引擎和 RAR DATA 目录来进行备份。就目前而言,由于我们在 SQL Server 2008 上,这不是比在 Management Studio 中使用备份功能更好吗?

停止引擎是你可以做的更糟糕的事情来做备份!!

阅读 Paul 关于我提到的备份的链接和使用 Ola 的脚本。Microsoft 有一篇 KB 文章,其中包含执行自动备份的脚本 -如何在 SQL Server Express 中安排和自动执行 SQL Server 数据库的备份

具有频繁事务日志备份的完整恢复模式- 事务日志存储在哪里 - 是 LDF 文件吗?我如何正确备份它?

每个 SQL Server 数据库都有一个日志,记录每个事务所做的所有事务和数据库修改。事务日志是任何数据库的关键组件。

事务日志的通常命名约定扩展名是“.LDF”,但它可以是任何扩展名。

我不会在这方面写更多,因为这会使答案变得非常简洁。请参阅 事务日志管理,我在这里的回答也有很好的链接。


编辑:8/24/2016 .. 这将有助于未来的读者:

如果您要将整个实例从一个版本迁移到另一个版本,我强烈建议您使用基于 PowerShell 的解决方案Start-SqlMigration

在此处输入图片说明