Резервное копирование SQL DB с помощью графического интерфейса PowerShell — Учебное пособие


На

В моей компании есть нетехнические пользователи, которые должны инициировать резервное копирование SQL, по крайней мере, раз в месяц во время критического бизнес-процесса печати чеков на миллионы долларов. Мы должны создавать резервную копию до начала процесса, а затем сразу после него.

Мой предшественник подготовил и научил персонал использовать SQL Server Management Studio (SSMS) и выполнять план обслуживания, который выполнял резервное копирование. Этот процесс работал, однако 🚩 меня всегда беспокоило то, что нетехнический персонал получал доступ к SSMS там, где можно было нанести большой вред производственной базе данных. Хотя вероятность того, что это произойдет, была невелика, риск все же существовал, и доступ к SSMS должен быть только у обученных администраторов баз данных.

Идея проекта

Я хотел создать быстрый и простой способ для персонала создавать резервные копии SQL без необходимости доступа к SSMS. Существует множество вариантов, таких как инструменты сторонних производителей, SQL-команды PowerShell, сценарии командной строки и т.д. Цель заключалась в том, чтобы сотрудники имели возможность создавать резервные копии одним щелчком мыши и могли получить дату/время последней резервной копии.

Сначала я начал писать сценарий PowerShell, который использовал команды вызова для выполнения предопределенного плана обслуживания. Это работало и создавало резервную копию, или, по крайней мере, запускало работу. Проблема заключалась в том, что пользователь не получал ни полезных сообщений об ошибках, ни каких-либо указаний на то, что работа действительно завершена, ни возможности отслеживать прогресс, поскольку он не мог продолжать свою работу до завершения резервного копирования.

DBATools

