【问题标题】:How to execute a 3GB SQL file (Microsoft SQL Server)?如何执行 3GB 的 SQL 文件(Microsoft SQL Server)?
【发布时间】:2010-10-31 08:17:14
【问题描述】:

我有一个不适合内存的大 SQL 文件,需要针对 Microsoft SQL Server 2008 执行。似乎sqlcmd.exe 工具总是先将其加载到内存中,这在这种情况下是不可能的。有什么想法吗?

很遗憾,我无法拆分脚本,因为它是由 Red Gate 出色的 SQL 数据比较生成的。整个脚本是一笔大交易,我想保持这种状态。我从来没有想过拥有一个巨大的脚本是不寻常的,因为在数据库世界中拥有大量数据是很常见的。脚本大小为 3gb。

【问题讨论】:

  • SQL 文件不适合内存?真的???
  • 文件有多大?!?!?!?!?!?
  • 只是添加到上面所有令人惊讶的 cmets 中......也许如果您描述为什么要运行如此大的文件,人们可以提出替代方案。例如,如果它非常大,因为您要从另一个数据库手动插入数百万行,那么 ETL 过程可能比将其全部提取到脚本中并运行要好。
  • 如果文件是数据(即很多 INSERT 语句),那么使用 SQL 文件可能是错误的方法,最好将 SSIS 与 CSV 文件或类似文件一起使用。
  • 如果您只是将大量数据从一个数据库/表移动到另一个,那么 RG 的数据比较是错误的工具。如果您正在同步两个表(两个表包含客户并且您需要将它们合并,或者一个表包含一些数据并且您需要从另一个表中添加不匹配的行,但您不能删除已经存在的内容),这个是数据比较擅长的地方。如果您只是将数据移动到一个空表中,我会检查其他方法,例如 SSIS,它仍然可以在事务中完成。

标签: sql sql-server sqlcmd redgate sqlcompare


【解决方案1】:

RedGate 的 SQL 比较具有直接执行语句的选项,而不是生成 SQL 脚本并稍后执行。这是否有原因不起作用 - 换句话说,是否有原因您需要 SQL 脚本并且不能使用应用程序的“立即同步”功能?

【讨论】:

  • 这是一个很好的观点(Redgate 生产了一些很棒的产品),但他可能在他的环境中没有更新访问权限。这就是我所处的位置。我需要生成脚本并将它们传递给 DBA 运行。
  • 触摸。在这种情况下,是否有必要在单个事务中更新每个表?您能否改为将操作分解为 3-4 个不同的脚本,这意味着每次仅在 1/4 的桌子上运行 Red Gate 工具(挑选桌子以便平衡每个脚本的大小)?尽管这不是整个更新的纯事务,但每个部分都是一个事务,因此如果脚本失败,您的数据不会处于“损坏”状态,您甚至可以请求 DBA 在一次运行期间同时运行它们维护窗口,因此用户不会看到部分更新的数据。
  • 您可以提出 DBA 可以为他运行 SQL 数据比较的论点。对我来说,问题是 SQL 数据比较是否会遇到同样的问题。我的意思是,Redgate 不只是以与 Management Studio 运行脚本相同的方式为您运行脚本。我不是说不要尝试。这是个好主意
  • wcm 是正确的:我无法从运行 SQL 数据比较的机器更新数据库,我怀疑这种情况很快就会改变。流式传输脚本而不是立即执行它真的那么难吗?顺便说一句,脚本适用于一张巨大的桌子,而不是很多。
  • 我们拥有 Red Gate Data Compare 的副本,所以我只是做了一个比较,并让该工具在运行 SQL Profiler 时同步数据库,看起来该工具实际上打开了事务,运行语句分批,最后提交。由于它一次提交较小的批次,因此它应该可以在 DBA 的工作站上正常运行。这是一个可行的选择吗?
【解决方案2】:

几个月前我遇到了这个问题。我每周和每月使用 SQLDataCompare 为我们的几个目录数据库生成同步脚本,它们通常大于 500MB。我的解决方案是编写一个 VBscript,将更新脚本分成 50 到 1000 个命令批次。这种方法的问题是,如果数据库更新中途出现问题,则无法回滚所有更改。

【讨论】:

    【解决方案3】:

    什么/谁创建了 SQL 脚本?通过事务或语句(取决于文件的结构)获取创建文件以将脚本拆分为逻辑块的任何内容。如果源无法做到这一点,则编写一个脚本以逻辑拆分文件。

    【讨论】:

      【解决方案4】:

      如果它是那么大,脚本要么太复杂,要么重复。在任何一种情况下,正如其他人所建议的那样,唯一明智的做法是将其分解为可管理的块。

      这是一次性练习还是常规活动?

      【讨论】:

        【解决方案5】:

        在脚本有一个巨大的 XML 字符串用于 OpenXML 之前,我遇到过这个问题。实际的 SQL 相当小,更新了表中的一些值。

        我最终将数据(以块的形式)插入到临时表中,直到存储了 XML 中的所有信息。然后我运行了我的更新语句。

        在发布更多数据后添加:

        您可能希望在工具中选择大块并让 SQL 数据比较以块的形式生成脚本。这样你就可以得到交易。您只需突出显示一个范围并点击空格键即可选择较大的部分。

        【讨论】:

          【解决方案6】:

          1-800-redgate-support.....

          或

          • 将事务脚本分解为更小的文件
          • 在单用户模式下设置数据库
          • 数据库完整备份
          • 运行每个较小的脚本文件;如果失败:恢复备份,修复脚本,重试
          • 退出单用户模式,全部完成

          【讨论】:

            【解决方案7】:

            据我了解,SSMS 是 32 位的,因此它无法加载超过 1.5-2 GB 的脚本。您可以在 SQLCMD.exe 中运行脚本,但是由于事务大小,您可能会遇到问题——SqlCmd 会将整个事务保存在内存中。因此,您可以在 SQL 数据比较中执行的操作是进入选项并使用“拆分事务”,这可能会有所帮助。

            SQL 数据比较也会对 BLOB 进行部分更新,这将解决“巨大的 BLOB”问题。

            这当然是基于最新版本的数据比较。某些版本可能没有这些功能。

            另一种选择可能是使用 SQL Compare 将架构脚本创建到文件夹,然后使用 SDC 将数据同步到该文件夹​​。然后,每个表都有一个文件,而不是一个庞大的文件。

            希望这会有所帮助。

            【讨论】:

              【解决方案8】:

              使用sqlcmd 命令

              例子:

              sqlcmd  -S myServer\instanceName -i C:\myScript.sql
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-04-10
                • 2012-01-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-21
                • 1970-01-01
                相关资源
                最近更新 更多