SQL Azure V12 BACPAC import error: "The internal target platform type SqlAzureV12DatabaseSchemaProvider does not support schema file version '3.3'"

SQL Azure V12 BACPAC import error: "The internal target platform type SqlAzureV12DatabaseSchemaProvider does not support schema file version '3.3'"

直到几天前,我才能够使用 SQL Server 2014 SP1 CU6 (12.0.4449.0) 从 Azure 将 V12 BACPAC 导入我的本地服务器。

但是现在,当我尝试导入 BACPAC 时,我的 SQL Server Management Studio 2014 说:

"Internal Error. The internal target platform type SqlAzureV12DatabaseSchemaProvider does not support schema file version '3.3'. (File: D:\MyDB.bacpac) (Microsoft.Data.Tools.Schema.Sql)"

我想我有最新的 SQL Server 2014 SP1 版本,其中包含所有最新更新(内部版本 12.0.4449.0),但我仍然收到此错误。

请帮忙!

谢谢

修复: 要解决此问题,请使用安装最新 DacFx 版本的 latest SSMS Preview。这了解如何处理最新的功能,特别是数据库范围的配置选项。安装完成后,如果您更喜欢命令行工具,您可以在 SSMS 中导入或使用“C:\Program Files (x86)\Microsoft SQL Server0\DAC\bin”位置的 SqlPackage。

或者,在 Azure DB 上执行以下命令将 MaxDop 值设置回默认值,因为看起来问题是它已更改为 1。未来的导出现在应该产生 2014 客户端可以理解的 bacpacs工具,假设没有其他新的 Azure 功能被添加到数据库中。

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0

根本原因/为什么会发生这种情况:根本原因是您的数据库有 1 个或多个数据库范围配置选项的非默认值。由于这些是最近才添加的,旧版本的工具不了解如何部署它们,因此 DacFx 会阻塞。这些是唯一具有如此高架构版本的 properties/objects。基本上任何时候你看到像“不支持模式文件版本'3.3'”这样的错误,这意味着你需要升级。一个可能的原因是如果数据库是从 AzureV1 -> AzureV12 迁移的,这会将 MaxDop 选项从默认值 0 设置为 1。

注意:强烈建议您使用最新的 SSMS,如果您使用的是 Azure,则通过内置更新通知使其保持最新。它将确保您避免 运行 陷入此类问题。一般来说,如果您只使用 SQL Server 2014 表面区域,您应该能够在重新导入时使用旧工具,但是随着 Azure SQL 数据库的大量最新进展,像这样的情况将会出现越来越多的地方需要新工具才能按预期执行。

作为参考,我在下面包含了数据库范围的配置选项及其默认值。如果这些属性中的任何一个在导出模式版本时在数据库上不是默认的,那么旧工具就不会损坏。

<!-- Database Scoped Configurations-->
<Property Name="MaxDop" Type="System.Int32" DefaultValue="0" />
<Property Name="MaxDopForSecondary" Type="System.Int32?" DefaultValue="null"/>
<Property Name="LegacyCardinalityEstimation" Type="System.Boolean" DefaultValue="false" />
<Property Name="LegacyCardinalityEstimationForSecondary" Type="System.Boolean?" DefaultValue="null" />
<Property Name="ParameterSniffing" Type="System.Boolean" DefaultValue="true" />
<Property Name="ParameterSniffingForSecondary" Type="System.Boolean?" DefaultValue="null" />
<Property Name="QueryOptimizerHotfixes" Type="System.Boolean" DefaultValue="false" />
<Property Name="QueryOptimizerHotfixesForSecondary" Type="System.Boolean?" DefaultValue="null" />

Kevin 给出的简单 "Alter" 解决方案(ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0)似乎是解决任何有客户流失问题的危机的快速解决方案。不要介意安装最新的 DAC 或 SQL Server 2016,没有必要解决眼前的问题,加上所有处于预览状态(测试版)的问题。您现在几乎不想将任何东西引入生产环境

如果我们有一个 v11 数据库等待 MSFT 为上周末设置的自动更新,这显然只发生在我们身上。对于那些我们取消并自行应用升级的数据库升级,最大并行度字段似乎没有设置为 0,并且出现了此错误。我们有大约 300 分贝,并注意到这是模式

仅供参考:您可以使用此 SQL 查询

检查该问题值
    SELECT [dbscm].[value]                         AS [MaxDop],
    [dbscm].[value_for_secondary]           AS [MaxDopForSecondary],
    [dbscl].[value]                         AS [LegacyCardinalityEstimation],
    [dbscl].[value_for_secondary]           AS    
    [LegacyCardinalityEstimationForSecondary],
    [dbscp].[value]                         AS [ParameterSniffing],
    [dbscp].[value_for_secondary]           AS 
    [ParameterSniffingForSecondary],
    [dbscq].[value]                         AS [QueryOptimizerHotfixes],
    [dbscq].[value_for_secondary]           AS 
    [QueryOptimizerHotfixesForSecondary]  
    FROM [sys].[databases] [db] WITH (NOLOCK)
    LEFT JOIN [sys].[database_scoped_configurations] AS [dbscm] WITH
    (NOLOCK) ON [dbscm].[name] = N'MAXDOP'
    LEFT JOIN [sys].[database_scoped_configurations] AS [dbscl] WITH  
    (NOLOCK) ON [dbscl].[name] = N'LEGACY_CARDINALITY_ESTIMATION'
    LEFT JOIN [sys].[database_scoped_configurations] AS [dbscp] WITH
    (NOLOCK) ON [dbscp].[name] = N'PARAMETER_SNIFFING'
    LEFT JOIN [sys].[database_scoped_configurations] AS [dbscq] WITH 
    (NOLOCK) ON [dbscq].[name] = N'QUERY_OPTIMIZER_HOTFIXES'
    WHERE [db].[name] = DB_NAME(); 

我在将导出从 azure 导入本地 MSSQLLocalDB 实例(用于本地调试)时遇到了同样的问题。

我不想接触 azure db 也不想下载最新的预览版。

所以我做了如下在我的 local db 上:

  1. 执行了 alter 查询,将 MAXDOP 的值设置为 1
    ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 1

  2. 导入 bacpac,运行 成功。

  3. MAXDOP的值重置为0
    ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0

希望对类似用例的人有所帮助