Объединение select c разных серверов - MySQL
Формулировка задачи:
Добрый день.
Есть задача: с достаточно большого количества(порядка 120) серверов, необходимо сделать некий select sum и баз данных mysql и затем просуммировать полученные результаты. Пока, что я честно говоря немного приуныл, потому что ни на шаг не придвинулся к решению. Самый первый вариант был powershell мне в помощь. Подскажите, возможно ли это вообще, и если да то натолкните на решение?
Решение задачи: «Объединение select c разных серверов»
textual
Листинг программы
Function Run-MySQLQuery {
Param(
[Parameter(
Mandatory = $true,
ParameterSetName = '',
ValueFromPipeline = $true)]
[string]$query,
[Parameter(
Mandatory = $true,
ParameterSetName = '',
ValueFromPipeline = $true)]
[string]$connectionString
)
Begin {
Write-Verbose "Starting Begin Section"
}
Process {
Write-Verbose "Starting Process Section"
try {
# Создаем коннект к базе
Write-Verbose "Create Database Connection"
# Можно так же использовать прямое обращение к dll
#$mySQLDataDLL="C:\scripts\mysql\MySQL.Data.dll"
#[void][system.reflection.Assembly]::LoadFrom($mySQLDataDLL)
[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$connection.ConnectionString = $ConnectionString
Write-Verbose "Open Database Connection"
$connection.Open()
# Выполнение SQL запросов
Write-Verbose "Run MySQL Querys"
$command = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $connection)
$dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($command)
$dataSet = New-Object System.Data.DataSet
$recordCount = $dataAdapter.Fill($dataSet, "data")
$dataSet.Tables["data"] | Format-Table -HideTableHeaders
}
catch {
Write-Host "Could not run MySQL Query" $Error[0]
}
Finally {
Write-Verbose "Close Connection"
$connection.Close()
}
}
End {
Write-Verbose "Starting End Section"
}
}
$poss = "localhost1", "localhost2",
ForEach ($pos in $poss)
{
$SrcServer = "Server=$pos;Uid=root;Pwd=pass;database=test;CharSet=utf8"
$SQLQuery = "SELECT *;
"
$res = run-MySQLQuery -ConnectionString $SrcServer -Query $SQLQuery | Out-String
$DestServer = "Server=localhost;Uid=root;Pwd=pass;database=report;CharSet=utf8"
$SQLInsert = "INSERT INTO report.test (name, amount) values ('$pos', '$res')"
run-MySQLQuery -ConnectionString $DestServer -Query $SQLInsert
}
Объяснение кода листинга программы
- Функция
Run-MySQLQueryпринимает два параметра:$queryи$connectionString. - В блоке
Beginвыводится сообщение о начале выполнения функции. - В блоке
Processвыполняется SQL запрос, переданный в качестве параметра$query, с использованием подключения к базе данных, указанного в параметре$connectionString. - Запросы выполняются с помощью объектов
MySql.Data.MySqlClient.MySqlCommand,MySql.Data.MySqlClient.MySqlDataAdapterиSystem.Data.DataSet. - Результаты запроса выводятся с помощью
Format-Table -HideTableHeaders. - В блоке
catchвыводится сообщение об ошибке, если запрос не удалось выполнить. - В блоке
Finallyзакрывается подключение к базе данных. - Функция
Mainсоздает массив серверов для тестирования в переменной$poss. - Для каждого сервера в массиве выполняется запрос с помощью функции
Run-MySQLQuery. - Результаты запроса сохраняются в переменную
$res. - Затем выполняется запрос на вставку данных в таблицу
report.testс использованием переменных$SrcServerи$res. - Запрос на вставку данных выполняется с помощью функции
Run-MySQLQuery.