Проведя небольшое исследование, я наткнулся на DBATools (https://dbatools.io/), который предлагает модуль PowerShell со встроенными командами для создания резервной копии, а также обеспечивает прогресс и обратную связь с пользователем.

Графический интерфейс PowerShell

По моему опыту, конечным пользователям неудобно запускать сценарии в PowerShell или Comment Prompt, каждый раз, когда они видят открытое окно, они начинают нервничать. Конечные пользователи предпочитают графический интерфейс пользователя с легко нажимаемыми опциями для простого выполнения процесса.

Графический интерфейс PowerShell довольно мощный, напоминает создание приложений оконных форм в C#. Вы можете добавлять кнопки, метки, индикаторы выполнения, выпадающие меню, комбинированные окна и многое другое.

Решение

PowerShell GUI + DBATools = потрясающий пользовательский опыт!

Я смог объединить возможности графического интерфейса PowerShell для добавления меток и кнопок в диалоговую форму, которая позволяет пользователям создавать простые резервные копии баз данных в 1 клик, а также кнопку для просмотра даты/времени последнего резервного копирования в 1 клик.

Учебник

Этот проект потребует административного доступа в вашей локальной системе и возможности установки модулей PowerShell, по крайней мере, в текущей пользовательской области. Я рекомендую вам набирать все эти команды вместо Copy and Paste, так как ваша память будет намного лучше, если вы привыкнете набирать эти команды.

Предположения

  • Вы немного знакомы с PowerShell
  • У вас есть доступ к SQL Server Management Studio
  • Ваша учетная запись Windows имеет доступ к выполнению команд SQL Server Management Studio
  • У вас есть административные привилегии на рабочей станции для установки модулей PowerShell.

Установка DBATools

Мы будем устанавливать DBATools.io с помощью PowerShell Gallery и простой команды install-module. На сайте DBATools.io представлены дополнительные инструкции по установке, если вам понадобится альтернативная установка или дополнительная информация.

Однократная установка из административного окна PowerShell:

Install-Module dbatools
Войдите в полноэкранный режим Выйти из полноэкранного режима
  • Вам нужно будет разрешить провайдер NuGet, если вы впервые устанавливаете модуль PowerShell.
  • Вам также нужно будет указать, что вы доверяете репозиторию.

Проверьте, успешно ли прошла установка:

Чтобы проверить успешность установки, попробуем импортировать модуль. Если установка прошла успешно, приглашение должно просто вернуться на новую строку, если установка не прошла успешно, вы получите сообщение об ошибке, и вам, возможно, придется повторить шаги или попробовать другой метод.

Однократная установка:

Import-Module dbatools
Вход в полноэкранный режим Выход из полноэкранного режима

PowerShell ISE

В этом руководстве мы будем использовать PowerShell ISE, который позволяет просматривать и тестировать код в одном окне.
Примечание: Если у вас нет панели сценариев вверху, вы можете нажать ‘CTRL + R’ в Windows или перейти к View -> Script Pane вверху.

Построение базовой формы

Мы собираемся построить нашу базовую форму и убедиться, что мы можем получить информацию для отображения.

Введите следующую информацию в Script Pane, которая является верхней частью окна PowerShell ISE с номерами строк. Это даст нам пустое квадратное окно размером 300px на 300px, которое может автоматически изменять размер при необходимости.

Последняя строка является самой важной, если вы не укажете форме появиться $main_form.ShowDialog(), то при запуске скрипта ничего не произойдет. Я оставил эту строку внизу, так как она всегда будет последней строкой кода во всем скрипте.

#Setup Form
Add-Type -assembly System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='DB Backup Program'
$main_form.Width = 300
$main_form.Height = 300
$main_form.AutoSize = $true

#### Show Dialog
$main_form.ShowDialog()
Вход в полноэкранный режим Выход из полноэкранного режима

Добавление ярлыков

Мы добавим 4 ярлыка

  1. Get Backup History — для нашей кнопки View Last Backup (Просмотр последней резервной копии)
  2. Заголовок последней резервной копии — будет отображаться рядом с ярлыком последней резервной копии, который будет обновляться скриптом
  3. Last Backup — будет показывать «неизвестно» или дату/время последнего резервного копирования.
  4. Run Backup — для нашей кнопки Start
  5. Error — для отображения любых ошибок на экране для пользователя.

При добавлении меток вы должны определить переменную для метки, дать ей текст, указать местоположение на графическом интерфейсе, а затем указать форме добавить элемент управления.

Добавьте следующие метки в панель сценариев, ниже $main_form.AutoSize = $true и выше $main_form.ShowDialog()

### ... main form content

######## Add content to form
## Last Backup Label for the View Last Backup button
$LastBackup_Label = New-Object System.Windows.Forms.Label
$LastBackup_Label.Text =  "Get Backup History"
$LastBackup_Label.Location = New-Object System.Drawing.Point(10, 20)
$main_form.Controls.Add($LastBackup_Label)

## Last Backup Title Text Label
$LastBackupTest_LabelTitle = New-Object System.Windows.Forms.Label
$LastBackupTest_LabelTitle.Text =  "Last Backup:"
$LastBackupTest_LabelTitle.Location = New-Object System.Drawing.Point(10, 50)
$main_form.Controls.Add($LastBackupTest_LabelTitle)

## Last Backup Text Label - will be updated by this program to show last date/time of backup
$LastBackupTest_Label = New-Object System.Windows.Forms.Label
$LastBackupTest_Label.Text =  "Unknown"
$LastBackupTest_Label.Location = New-Object System.Drawing.Point(120, 50)
$main_form.Controls.Add($LastBackupTest_Label)

## Error Label
$Error_Label = New-Object System.Windows.Forms.Label
$Error_Label.Text =  ""
$Error_Label.Location = New-Object System.Drawing.Point(10, 120)
$main_form.Controls.Add($Error_Label)

## DB Backup Label for Start button
$Label = New-Object System.Windows.Forms.Label
$Label.Text = "Run Backup"
$Label.Location  = New-Object System.Drawing.Point(10,80)
$Label.AutoSize = $true
$main_form.Controls.Add($Label)

###.... bottom
#### Show Dialog
$main_form.ShowDialog()
Вход в полноэкранный режим Выход из полноэкранного режима

Добавление кнопок

Мы собираемся добавить 2 кнопки в графический интерфейс. Это будет кнопка для получения последней резервной копии и кнопка для запуска резервного копирования. Я объясню, что будет делать каждая кнопка. Каждая кнопка должна быть определена как переменная и иметь текст, размер и местоположение. Я также буду определять цвет фона, хотя это необязательно.

Введите следующее в панели сценариев ниже меток, но выше $main_form.ShowDialog()

### .... labels
# Last Backup Button
$LastBackupButton = New-Object System.Windows.Forms.Button
$LastBackupButton.Size = New-Object System.Drawing.Size(120,23)
$LastBackupButton.Location = New-Object System.Drawing.Size(200,20)
$LastBackupButton.Text = "Get Last Backup"
$LastBackupButton.BackColor = 'LIGHTBLUE'
$main_form.Controls.Add($LastBackupButton)

## Start Button
$StartButton = New-Object System.Windows.Forms.Button
$StartButton.Size = New-Object System.Drawing.Size(120,23)
$StartButton.Location = New-Object System.Drawing.Size(200,80)
$StartButton.Text = "START"
$StartButton.BackColor = 'GREEN'
$main_form.Controls.Add($StartButton)

#### Show Dialog
$main_form.ShowDialog()
Войти в полноэкранный режим Выйти из полноэкранного режима

Тестирование графического интерфейса

Давайте запустим скрипт, чтобы убедиться, что наше содержимое отображается правильно.

Добавление событий нажатия

Сейчас наши кнопки ничего не делают, потому что мы еще не сказали им, что делать. Давайте добавим функциональность кнопкам. Мы будем делать это отдельно, поскольку они выполняют разные функции.

добавление некоторых переменных

Давайте добавим некоторые переменные, которые мы будем использовать в следующих шагах. Эти значения будут разными для вашей настройки имени сервера и резервных баз данных. Введите их ниже кода кнопки, но выше ShowDialog.

## Variables
$db = Start-Job -ScriptBlock {Import-Module dbatools}
$server = 'SERVER NAME'
$databases = @('DB_1','DB1_Audit')
Войти в полноэкранный режим Выйти из полноэкранного режима

Действие кнопки Получить последнее резервное копирование

Эта кнопка будет состоять из события нажатия на кнопку, которое запустит функцию и в случае успеха вернет последнюю резервную копию. Нам нужно определить событие ‘Add-Click()’ с помощью блока try/catch/finally. Мы также сделаем визуальные изменения, такие как цвет кнопки, текст кнопки, чтобы указать конечному пользователю, что программа запущена.

 ## LastBackupButton Click Action Event - VIEW LAST BACKUP
$LastBackupButton.Add_Click( { 
try {

    ## We are going to indicate to the user the script is running by changing the button
    ## background color to yellow and the text to 'Processing...'. 
    $LastBackupButton.BackColor = 'YELLOW' 
    $LastBackupButton.Text = "Processing..." 
    # to get the update to show on the form we must tell the form application to update from the events
    [System.Windows.Forms.Application]::DoEvents()
    #Let's now run our getLastBackup function 
    getLastBackup
    }
    catch
    {
        #if an error happens we are going to let the user know
    $Error_Label.Text = "There was an error"
    [System.Windows.Forms.Application]::DoEvents()

    }
    finally {
        ### if the try block was successful then let's update the button back to normal so the user knows the program is done
    $LastBackupButton.Text = "View Last Backup"
    $LastBackupButton.BackColor = 'LIGHTBLUE' 
    [System.Windows.Forms.Application]::DoEvents()  
    }
} )

function getLastBackup {
    # we are going to update the label text by running the dbatools Get-DbaDbBackupHistory command on our databases
    # we only want the end date/time so we are going to extract just that information 
    $LastBackupTest_Label.text = Get-DbaDbBackupHistory -SqlInstance $server -Database $databases[0] -Last -DeviceType Disk | foreach {$_.End}
    # to get the label to update we must tell the form application to update from the text event
    [System.Windows.Forms.Application]::DoEvents()

}

###.... bottom
#### Show Dialog
$main_form.ShowDialog()
Вход в полноэкранный режим Выход из полноэкранного режима

Тестирование

Запустим скрипт и нажмем кнопку View Last Backup.

Примечание: Это будет работать только в том случае, если вы обновили переменные для вашей среды и ваша учетная запись пользователя имеет доступ к SQL, что выходит за рамки данного руководства.

Действие нажатия кнопки Start Backup

Теперь давайте реализуем действие Start Backup Click Action, которое будет использовать команду DBATools BackupDbaDatabase для инициирования резервного копирования. В данном руководстве резервная копия будет сохранена на локальном диске, однако рекомендуется, чтобы резервные копии SQL хранились не только на локальном сервере. Путь также должен существовать.

Start Backup обновит кнопку запуска, чтобы указать пользователю, что процесс запущен. Этот процесс может занять 5-10 минут или больше, поэтому мы хотим, чтобы пользователь подождал, пока он завершится. Это также вызовет функцию кнопки View Last Backup, чтобы обновить ярлык последней резервной копии с самой последней резервной копией, которая была только что выполнена.


## StartButton Click Action Event - START BACKUP
$StartButton.Add_Click( { 
try {
    ## Added to show end user that it's running by changing background
    ## to yellow and text to 'Running...' since this can take 5+ minutes
    $StartButton.BackColor = 'YELLOW' 
    $StartButton.Text = "Running..." 
    # tell form to update
    [System.Windows.Forms.Application]::DoEvents()
    # run startBackup function
    startBackup
}
catch {
    # If there is an error let's tell the user there was an error
    $Error_Label.Text = "error in application"
    [System.Windows.Forms.Application]::DoEvents()
}
finally {
    ## run getLastBackup function to update label with the backup that was just done
    getLastBackup

    ## set start button back to default 
    $StartButton.Text = "START"
    $StartButton.BackColor = 'GREEN'
    [System.Windows.Forms.Application]::DoEvents()
}
 } )

function startBackup {
ForEach($db in $databases){
                ## local variables so we can add date & time to backup file name
                $date = Get-Date -Format 'yyyyMMdd'
                $time = Get-Date -Format 'HHmmss'
                # set local path variable Note: this path must exist
                $path = 'E:SQLDBBackup' + $server + '' + $db + ''
                # set file name
                $fileName = $server + '_' + $db + '_FULL_' + $date + '_' + $time + '.bak'
                try {
                    Backup-DbaDatabase -SqlInstance $server -Database $db -Path $path -FilePath $fileName -CompressBackup -IgnoreFileChecks
                    }
                catch 
                {
                    # write output to console screen which will show behind GUI when running
                     Write-Host "Error: $($_.Exception.Message)"
                }
}
}

###.... bottom
#### Show Dialog
$main_form.ShowDialog()
Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

Это был довольно простой пример использования возможностей графического интерфейса PowerShell и DBATools для выполнения простого запроса последней резервной копии и резервной копии базы данных.

Содержание этого руководства было изменено по сравнению с производственной версией сценария, чтобы показать более простую версию. Производственная версия использует шифрование AES256 с помощью сертификата и хранит резервную копию на другом сервере. Она также имеет возможности очистки для удаления старых резервных копий после того, как они больше не нужны. Также была настроена дополнительная обработка ошибок, чтобы показывать результат ошибки в нижней части окна, а не просто указывать, что произошла ошибка. Я рекомендую вам изучить возможность добавления дополнительных функций, если вы используете что-то подобное в бизнесе.

Я на @buymeacoffee. Если вам нравится моя работа, вы можете купить мне тако и поделиться своими мыслями 🎉🌮

Оцените статью
devanswers.ru
Добавить комментарий