Consultas de puerta de enlace bloqueadas por cambio de esquema de base de datos

Un usuario Pregunto ✅


0


Votar

Uso Data Gateway local para acceder a las bases de datos de SQL Server desde Azure Logic Apps. Específicamente, ejecutamos procedimientos almacenados. De vez en cuando veo tiempos de espera en las llamadas a API Gateway, como:

{
  "error": {
    "code": 504,
    "source": "logic-apis-westeurope.azure-apim.net",
    "clientRequestId": "895418e7-715d-431c-bdee-3d46ddeca3d8",
    "message": "BadGateway",
    "innerError": {
      "status": 504,
      "message": "The operation failed due to an explicit cancellation. Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled.rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass7_0`1.<<GetNextResponseAsync>b__0>d.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass11_0.<<ExecuteBlockOperationAsync>b__0>d.MoveNext()rn     inner exception: The operation failed due to an explicit cancellation. Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled.rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass7_0`1.<<GetNextResponseAsync>b__0>d.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass11_0.<<ExecuteBlockOperationAsync>b__0>d.MoveNext()rn         inner exception: A task was canceled.rnclientRequestId: 895418e7-715d-431c-bdee-3d46ddeca3d8",
      "error": {
        "message": "The operation failed due to an explicit cancellation. Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled.rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass7_0`1.<<GetNextResponseAsync>b__0>d.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass11_0.<<ExecuteBlockOperationAsync>b__0>d.MoveNext()rn     inner exception: The operation failed due to an explicit cancellation. Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled.rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass7_0`1.<<GetNextResponseAsync>b__0>d.MoveNext()rn--- End of stack trace from previous location where exception was thrown ---rn   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()rn   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn   at Microsoft.PowerBI.DataMovement.Pipeline.Dataflow.TDFHelpers.<>c__DisplayClass11_0.<<ExecuteBlockOperationAsync>b__0>d.MoveNext()rn         inner exception: A task was canceled."
      },
      "source": "sql-we.azconn-we.p.azurewebsites.net"
    }
  }
}

En el nivel de la base de datos, parece que On-Premise Gateway está consultando information_schema como:

select t.[TABLE_CATALOG], t.[TABLE_SCHEMA], t.[TABLE_NAME], t.[TABLE_TYPE] [...] from [INFORMATION_SCHEMA].[TABLES] t join [...]

Y esta consulta está bloqueada.

Por lo que he probado, es realmente fácil bloquear dicha consulta, solo necesita tener una transacción duradera con DML. Lo probé en nuestro entorno de prueba, y mantener abierta la transacción DML hace que todas las consultas que pasan por On-Premise Gateway duren al menos 1 minuto. Por lo que he notado, tener dicha transacción en una base de datos también bloqueará la transacción en otra base de datos no relacionada.

Hasta donde lo encontré aquí: https://community.powerbi.com/t5/Issues/Aha-mySQL-timeout-due-to-information-schema-on-app-powerbi-c…898

podria intentar reduciendo el tiempo de espera a un valor muy bajo, por lo que no afectará significativamente el tiempo de ejecución (como 5 segundos), para reducir el impacto que tiene en las consultas reales, pero lo que preferiría es que estas consultas no afecten el tiempo de ejecución de otras consultas en absoluto, ya que son irrelevantes.

Estado: Nuevo

2 comentarios (2 nuevos)

@wiktorn

Cuando utilice el conector, intente especifique la instrucción SQL en las opciones Avanzadas en lugar de utilizar el cuadro de diálogo Navegador.

wiktorn

No estoy seguro de lo que estás hablando. Estamos creando LogicApps utilizando plantillas ARM. El paso del flujo de trabajo se ve así:

                        "sqlquery1": {
                            "runAfter": {},
                            "type": "ApiConnection",
                            "inputs": {
                                "body": {
                                    "username": "@triggerBody()?['username']",
                                    "begindate": "@triggerBody()?['start']",
                                    "enddate": "@triggerBody()?['end']"
                                },
                                "host": {
                                    "connection": {
                                        "name": "/subscriptions/****-***/resourceGroups/***-***/providers/Microsoft.Web/connections/APICONNECTION-NAME"
                                    }
                                },
                                "method": "post",
                                "path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('default'))},@{encodeURIComponent(encodeURIComponent('default'))}/procedures/@{encodeURIComponent(encodeURIComponent('[dbo].[procedure_name]'))}"
                            }
                        },

El problema es cuando estamos ejecutando LogicApp, no cuando estamos creando.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *