史前
有一次,为了重现一个错误,我需要备份生产数据库。
令我惊讶的是,我遇到了以下限制:
- 数据库备份是在版本上进行的 SQL Server的2016的 并且与我的不兼容 SQL Server的2014的.
- 在我的工作计算机上,使用的操作系统是 窗户7所以我无法更新 SQL服务器 直到 2016 版
- 受支持的产品是具有紧密耦合的遗留架构的更大系统的一部分,并且还与其他产品和基地对话,因此可能需要很长时间才能将其部署到另一个站点。
从备份恢复数据
我选择使用虚拟机
在虚拟机上配置对 SQL Server 的访问
接下来,需要采取一些步骤才能从外部访问 SQL Server:
- 对于防火墙,添加一个规则来跳过端口请求 1433.
- 希望对服务器的访问不通过 Windows 身份验证,而是通过使用登录名和密码的 SQL(设置访问更容易)。 但是,在这种情况下,您需要记住在 SQL Server 属性中启用 SQL 身份验证。
- 在选项卡上的 SQL Server 用户设置中 用户映射 为恢复的数据库指定用户角色 数据库安全管理员.
数据传输
实际上,数据传输本身包括两个阶段:
- 数据模式传输(表、视图、存储过程等)
- 传输数据本身
数据模式传输
我们执行以下操作:
- 选择 任务 -> 生成脚本 用于便携式底座。
- 选择您需要传输的对象或保留默认值(在这种情况下,将为所有数据库对象创建脚本)。
- 指定保存脚本的设置。 将脚本保存在单个 Unicode 文件中最为方便。 然后,如果失败,则无需再次重复所有步骤。
一旦脚本被保存,它就可以在原来的SQL Server(旧版本)上运行以创建所需的基础。
注意事项: 执行脚本后,需要检查备份的数据库设置与脚本创建的数据库的对应关系。 在我的例子中,脚本中没有 COLLATE 设置,这导致在传输数据和使用手鼓跳舞以使用补充脚本重新创建数据库时失败。
数据传输
在传输数据之前,您必须禁用对数据库的所有限制的检查:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
使用数据导入向导进行数据传输 任务 -> 导入数据 在 SQL Server 上,脚本创建的数据库所在的位置:
- 指定与源的连接设置(虚拟机上的 SQL Server 2016)。 我使用数据源 SQL Server 本机客户端 和前面提到的 SQL 身份验证。
- 指定目标的连接设置(主机上的 SQL Server 2014)。
- 接下来,设置映射。 必须全选 不是只读的 对象(例如,不需要选择视图)。 作为附加选项,选择 “允许插入标识列”如果这样使用。
注意事项: 如果,在尝试选择多个表并设置它们的属性时 “允许插入标识列” 已为至少一个选定表设置属性,对话框将指示已为所有选定表设置属性。 这一事实可能会造成混淆并导致迁移错误。 - 我们开始转移。
- 恢复约束检查:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
如果出现任何错误,我们会检查设置,删除错误创建的数据库,从脚本中重新创建它,进行更正并重复数据传输。
结论
此任务非常罕见,仅由于上述限制而发生。 最常见的解决方案是升级 SQL Server 或在应用程序体系结构允许的情况下连接到远程服务器。 然而,没有人能幸免于遗留代码和低质量开发的歪手。 我希望您不需要此说明,但如果您仍然需要它,它将帮助您节省大量时间和精力。 感谢您的关注!
使用来源清单
使用DTS导入/导出向导导入数据时如何处理FK约束? 无法处理列“Column 2”,因为为其指定了多个代码页(65001 和 1252)。 如何从主机 Macbook 连接到在 VirtualBox 上运行的 SQLServer。 SQL SERVER - 启用标识插入 - 导入专家向导 排除 Microsoft SQL Server 错误 18456,用户登录失败
来源: habr.com