MySQL SELECTクエリの実行後にハングするPowerShellのスクリプトに問題があり、実行に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()
}
}
}
queryは、タイムスタンプフィールドでフィルタリングするSELECTです。私はテーブルの構造を変更しようとしましたが、本番環境での私の要求は否定されました。だから、私のスクリプトが動作するようにする必要があります。私は長い時間がかかるクエリには問題があります。
script-blockコマンドを試してみましたが、動作しません。
プロセスが実行されているとき、CPUは0.5%と20MBのRAM(インクリメントはありません)にあります。
私は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")
スクリプトがハングアップしませんが、今それが起こりますエラー例外:
データベース内のタイムアウト変数を見は、8時間settedさ:
interactive_timeout=28800
wait_timeout=28800
SHOW PROCESSLIST
コマンドは、接続がSending Data
状態であることを示しています。クエリが1分以上...引き継ぐとき
エラー例外は