【问题标题】:Entity Framework: Automatic migration failed on huge DB实体框架:大型数据库上的自动迁移失败
【发布时间】:2015-09-02 13:35:39
【问题描述】:

我使用的是 EF 6.1.1,我的数据库有 300 万条记录,迁移必须更改 decimal 类型的列的精度。并且迁移超时窗口设置为最大值,CommandTimeout = Int32.MaxValue;

我在 Azure SQL Server 中测试了这个场景,在尝试了大约 90 分钟后,它以异常结束,但没有在数据库上完成迁移。

异常详情:

由于事务日志空间使用过多,会话已终止。尝试在单个事务中修改更少的行。

我的问题是:

  1. 在大型数据库上迁移这种类型需要更多时间是预期的行为吗? (因为改变精度后必须将现有值转换并保存回来,并且必须在300万条记录上重复)

  2. 如何解决这个问题?我不认为我们可以在事务块中进行迁移。

【问题讨论】:

    标签: c# entity-framework entity-framework-6 azure-sql-database database-migration


    【解决方案1】:

    您收到此错误是因为您的事务日志空间不足。您的事务日志可能会填满,因为您在一个事务中执行此操作。根据表中的列数,事务日志可能会为 3,000,000 条记录占用相当大的磁盘空间。如果可能,最简单的解决方案是临时为您的事务日志分配更多磁盘空间。或者,您可以考虑批量迁移,尽管第 2 点表明这不是您可以接受的解决方案。

    【讨论】:

      【解决方案2】:

      如果您使用的是 SQL Azure(服务器名称如 *.database.windows.net),则 v11 服务器上的事务日志限制为 2 GB。如果您使用较新的 v12 版本的 SQL Azure,则事务日志限制非常大。

      如果您在 v11 上,我建议您尝试 v12,如果您已经在 v12 上,则必须尽可能考虑批量迁移。

      【讨论】:

        【解决方案3】:

        我发现 DbMigration.Sql(my_sql, true) 方法可以帮助我避免将所有命令放入一个事务中。 (https://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigration.sql(v=vs.113).aspx)

        所以,我可以控制事务的大小(事务涉及的记录数)。

        my_sql 可以有自己的BEGIN TRAN/COMMIT

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-08
          • 2018-11-17
          • 2013-04-02
          • 1970-01-01
          • 2012-10-14
          • 2021-08-25
          • 1970-01-01
          相关资源
          最近更新 更多