【问题标题】:Script hangs after query that takes long time to execute执行需要很长时间的查询后脚本挂起
【发布时间】:2017-12-08 18:25:45
【问题描述】:

PowerShell 中的脚本在执行 MySQL SELECT 查询后挂起,在某些情况下执行时间超过 10 分钟。

$query = "SELECT S.DESCRIPTION, date_format(N.TIMESTAMP, '%H'), count(*)
    FROM NOTIFICATIONS N, SENDING_TYPE S
    WHERE N.ID_SENDING_TYPE = S.ID_SENDING_TYPE
    AND N.TIMESTAMP > date_format ('"+$fecha+"', '%Y%m%d')
    GROUP BY S.DESCRIPTION, date_format(N.TIMESTAMP, '%H')"

示例 - $fecha="20170630"

我用我的函数执行查询(这里是 PowerShell 挂起的地方)

$resultado = Get-QueryMysql -Servidor $MySQLHost -Port $port -UserName $MySQLAdminUserName -Password $MySQLAdminPassword -DataBase $MySQLDatabase -Query $query

这是Get-QueryMysql的函数:

function Get-QueryMysql {
    [CmdletBinding()]
    [Alias()]
    [OutputType([int])]
    Param(
        # Servidor Mysql
        [Parameter(Mandatory=$true)]
        [String]$Servidor,

        # Puerto Oracle
        [Parameter(Mandatory=$true)]
        [String]$Port,

        # ServiceName
        [Parameter(Mandatory=$true)]
        [String]$DataBase,

        # Usuario
        [Parameter(Mandatory=$true)]
        [String]$UserName,

        # Password
        [Parameter(Mandatory=$true)]
        [String]$Password,

        # Query
        [Parameter(Mandatory=$true)]
        [String]$Query,

        # If Allow zero datetime
        [Parameter(Mandatory=$false)]
        [switch]$AllowZeroDateTime,

        # Reintentos
        # Query
        [Parameter(Mandatory=$false)]
        [int]$Reintentos=10,

        [switch]$AntiguoMysql
    )

    Begin {
        # Load the ODP assembly
        if ($AntiguoMysql.IsPresent) {
            Add-Type -Path C:\TRABAJO\REPORTES\modules\MySQL\mysql.data.dll -IgnoreWarnings
        } else {
            $null = [System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
        }
    }

    Process {
        # Cadena de conexion
        $ConnectionString = "server=" + $Servidor + ";port=$port;uid=" + $UserName + ";pwd=" + $Password + ";database=" + $DataBase

        if ($AllowZeroDateTime.IsPresent) {
            $ConnectionString = "server=" + $Servidor + ";port=$port;uid=" + $UserName + ";pwd=" + $Password + ";database="+$DataBase+";Allow Zero Datetime=True"
        }

        $cont = 0
        for ($i=0; $i-lt $Reintentos; $i++) {
            $MysqlConnection = New-Object MySql.Data.MySqlClient.MySqlConnection
            $MysqlConnection.ConnectionString = $ConnectionString
            $MysqlConnection.Open()

            $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $MysqlConnection)
            $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
            $DataSet = New-Object System.Data.DataSet
            $RecordCount = $dataAdapter.Fill($DataSet, "data")

            if ($DataSet) {
                break;
            }
        }
        if (!$dataSet) {
            Write-Host "ERROR: Conectando a la BBDD"
            return $null
        }

        # Datos obtenidos
        return $DataSet.Tables[0]
    }

    End {
        # Cerrando Conexiones
        if ($MysqlConnection) {
            $MysqlConnection.Close()
            $MysqlConnection.Dispose()
        }
    }
}

查询是一个按时间戳字段过滤的 SELECT。我试图改变表的结构,但我在生产环境中的要求被拒绝了。所以我需要让我的脚本正常工作,我只遇到需要很长时间的查询问题。

我尝试使用脚本块命令,但它不起作用。

当进程执行时,cpu 处于 0.5% 和 20 mb 的内存中(没有增量)。

当我从 DBMS (Navicat) 执行查询时,它需要 10 分钟,在某些情况下甚至更多。我用SHOW PROCESSLIST检查了MySQL数据库,几分钟后脚本执行的查询成功完成,但PowerShell脚本挂起。


执行以下行后脚本挂起:

$RecordCount = $dataAdapter.Fill($dataSet, "data")

加载另一个连接器后:

[void][system.reflection.Assembly]::LoadFrom("C:\modules\MySQL\6.9.8\mysql.data.dll")

脚本没有挂起,但现在发生错误异常:

Exception "Fill" arguments "2": "Fatal error encountered during command execution."
+             $RecordCount = $dataAdapter.Fill($dataSet, "data")
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : MySqlException

查看数据库中的超时变量,设置为8小时:

interactive_timeout=28800
wait_timeout=28800

SHOW PROCESSLIST 命令显示连接处于Sending Data 状态。

错误异常仅在查询超过 1 分钟或更长时间时发生。

【问题讨论】:

    标签: mysql powershell


    【解决方案1】:
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2019-12-29
    • 2021-12-25
    相关资源
    最近更新 更多