【问题标题】:Memory usage for bacpac restore to SQL serverbacpac 还原到 SQL Server 的内存使用情况
【发布时间】:2016-01-07 10:43:56
【问题描述】:

我刚刚将 .bacpac 文件恢复到本地 SQL 服务器实例 (64b v12.0.4213),备份来自 azure sql 实例。

它失败了几次,出现 OOM 异常。我关闭了我机器上的所有东西,在还原结束时,SQL Server 服务实例从一个 700MB 的文件中消耗了 13GB 的内存!

幸运地完成了恢复,但似乎内存没有被释放/垃圾收集。在我写这篇文章时,它仍然是 12GB。

这是一个已知问题吗?有什么办法可以恢复.bacpac 并选择要忽略的表?您可以通过正常的数据恢复来做到这一点,最令人反感的表是 dbo.[Logs] 表,obvs。

【问题讨论】:

  • 你试过用 sqlcmd 代替 ssms 吗?虽然对于这么小的数据库来说这很奇怪,但是众所周知 ssms 在大查询、数据库还原等方面存在问题。“但似乎内存没有被释放/垃圾收集”-SQLServer 或 SSMS 使用的内存?
  • SQLServer 而不是 SSMS,它在 win perf 工具中与 SQLServer 服务实例相关联。
  • SQLServer 内存不足——当他获得内存时,他几乎从不归还(并且有充分的理由)。关于您的问题:不完全是您的情况,但您是否尝试过 support.microsoft.com/en-us/kb/2874903 的解决方法?

标签: sql-server ssms azure-sql-database data-tier-applications


【解决方案1】:

我有同样的问题;修改服务器可用的内存没有影响。

对我来说,解决方案是使用命令行 (PowerShell) 执行导入。

[string]$myBacpac = 'c:\temp\myBacpac123.bacpac'
[string]$connectionString = 'Data Source=.;Initial Catalog=MyNewCatalog; Integrated Security=true;'
[string]$action = 'Import'

[string[]]$commandParameters = @(
    "/Action:`"$action`"" 
    "/SourceFile:`"$myBacpac`"" 
    "/TargetConnectionString:`"$connectionString`""
)
[string]$LatestSqlPackage = Get-Item 'C:\*\Microsoft SQL Server\*\DAC\bin\sqlpackage.exe' | %{get-command $_}| sort version -Descending | select -ExpandProperty source -First 1
if ($LatestSqlPackage) {
    Write-Verbose "Found: $LatestSqlPackage" 
    & $LatestSqlPackage $commandParameters
} else {
    Write-Error "Could not find SqlPackage.exe"
}

在我第一次尝试时,我收到了一个关于不支持的模型版本的错误:

正在导入服务器“.”上的数据库“MyNewCatalog”。创建部署计划 初始化部署 SqlPackage.exe:* 导入错误 数据库:无法从包中读取模式模型头信息。 在行:1 字符:1 + & $sqlPackage /Action:Import /SourceFile:"c:\temp\myBacpac123.bacpac" /T ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (* Error import...n from package.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 不支持模型版本“3.5”。

对于那个错误,我遵循了这里的指导:https://stackoverflow.com/a/40541210/361842;即安装Microsoft SQL Server Data-Tier Application Framework (16.4)。重新运行时一切都成功了。

【讨论】:

    【解决方案2】:

    要配置 SQL Server 的内存使用,打开 SQL Server Management Studio,连接到服务器,在对象资源管理器窗口中右键单击服务器,单击属性,然后单击服务器属性窗口的内存选项卡。

    对于 bacpac,您无法在导入操作期间选择要恢复哪些表,但您可以选择导出哪些表。您可以使用 SqlPackage.exe 的导出命令和 /p:TableData 参数来指定哪些表应该包含在 bacpac 中。不幸的是,没有办法只指定应该排除哪些表。 =^/

    SqlPackage.exe 文档可在此处获得:https://msdn.microsoft.com/en-us/hh550080(v=vs.103).aspx

    【讨论】:

    • 很棒的输入。团队正在将日志从数据库中移出,哈利路亚,所以我想我会更新导出以不包括它们。如果最坏的情况发生,它们可以在以后的日志和历史备份中使用。谢谢。
    【解决方案3】:

    其他答案都不适合我,起作用的是关闭并重新启动 SSMS。这听起来像是一个愚蠢的建议,但我之前一直在运行一些大型查询,这些查询肯定会导致内存问题。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多