Объединение 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д