Backup-SQLDatabase.ps1

По мотивам вопроса на форуме скриптик для бекапа SQL базы в файл. Можно использовать как шаблон для работы с SQL🙂

Backup-SQLDatabase.ps1
# Определяем параметры скрипта param ($Server, $Base, $Path) # Создаем SQL запрос подставляя параметры в нужные места. Можно сделать многострочным. $Query = "BACKUP DATABASE [$Base] TO DISK = '$Path' WITH INIT" # Подключаемся к SQL серверу используя текущую учетку $SQLConnection = new-object System.Data.SqlClient.SqlConnection("Data Source=$Server;Integrated Security=SSPI") # Открываем соединение $SQLConnection.Open() # Создаем SQL команду с помощью объектов запроса и соединения $SQLCommand = New-Object System.Data.SqlClient.SqlCommand($Query, $SQLConnection) # Выполняем.... $SQLCommand.ExecuteScalar() # Закрываем соединение $SQLConnection.Close()

Используем:

PS C:\PowerShell> .\Backup-SqlDatabase.ps1 -Server "server1" -Base "SUSDB" -Path "f:\testbackup.bak"

Вот и всё🙂

PS: путь к файлу указывается относительно сервера.

Опубликовано в PowerShell. 14 комментариев »

комментариев 14 to “Backup-SQLDatabase.ps1”

  1. Serg_IV Says:

    Спасибо за пример скрипта.
    Сразу вопросики. Как SQL запрос разбить на несколько строк?
    Как считать результаты выполнения запроса?

  2. Xaegr Says:

    2 Serg_IV: Спасибо за вопросы!
    1. Очень просто🙂
    $Query = «BACKUP DATABASE
    [$Base]
    TO
    DISK = ‘$Path’
    WITH
    INIT»

    2. сегодня выложу пример как раз с запросом

  3. Serg_IV Says:

    Пытаюсь через PS восстановить SQL базу данных, результате вылетаю с ошибкой
    Exception calling «ExecuteScalar» with «0» argument(s): «Истекло время ожидания. Время ожидания истекло до завершения о
    перации или сервер не отвечает.»
    At D:\scripts\restoreSQLdbinagro.PS1:39 char:26
    + $SQLCommand.ExecuteScalar( <<<< )

    Хотя тот же sql запрос в квери аналайзере выполняется. Более простые запросы из PS скрипта работают. Похоже просто по таймауту валится. Как выйти из ситуации?

  4. Xaegr Says:

    2 Serg_IV:
    Попробуйте сделать $SQLCommand.ExecuteNonQuery()

  5. Serg_IV Says:

    А чем отличается SQLCommand.ExecuteNonQuery()
    от SQLCommand.ExecuteScalar() ?

  6. Xaegr Says:

    2 Serg_IV: NonQuery — без возврата значения, Scalar — одно значение.

    Вот так можно посмотреть какие еще есть:

    $SQLCommand | Get-Member execute*

    ЗЫ: Я в About’е указал емейл свой, думаю так будет проще общаться🙂

  7. Serg_IV Says:

    И еще вопрос не совсем по теме в PowerShell Community Extensions есть командлеты для архивации в zip, но я не совсем понял как архив потом разархивировать

  8. Xaegr Says:

    [PS C:\Root] gcm *zip*

    CommandType Name
    ———— —-
    Application unzip.exe
    Cmdlet Write-BZip2
    Cmdlet Write-GZip
    Cmdlet Write-Zip

    Командлетов в PSCX для этого пока не готово🙂 .exe брал тут — http://www.info-zip.org/

  9. Grigory Says:

    А кто-нибудь знает, как указать, чтобы при backup-е, если такой файл уже существует, не перезаписывать его, а отвалиться с ошибкой?

  10. Xaegr Says:

    2 Grigory: Как то так:
    If ( -not (Test-Path $Path))
    {
    $SQLCommand.ExecuteScalar()
    }

  11. OlegKrikun Says:

    при работе ExecuteNonQuery или ExecuteScalar

    выскакивает следущее:
    Exception calling «ExecuteNonQuery» with «0» argument(s): «Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    BACKUP DATABASE is terminating abnormally.»
    At :line:44 char:27
    + $SQLCommand.ExecuteNonQuery <<<< ()

    при этом на маленькой базе (около 100 метров) всё ок…
    с базой в 1гиг, то ок, то не ок…
    с базой больше 2г (~40г) всегда ошибка…

    ошибка выскакивает секунд через 20 после начала выполнения скрипта…

    подозреваю что где то надо таймуат задать, а где не знаю =(((

  12. OlegKrikun Says:

    Нашол что есть параметр

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

    а вот как его задать в PS не знаю =) подскажите, если не сложно…

  13. Xaegr Says:

    2 OlegKrikun: Вам уже на форумах TechNet ответили (не забудьте кстати пометить как ответ🙂 ), надо задать объекту SqlCommand свойство CommandTimeout, добавив после строки
    $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($Query, $SQLConnection)
    следующую строчку:
    $sqlCommand.CommandTimeout = времявсекундах


Обсуждение закрыто.

%d такие блоггеры, как: