背景知识
有一次,为了重现错误,我需要备份生产基地。
令我惊讶的是,我遇到了以下限制:
- 数据库备份是在SQL Server 2016的版本上进行的,与我的SQL Server 2014不兼容。
- 在我的工作计算机上,将Windows 7用作操作系统,因此无法将SQL Server升级到2016版
- 受支持的产品是具有强大旧式体系结构的较大系统的一部分,并且还访问了其他产品和基础,因此将其部署到另一个站点可能需要很长时间。
鉴于上述情况,我得出的结论是,
迫切需要解决非标准解决方案的问题。
从备份恢复数据
我决定将
Oracle VM VirtualBox与Windows 10一起使用(您可以
从此处获取Edge浏览器的测试图像)。 SQL Server 2016已安装在虚拟机上,并且已从备份中还原了应用程序数据库(
指示 )。
在虚拟机中配置对SQL Server的访问
此外,有必要采取一些步骤以使从外部访问SQL Server成为可能:
- 对于防火墙,添加规则以跳过对端口1433的请求。
- 希望对服务器的访问不要通过Windows身份验证,而是通过带有用户名和密码的SQL(更容易配置访问权限)。 但是,在这种情况下,您必须记住要在SQL Server的属性中启用SQL身份验证。
- 在SQL Server的用户设置中的“ 用户映射”选项卡上,为还原的数据库指定用户角色db_securityadmin 。
资料传输
实际上,数据传输本身包括两个阶段:
- 数据模式传输(表,视图,存储过程等)
- 传输数据本身
数据架构迁移
我们执行以下操作:
- 为可移植数据库选择任务->生成脚本 。
- 我们选择传输或保留默认值所需的对象(在这种情况下,将为数据库中的所有对象创建脚本)。
- 指定用于保存脚本的设置。 将脚本保存到以Unicode编码的单个文件中是最方便的。 然后,如果发生故障,则无需再次重复所有步骤。
保存脚本后,可以在原始SQL Server(旧版本)上执行该脚本以创建所需的数据库。
注意:运行脚本后,需要从备份和脚本创建的数据库中检查数据库设置的符合性。 在我的情况下,脚本中没有COLLATE的设置,这导致在传输数据和
使用手鼓跳舞以使用增强脚本重新创建数据库时崩溃。
资料传输
在传输数据之前,您必须基于以下条件禁用所有限制的检查:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
我们使用SQL Server上的“
任务”->“导入数据”数据导入向导传输数据,该脚本创建的数据库位于以下位置:
- 指定源连接设置(虚拟机上的SQL Server 2016)。 我使用了数据源SQL Server Native Client和前面提到的SQL身份验证。
- 指定用于连接到目标(主机上的SQL Server 2014)的设置。
- 接下来,配置映射。 您必须选择所有非只读对象(例如,您不需要选择视图)。 作为其他选项,请选择“允许插入身份列” 。
注意:如果在尝试选择多个表并在其上设置“允许插入到身份列”属性时,已经为至少一个选定表设置了该属性,则对话框将指示已为所有选定表设置了该属性。 这个事实可能会造成混淆,并导致传输错误。 - 我们开始转移。
- 恢复约束检查:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
如果发生任何错误,请检查设置,删除因错误而创建的数据库,从脚本中重新创建它,进行更正并重复数据传输。
结论
此任务非常罕见,仅由于上述限制而出现。 最常见的解决方案是在应用程序体系结构允许的情况下升级SQL Server或连接到远程服务器。 但是,没有人可以避免使用遗留代码和质量低劣的开发工作。 希望您不需要此说明,但是如果您仍然需要它,它将有助于节省大量时间和精力。 感谢您的关注!
使用的来源清单