数据库
首页 > 数据库> > c#-将SQL DB部署到Azure超时启用索引

c#-将SQL DB部署到Azure超时启用索引

作者:互联网

大家好,感谢您对此的关注.因此,我们有一个要在Azure中托管的项目,我们的SQL Server存储在一个弹性池中.我们拥有的数据库是从.NET框架的Code First迁移生成的;然后我们使用一些SQL导入脚本将数据加载到数据库中.

问题在于将数据库部署到Azure.我们已经尝试在开发机和sql服务器上使用SQL Server Management Studio.我们尝试使用将数据库部署到Microsoft SQL Azure将数据库推送到Azure,并尝试使用BACPAC直接连接到Azure和导入数据层应用程序. SQL Server 2014 12.0.4439.1是我们的服务器版本.

在部署过程中,一切似乎都进行得非常快,并且创建了架构,将数据加载到表中,但是在大多数处理时间内,它都挂在“启用索引”上,整个过程大约一个小时超时并失败.我收到3个错误;第一个是错误0;关于针对SQL Server 2014的数据库文件的一些非常神秘的问题,该文件具有与SQL azure v12的已知兼容性.另一个关于超时,带有一条通用消息,表明该进程已超时.最后的错误是评论

Could not import package.
Error SQL72016: Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.
Error SQL72045: Script execution error.  The executed script:

Bulk data is loaded

在进行了一些研究之后,我看到其他一些人抱怨说,如果使用了基本层,则在该时限内没有足够的DTU使该流程运行.我们将Standard 1层用于我们的数据库,并尝试将其升级到S2以进行导入过程作为测试.虽然事情似乎发生得更快,但我们有同样的问题.数据库是1.6演出,确实有2个大表,每行约有1磨;尽管我不认为这是一个太大的数据库,但该过程应该会失败.

解决方法:

这不是直接解决问题的方法,但是我在SSMS中测试大型数据库迁移时遇到了这种情况.扩展可用资源似乎有所帮助,但这意味着重新启动部署过程.

重建所有索引应该是迁移的最后一个操作,以便避免重做所有您可以自己执行的操作,例如:

DECLARE C CURSOR FAST_FORWARD FOR 
    SELECT so.name, si.name
    FROM sys.indexes si JOIN sys.objects so ON so.object_id = si.object_id 
    WHERE is_disabled = 1 
    ORDER BY CASE WHEN si.type_desc='CLUSTERED' THEN 0 ELSE 1 END, si.name; -- clustered first as disabled clustered index will stop others rebuilding
DECLARE @tbl NVARCHAR(MAX), @idx NVARCHAR(MAX), @start DATETIME, @sql NVARCHAR(MAX);

OPEN C;
FETCH NEXT FROM C INTO @tbl, @idx;
WHILE @@FETCH_STATUS = 0 BEGIN
    SET @sql = 'ALTER INDEX ['+@idx+'] ON ['+@tbl+'] REBUILD;';
    EXEC (@sql);
    FETCH NEXT FROM C INTO @tbl, @idx;
END
CLOSE C;
DEALLOCATE C;

我发现与重建有关的超时错误需要5分钟以上的时间.我没有研究是否可以在迁移过程中配置每个操作超时时间.

请注意,以上假设所有表都在dbo模式中,如果不是这种情况,则在游标定义中向sys.schemas添加一个联接,并使用它在表名之前添加适当的模式名称.

凯文(Kevin)在评论中建议此时可以禁用触发器,尽管在我遇到这种情况时并非如此.以防万一,在当前EXEC(@sql)之后添加以下内容;在上面的示例中:

    SET @sql = 'ALTER TABLE ['+@tbl+'] ENABLE TRIGGER ALL;';
    EXEC (@sql);

如果触发器已经处于活动状态,那么这实际上是一个NoOp,因此不会造成任何危害.请注意,如果尚未定义触发器,这将无济于事,但应在重建索引时进行,因为这是该过程中较早的模式构建的一部分.

标签:azure,azure-sql-database,c,net,database
来源: https://codeday.me/bug/20191118/2030902.html