Как я могу запланировать ежедневное резервное копирование с помощью SQL Server Express?

Я запускаю небольшое веб-приложение с сервером SQL Server Express (2005). Я могу создать резервную копию с помощью сценария SQL, однако я хотел бы запланировать это на ежедневной основе. В качестве дополнительной опции (должно быть) я хотел бы сохранить только последние резервные копии X (очевидно, из соображений экономии места) Любые указатели?

[править] Агент SQL-сервера недоступен в SQL-сервере Express ...


person edosoft    schedule 28.01.2009    source источник
comment
Вы можете просто сделать это с помощью SQLBackupAndFTP sqlbackupandftp.com.   -  person Alexandr Omelchenko    schedule 11.05.2017
comment
Вы можете проверить это, stackoverflow.com/a/29893738/1101112. Это командный файл для создания экспресс-резервной копии базы данных sql server и хранения последних 10 резервных копий (автоматическое удаление старых). Его следует использовать с планировщиком Windows, чтобы он периодически выполнялся автоматически.   -  person Supawat Pusavanno    schedule 09.05.2019


Ответы (6)


Вы не можете использовать агент SQL Server в SQL Server Express. Раньше я создавал SQL-скрипт, а затем запускал его как запланированную задачу каждый день. У вас могло быть несколько запланированных задач, которые соответствовали бы вашему расписанию / сроку хранения резервного копирования. В запланированной задаче я использую следующую команду:

"C: \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Binn \ SQLCMD.EXE" -i "c: \ path \ to \ sqlbackupScript.sql"

person Sam Cogan    schedule 28.01.2009
comment
Красиво, красиво и гладко. Ваше здоровье! - person Nick Haslam; 02.06.2010
comment
работает только если у вас есть такой доступ к серверу - person cregox; 03.08.2010
comment
Microsoft предоставила хороший сценарий и подробные инструкции для выполнения этой задачи. Главное, чего не хватает, - это очистки старых файлов резервных копий. support.microsoft.com/kb/2019698 - person pseudocoder; 12.12.2012

Эдуардо Молтени дал отличный ответ:

Использование запланированных задач Windows:

В пакетном файле

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S 
(local)\SQLExpress -i D:\dbbackups\SQLExpressBackups.sql

В SQLExpressBackups.sql

BACKUP DATABASE MyDataBase1 TO  DISK = N'D:\DBbackups\MyDataBase1.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase1 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

BACKUP DATABASE MyDataBase2 TO  DISK = N'D:\DBbackups\MyDataBase2.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase2 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO
person JohnB    schedule 10.05.2011
comment
в любом случае добавить метку времени к созданному файлу резервной копии, чтобы он не записывал в существующий файл? - person Zo Has; 18.07.2013
comment
Здорово! Кроме того, я должен был следовать этому, чтобы получить правильные разрешения для создания файла резервной копии: stackoverflow.com/questions/3960257/ - person audub; 07.02.2014
comment
Дэмиен ›если вы хотите иметь резервные копии на большее количество дней, замените параметр INIT на NOINIT. INIT означает, что файл резервной копии всегда перезаписывается с нуля. Вы должны использовать способ с меткой времени, как вы сказали, или использовать параметры NOINIT, которые добавляют резервную копию к существующему файлу. Рекомендуется использовать что-то вроде параметра RETAINDAYS, иначе файл резервной копии будет постоянно расти. В случае отметки времени вам придется решить ее самостоятельно. См. technet.microsoft.com/en-us/library/ms186865.aspx для получения дополнительной информации - person Michal Bernhard; 07.03.2014
comment
Не забудьте указать место для резервной копии в установочных папках SQL. Я получал: Ошибка операционной системы SQL Server 5: 5 (Доступ запрещен.) », Потому что я настроил свою резервную копию так, чтобы она выходила за пределы официальной папки установки SQL-сервера (учетная запись службы ядра СУБД SQL Server должна иметь разрешения на чтение / запись в новом папка). Или просмотрите это решение - person full_prog_full; 24.02.2016
comment
Для SQL Server 2014 Express SqlCmd.exe теперь находится по адресу: C: \ Program Files \ Microsoft SQL Server \ Client SDK \ ODBC \ 110 \ Tools \ Binn \ SQLCMD.EXE - person André Hauptfleisch; 23.11.2016

Просто используйте этот сценарий для динамического резервного копирования всех баз данных на сервере. Затем создайте командный файл согласно статье. Полезно создать два командных файла: один для полного резервного копирования, а другой - для резервного копирования различий. Затем создайте две задачи в планировщике задач: одну для полной и одну для сравнения.

-- // Copyright © Microsoft Corporation.  All Rights Reserved.
-- // This code released under the terms of the
-- // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
USE [master] 
GO 
/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 
-- Author: Microsoft 
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName 
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================

CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,
            @backupType CHAR(1),
            @backupLocation nvarchar(200) 
AS 

       SET NOCOUNT ON; 

            DECLARE @DBs TABLE
            (
                  ID int IDENTITY PRIMARY KEY,
                  DBNAME nvarchar(500)
            )

             -- Pick out only databases which are online in case ALL databases are chosen to be backed up
             -- If specific database is chosen to be backed up only pick that out from @DBs
            INSERT INTO @DBs (DBNAME)
            SELECT Name FROM master.sys.databases
            where state=0
            AND name=@DatabaseName
            OR @DatabaseName IS NULL
            ORDER BY Name

            -- Filter out databases which do not need to backed up
            IF @backupType='F'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
                  END
            ELSE IF @backupType='D'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE IF @backupType='L'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE
                  BEGIN
                  RETURN
                  END

            -- Declare variables
            DECLARE @BackupName varchar(100)
            DECLARE @BackupFile varchar(100)
            DECLARE @DBNAME varchar(300)
            DECLARE @sqlCommand NVARCHAR(1000) 
        DECLARE @dateTime NVARCHAR(20)
            DECLARE @Loop int                  

            -- Loop through the databases one by one
            SELECT @Loop = min(ID) FROM @DBs

      WHILE @Loop IS NOT NULL
      BEGIN

-- Database Names have to be in [dbname] format since some have - or _ in their name
      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'

-- Set the current date and time n yyyyhhmmss format
      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  

-- Create backup filename in path\filename.extension format for full,diff and log backups
      IF @backupType = 'F'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'D'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'L'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'

-- Provide the backup a name for storing in the media
      IF @backupType = 'F'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
      IF @backupType = 'D'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
      IF @backupType = 'L'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime

-- Generate the dynamic SQL command to be executed

       IF @backupType = 'F' 
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                  END
       IF @backupType = 'D'
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END
       IF @backupType = 'L' 
                  BEGIN
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END

-- Execute the generated SQL command
       EXEC(@sqlCommand)

-- Goto the next database
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop

END

А батник может выглядеть так:

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='F'"  >> c:\Dropbox\backup\DB\full.log 2>&1

и

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='D'"  >> c:\Dropbox\backup\DB\diff.log 2>&1

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

person Tomas Kubes    schedule 28.12.2014
comment
Работает как мечта! Спасибо за это! +1 - person Piotr Kula; 09.05.2017

У ребят из MSSQLTips есть несколько очень полезных статей, наиболее важная из которых - "Автоматизация SQL Резервное копирование Server 2005 Express и удаление старых файлов резервных копий "

Базовый подход - настроить две задачи с помощью Планировщика задач Windows. Одна задача запускает сценарий TSQL, который создает отдельные файлы резервных копий для всех баз данных MSSQL (кроме TEMPDB) с именем базы данных и отметкой даты / времени в имени файла в указанном каталоге. Вторая задача запускает сценарий VBScript, который просматривает этот каталог и удаляет все файлы с расширением .BAK, возраст которых превышает 3 дня.

Оба сценария требуют незначительного редактирования для вашей среды (пути, как долго хранить эти дампы базы данных), но очень близки к принципу «бросил и запустил».

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

person Community    schedule 04.12.2009
comment
Также стоит отметить - если вы используете DFS для автоматизации отправки файлов резервных копий в другие системы, имейте в виду, что .bak обычно является исключаемым расширением - либо измените его, либо измените фильтрацию. - person fencepost; 29.11.2011

Мы использовали комбинацию:

  1. Cobian Backup для планирования / обслуживания.

  2. ExpressMaint для резервного копирования.

Оба они бесплатны. Процесс состоит в том, чтобы сценарий ExpressMaint создавал резервную копию как событие Cobian «до резервного копирования». Обычно я позволяю этому перезаписывать предыдущий файл резервной копии. Затем Cobian извлекает из него zip / 7zip и архивирует их в папку резервных копий. В Cobian вы можете указать количество хранимых полных копий, сделать несколько циклов резервного копирования и т. Д.

Пример синтаксиса команды ExpressMaint:

expressmaint -S HOST\SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3 
person mika    schedule 28.01.2009
comment
кобиан мертв; ( - person Piotr Kula; 09.05.2017
comment
@PiotrKula Cobian Backup по-прежнему распространяется бесплатно и доступно на этом сайте cobiansoft.com - person user797717; 30.04.2019

Вы можете создать устройство резервного копирования в серверном объекте, например

БДТЕСТ

а затем создайте командный файл, содержащий следующую команду

sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"

скажем по имени

backup.bat

тогда ты можешь позвонить

backup.bat

в планировщике задач по вашему усмотрению

person Susheel Kumar    schedule 27.03.2017