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