【问题标题】:SQL Server 2017 database downgrade to SQL Server 2014 (the target is in a Virtual Machine)SQL Server 2017 数据库降级到 SQL Server 2014(目标在虚拟机中)
【发布时间】:2020-07-12 16:31:56
【问题描述】:

我一直在尝试通过多种方式将一个非常大的数据库迁移到早期的 SQL Server,我开始做一个.bak 文件,但我发现它不兼容,它应该是同一个 SQL Server版本。

然后我选择了任务 - 生成脚本,创建一个包含所有架构和数据的.sql 文件,但该文件有 24gb 大!尽管使用sqlcmd 文件非常大,但我还是设法执行了它。但它从未成功执行完毕,它抛出了多种类型的错误,例如:

消息 156,级别 15,状态 1:
关键字“...”附近的语法不正确

消息 105,级别 15,状态 1
字符串后的非右引号

然后我发现这条评论有 2 个解决方案 https://stackoverflow.com/a/27623706/3192041,我尝试了第一个但仍然抛出第二个错误,我尝试了第二个,它成功了!现在一切都很顺利,但后来我又遇到了一个错误......

这个错误:

Sqlcmd:错误:ReadText 出现内部错误(原因:已尝试 将文件指针移动到文件开头之前)。

所以现在问题与sqlcmd 命令有关??

我应该继续尝试使用生成的脚本迁移数据库吗?有没有更好的方法让它与早期的 SQL Server 版本兼容?

需要澄清的事情

我首先创建了一个仅包含架构信息的脚本,但是当我尝试为数据生成单独的脚本时,SSMS 却抛出了错误。因此,通过这种方式,我不能或者我不知道如何以简单的方式导出所有数据。我知道你可以为每个表导出数据,但是数据库有 200 多个表,这是不可行的。

此外,脚本需要一个多小时,如果该过程正确完成,可能会比这个时间长得多。

【问题讨论】:

  • 你试过bacpac吗?
  • 是的,但结果中有两个错误,导出数据库和验证架构错误。
  • 错误消息是:在用作数据包一部分的架构中发现一个或多个不受支持的元素。
  • 你能在问题上添加完整的错误信息吗?
  • 在用作数据包一部分的架构中发现了一个或多个不受支持的元素。错误 SQL71564:验证元素 [UserKPI_old] 时出错:元素 [UserKPI_old] 已成为其登录的孤立元素,无法部署。错误 SQL71564:验证元素 [MalcolmKPI_old] 时出错:元素 [MalcolmKPI_old] 已从其登录中孤立,无法部署。错误 SQL71564:验证元素 [VaKPI_old] 时出错:元素 [VaKPI_old] 已从其登录中孤立出来,无法部署。错误 SQL71564:验证元素时出错 [AndronKPI_old]:元素...等等...

标签: ssms sql-server-2014 database-migration sql-server-2017


【解决方案1】:

最后在尝试使用 bacpac 文件后,由于 Windows 用户、外部对象引用等的一堆错误,这也让我无法创建...

解决此问题的最佳方法是创建一个 .dacpac 文件。从 SSMS 2012 到最新版本的 dacpac 文件,您现在可以包含所有表的数据。

为了解决不兼容的问题,您可以在发布到目标服务器时使用 AllowIncompatiblePlatform 属性允许部署到不同版本的 SQL Server。

所以首先您需要使用 SqlPackage.exe 从 sql server 的 bin 文件夹中提取,在我的情况下,这是文件夹:C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin

然后使用提取操作运行命令:

SqlPackage /Action:Extract /SourceDatabaseName:"<database-name>" /SourceServerName:"<server-name>" /SourceUser:"sa" /SourcePassword:"<password>" /TargetFile:"<dacpac-file-path>" /p:ExtractAllTableData=True

然后在另一台服务器的 SqlPackage.exe 程序的正确 bin 文件夹中运行此命令:

SqlPackage  /Action:Publish /SourceFile:" <dacpac file path>\filename.dacpac" /TargetDatabaseName:"<database name>" /TargetServerName:"<ServerName>" /TargetUser:"<username>" /TargetPassword:"<password>(if needed)" /p:AllowIncompatiblePlatform=true /p:CreateNewDatabase=true

如果你想从头开始创建数据库。

/p:CreateNewDatabase=true

我希望这可以帮助任何人解决这个问题,使用大型数据库,并从更大的 sql server 版本导入。

【讨论】:

  • 我们在导入到 sql2014 的每个约束上都得到了“跳过检查不受信任的约束”,但这似乎奏效了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2020-05-04
相关资源
最近更新 更多