我有一个 SIMPLE 恢复模型的数据库,有 10GB 可用空间。
我试图通过 SSIS 批量加载加载的文件是 1GB。
该表是空的(在每次加载之前被截断),是一个堆并且没有非聚集索引。它是一个 varchar(255) 字段表。
运行批量插入任务时,我可以看到数据库大小从 2GB 增长到 12GB(最大可用空间),空间不足并返回以下消息:
[批量插入任务] 错误:发生错误并显示以下错误消息:“无法为数据库‘DBNAME’中的对象‘dbo.tablename’分配空间,因为‘PRIMARY’文件组已满。通过删除不需要的文件来创建磁盘空间,删除文件组中的对象,向文件组添加其他文件,或为文件组中的现有文件设置自动增长。”。
首先,我认为因为我处于 SIMPLE 恢复模式,所以没有记录批量加载。我知道这是当表中有数据和聚集索引时,但这里都不是这种情况。我假设批量插入任务包含在其中,因为它应该使用 BCP。我错了吗?
其次,一个 1GB 的文本文件会在 SQL Server varchar 字段中产生 10GB,这似乎很奇怪。这看起来很奇怪。数据没有被转换,它被批量加载到一个表中。为什么会长这么大?
问题是您只是用完了磁盘空间并且物理文件无法增长以完成事务,或者您对 SQL 文件增长设置有限制并且物理文件无法增长更多以完成事务(无论最大空间available 的意思是准确的,例如根据设置或磁盘容量)。
根据下面的站点和引用的文本,它确实声明最小日志记录比完整日志记录更有效,但它没有声明在恢复模式下根本不会发生任何日志记录。
SIMPLE
因此,这意味着当数据库处于恢复模式时仍然会发生 SQL 事务日志记录,但
SIMPLE
与恢复模式相比,它的日志记录最少FULL
。似乎解释是您承诺的交易规模与
BULK INSERT
操作是巨大的。只需将您在 SSIS 中的逻辑或您在更小尺寸的包中执行 TSQL 的提交\批处理大小参数。尝试使用 100、1000、10000、100000 等进行测试,看看什么能给您最好的结果并防止问题发生。如果事务较小,一旦提交的事务在
SIMPLE
恢复模式下提交,则提交事务的日志空间可以被后续BULK INSERT
(或其他)事务重用。其他资源
(这些文章似乎对 SSIS 包区域中的潜在参数进行了一些引用,以便为较小的事务等进行设置。标题或步骤可能针对不同的最终目标,但其中可能适用于您可能需要的内容更改您的 SSIS 逻辑以纠正您的问题,因此这些可能值得简单阅读。)