将新版本的MS SQL Server的备份数据传输到旧版本

背景知识


有一次,为了重现错误,我需要备份生产基地。

令我惊讶的是,我遇到了以下限制:

  1. 数据库备份是在SQL Server 2016的版本上进行的,与我的SQL Server 2014不兼容。
  2. 在我的工作计算机上,将Windows 7用作操作系统,因此无法将SQL Server升级到2016版
  3. 受支持的产品是具有强大旧式体系结构的较大系统的一部分,并且还访问了其他产品和基础,因此将其部署到另一个站点可能需要很长时间。

鉴于上述情况,我得出的结论是, 迫切需要解决非标准解决方案的问题。

从备份恢复数据


我决定将Oracle VM VirtualBox与Windows 10一起使用(您可以从此处获取Edge浏览器的测试图像)。 SQL Server 2016已安装在虚拟机上,并且已从备份中还原了应用程序数据库( 指示 )。

在虚拟机中配置对SQL Server的访问


此外,有必要采取一些步骤以使从外部访问SQL Server成为可能:

  1. 对于防火墙,添加规则以跳过对端口1433的请求。
  2. 希望对服务器的访问不要通过Windows身份验证,而是通过带有用户名和密码的SQL(更容易配置访问权限)。 但是,在这种情况下,您必须记住要在SQL Server的属性中启用SQL身份验证。
  3. 在SQL Server的用户设置中的“ 用户映射”选项卡上,为还原的数据库指定用户角色db_securityadmin

资料传输


实际上,数据传输本身包括两个阶段:

  1. 数据模式传输(表,视图,存储过程等)
  2. 传输数据本身

数据架构迁移


我们执行以下操作:

  1. 为可移植数据库选择任务->生成脚本
  2. 我们选择传输或保留默认值所需的对象(在这种情况下,将为数据库中的所有对象创建脚本)。
  3. 指定用于保存脚本的设置。 将脚本保存到以Unicode编码的单个文件中是最方便的。 然后,如果发生故障,则无需再次重复所有步骤。

保存脚本后,可以在原始SQL Server(旧版本)上执行该脚本以创建所需的数据库。

注意:运行脚本后,需要从备份和脚本创建的数据库中检查数据库设置的符合性。 在我的情况下,脚本中没有COLLATE的设置,这导致在传输数据和使用手鼓跳舞以使用增强脚本重新创建数据库时崩溃。

资料传输


在传输数据之前,您必须基于以下条件禁用所有限制的检查:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all' 

我们使用SQL Server上的“ 任务”->“导入数据”数据导入向导传输数据,该脚本创建的数据库位于以下位置:

  1. 指定源连接设置(虚拟机上的SQL Server 2016)。 我使用了数据源SQL Server Native Client和前面提到的SQL身份验证。
  2. 指定用于连接到目标(主机上的SQL Server 2014)的设置。
  3. 接下来,配置映射。 您必须选择所有非只读对象(例如,您不需要选择视图)。 作为其他选项,请选择“允许插入身份列”
    注意:如果在尝试选择多个表并在其上设置“允许插入到身份列”属性时,已经为至少一个选定表设置了该属性,则对话框将指示已为所有选定表设置了该属性。 这个事实可能会造成混淆,并导致传输错误。
  4. 我们开始转移。
  5. 恢复约束检查:
     EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all' 

如果发生任何错误,请检查设置,删除因错误而创建的数据库,从脚本中重新创建它,进行更正并重复数据传输。

结论


此任务非常罕见,仅由于上述限制而出现。 最常见的解决方案是在应用程序体系结构允许的情况下升级SQL Server或连接到远程服务器。 但是,没有人可以避免使用遗留代码和质量低劣的开发工作。 希望您不需要此说明,但是如果您仍然需要它,它将有助于节省大量时间和精力。 感谢您的关注!

使用的来源清单


Source: https://habr.com/ru/post/zh-CN455934/


All Articles