Witam!
Napisałem sobie taki oto skrypt, który ma za zadanie wykonywać pełny backup baz danych w jednej instancji serwera MS SQL. Problem w tym, że nie jestem w stanie wykryć błędu, który jest w nim zawarty, a polega on na tym że skrypt wykonuje backup tylko jednej bazy z instancji. Baz danych jest ponad 20 z czego w ciągłym uzytku są 2 bazy w zasadzie, dlatego ręczne wykonywanie kopii zapasowych jest dość mozolne.
Oto i on:
USE master
GO
EXEC sp_configure 'show advanced options',1
reconfigure with override;
EXEC sp_configure 'xp_cmdshell',1
reconfigure with override;
DECLARE @DBName varchar(255)
DECLARE @VirtualPath varchar(255)
DECLARE @CommadArchive varchar(255)
DECLARE @Prefix varchar(255)
DECLARE @DBFile varchar(256)
DECLARE @Cmd varchar(500)
DECLARE @Choice int
----------------------------------------------------------
SET @VirtualPath ='D:\_SQL_Backup\'
SET @CommadArchive ='C:\Program Files\WinRAR\rar.exe'
SET @Prefix='Backup_'
-- @Choice = 0 - Backup, zip i usunięcie poprzedniego *.bak
-- @Choice = 1 - Backup, zip
-- @Choice = 2 - Backup bez kompresji
SET @Choice = 2
----------------------------------------------------------
DECLARE DBCursor CURSOR FOR
SELECT
NAME = db_name(m.database_id)
FROM
sys.master_files m
WHERE
(
m.state = 0 and has_dbaccess(db_name(m.database_id)) = 1 and db_name(m.database_id) not in ('master','model','tempdb')
)
-- Not multiple line
GROUP BY m.database_id
ORDER BY NAME
OPEN DBCursor
FETCH NEXT FROM DBCursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DBFile = datename(yy,getdate()) + '_'+datename(mm,getdate()) + '_' + datename(dd,getdate()) + '_' + replace(replace(@DBName,':','_'),'\','_')
SET @Cmd='BACKUP DATABASE [' + @DBName + '] TO DISK = N'''+@VirtualPath +
@Prefix +
@DBFile + '.bak'+char(39) + ' WITH NOFORMAT, INIT, NAME = N''' +
@DBName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 100'
EXEC sys.sp_sqlexec @Cmd
PRINT 'Backup '+@DBName+' as file name '+@Prefix+@DBFile + '. Done ...'
FETCH NEXT FROM DB_Cursor INTO @DBName
END
CLOSE DBCursor
DEALLOCATE DBCursor
-------------------------------------------------------------------------------------
IF (@Choice !=2)
BEGIN
SET @Cmd= 'exec xp_cmdshell '+char(39)+'del '+@VirtualPath+@Prefix+'_Backup_'+
datename(yy,getdate()) + '_' +datename(mm,getdate()) + '_' + datename(dd,getdate()) +'.zip' +CHAR(39)
EXEC sys.sp_sqlexec @Cmd
SET @Cmd= 'exec xp_cmdshell '+char(39)+@CommadArchive+' '+@VirtualPath+@Prefix+'_Backup_' +
datename(yy,getdate()) + '_'+datename(mm,getdate()) + '_' + datename(dd,getdate()) +'.zip ' +
@VirtualPath+@Prefix+datename(yy,getdate())+'_'+datename(mm,getdate()) + '_' + datename(dd,getdate()) +'_*.bak'+CHAR(39)
PRINT @Cmd
end
Czy ktoś z was wie co może stwarzać takie problemy? Będę wdzięczny za każdą pomoc :)