Как настроить ежедневное резервное копирование с помощью SQL Server Express?
Я использую небольшое веб-приложение с SQL Server Express (2005) как бэкэнд. Я могу создать резервную копию с помощью SQL script, однако я бы хотел запланировать это на ежедневной основе. В качестве дополнительной опции (должно быть) я хотел бы сохранить только последние резервные копии X (по соображениям экономии пространства). Любые указатели?
[edit] Агент SQL-сервера недоступен в SQL Server express...
Ответы
Ответ 1
Вы не можете использовать агент SQL Server в SQL Server Express.
То, как я это делал раньше, это создать SQL Script, а затем запускать его как запланированную задачу каждый день, у вас может быть несколько запланированных задач, которые бы соответствовали вашему расписанию/хранению резервных копий. Команда, которую я использую в запланированной задаче:
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i "c:\path\to\sqlbackupScript.sql"
Ответ 2
У Эдуардо Молтени был отличный ответ:
Использование запланированных задач 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
Ответ 3
Просто используйте this script для динамического резервного копирования всех баз данных на сервере. Затем создайте пакетный файл в соответствии со статьей. Полезно создавать два командных файла: один для полного резервного копирования и один для резервного копирования. Затем создайте две задачи в планировщике заданий, один для полного и один для diff.
-- // 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 [email protected]
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 ' [email protected]+ ' TO DISK = '''[email protected]+ ''' WITH INIT, NAME= ''' [email protected]+''', NOSKIP, NOFORMAT'
END
IF @backupType = 'D'
BEGIN
SET @sqlCommand = 'BACKUP DATABASE ' [email protected]+ ' TO DISK = '''[email protected]+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' [email protected]+''', NOSKIP, NOFORMAT'
END
IF @backupType = 'L'
BEGIN
SET @sqlCommand = 'BACKUP LOG ' [email protected]+ ' TO DISK = '''[email protected]+ ''' WITH INIT, NAME= ''' [email protected]+''', 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
Преимущество этого метода заключается в том, что вам не нужно ничего менять, если вы добавляете новую базу данных или удаляете базу данных, вам даже не нужно перечислять базы данных в script. Ответ от JohnB лучше/проще для сервера с одной базой данных, этот подход более подходит для серверов с несколькими базами данных.
Ответ 4
У людей в MSSQLTips есть несколько очень полезных статей, наиболее подходящими для этого являются Автоматизация резервных копий SQL Server 2005 Express и удаление старых файлов резервных копий "
Основной подход - настроить две задачи с помощью планировщика задач Windows. Одна задача запускает TSQL script, который генерирует отдельные файлы резервных копий для всех баз данных MSSQL (кроме TEMPDB) с именем базы данных и меткой даты/времени в имени файла в указанный каталог. Вторая задача запускает VBScript script, который проходит через этот каталог и удаляет все файлы с расширением .BAK, которым больше 3 дней.
Оба сценария требуют незначительного редактирования для вашей среды (пути, как долго сохранить эти дампы базы данных), но очень близки к загрузке и запуску.
Обратите внимание, что возможны возможные последствия для безопасности, если вы неаккуратно с этими или с разрешениями на каталоги, поскольку они представляют собой текстовые файлы, которые должны выполняться с некоторым уровнем привилегий. Не будьте неряшливы.
Ответ 5
Мы использовали комбинацию:
Оба они бесплатны. Этот процесс предназначен для script 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
Ответ 6
Вы можете создать резервное устройство в объекте сервера, скажем
BDTEST
а затем создайте пакетный файл, содержащий следующую команду
sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"
скажем с именем
backup.bat
то вы можете позвонить
backup.bat
в планировщике задач в соответствии с вашим удобством