我使用的是EF 6.1.1,我的数据库有300万条记录,迁移必须改变decimal
类型列的精度。迁移超时窗口设置为最大值CommandTimeout = Int32.MaxValue;
我在Azure SQL Server中测试了这个场景,在尝试了大约90分钟后,它最终出现了异常,但没有在数据库上进行迁移。
异常详情:
由于过多的事务日志空间使用,会话已终止。尝试在单个事务中修改较少的行。
我的问题是:
在巨大的数据库上花费更多时间迁移此类型是否是预期的行为? (因为在更改精度之后,它必须转换现有值并将其保存回来,并且必须在300万条记录上重复)
如何解决这个问题?我不认为我们可以在交易块中进行迁移。
答案 0 :(得分:2)
您收到此错误是因为您的事务日志空间不足。您的事务日志可能已填满,因为您在一个事务中执行此操作。根据表中的列数,事务日志可占用3,000,000条记录的大量磁盘空间。如果可能,最简单的解决方案是临时为事务日志分配更多磁盘空间。或者,您可以考虑批量迁移,但第2点表明这对您来说不是一个可接受的解决方案。
答案 1 :(得分:2)
如果您使用的是SQL Azure(服务器名称如* .database.windows.net),则v11服务器上的事务日志限制为2 GB。如果使用较新的v12版本的SQL Azure,则事务日志限制非常大。
如果您使用v11,我建议您尝试使用v12,如果您使用的是v12,则必须考虑批准您的迁移。
答案 2 :(得分:0)
我发现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