Odpowiedź firmy Microsoft na tworzenie kopii zapasowych wszystkich baz danych użytkowników w SQL Express jest tutaj :
Proces jest następujący: skopiuj, wklej i wykonaj ich kod (patrz poniżej. Skomentowałem kilka dziwnie niekomentowanych wierszy na górze) jako zapytanie na serwerze bazy danych. Oznacza to, że należy najpierw zainstalować SQL Server Management Studio (lub w inny sposób połączyć się z serwerem bazy danych za pomocą programu SSMS). To wykonanie kodu spowoduje utworzenie procedury składowanej na serwerze bazy danych.
Utwórz plik wsadowy, aby wykonać procedurę składowaną, a następnie użyj Harmonogramu zadań, aby zaplanować okresowe (np. Nocne) uruchamianie tego pliku wsadowego. Mój kod (który działa) to nieco zmodyfikowana wersja ich pierwszego przykładu:
sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
To zadziałało dla mnie i podoba mi się. Za każdym razem, gdy go uruchamiasz, tworzone są nowe pliki kopii zapasowych. Musisz wymyślić metodę rutynowego usuwania starych plików kopii zapasowych. Mam już procedurę, która robi tego typu rzeczy, więc zachowam kopie zapasowe na kilka dni na dysku (wystarczająco długo, aby zostały one zarchiwizowane przez moją normalną procedurę tworzenia kopii zapasowych), a następnie je usunę. Innymi słowy, zawsze będę mieć pod ręką kopie zapasowe na kilka dni bez konieczności przywracania danych z systemu kopii zapasowych.
Wkleję poniżej skrypt tworzenia procedury składowanej Microsoftu:
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
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)
)
INSERT INTO @DBs (DBNAME)
SELECT Name FROM master.sys.databases
where state=0
AND name=@DatabaseName
OR @DatabaseName IS NULL
ORDER BY Name
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 @BackupName varchar(100)
DECLARE @BackupFile varchar(100)
DECLARE @DBNAME varchar(300)
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @dateTime NVARCHAR(20)
DECLARE @Loop int
SELECT @Loop = min(ID) FROM @DBs
WHILE @Loop IS NOT NULL
BEGIN
SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' + REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')
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'
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
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
EXEC(@sqlCommand)
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
END