Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Приветствую!
Есть такая проблема:
Имеется SQL 2005 с десятком БД от 15 до 45Гб, по этой инструкции http://pinbol.blogspot.ru/2008/06/ms-sql.html настроен бэкап... В данной инструкции пример приведен для одной БД, соответственно у меня это выглядит так:
Полный бэкап - шаг 1:
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\ESETRADB.rar \\SEARCH\Archive\SQL\ESETRADB.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\NVK_CB.rar \\SEARCH\Archive\SQL\NVK_CB.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\NVK_OR.rar \\SEARCH\Archive\SQL\NVK_OR.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\NVK_ORSK.rar \\SEARCH\Archive\SQL\NVK_ORSK.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\NVK_SAM.rar \\SEARCH\Archive\SQL\NVK_SAM.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\NVK3new.rar \\SEARCH\Archive\SQL\NVK3new.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\OAO.rar \\SEARCH\Archive\SQL\OAO.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\Orsk2012.rar \\SEARCH\Archive\SQL\Orsk2012.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\S_disp.rar \\SEARCH\Archive\SQL\S_disp.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\ServArchive.rar \\SEARCH\Archive\SQL\ServArchive.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\Servis6.rar \\SEARCH\Archive\SQL\Servis6.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\zarplata.rar \\SEARCH\Archive\SQL\zarplata.bak'
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\zpnvk.rar \\SEARCH\Archive\SQL\zpnvk.bak'
GO


Второй шаг:
BACKUP DATABASE [ESETRADB] TO DISK = N'\\SEARCH\Archive\SQL\ESETRADB.bak' 
WITH NOFORMAT, INIT, NAME = N'ESETRADB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'ESETRADB' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'ESETRADB' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''ESETRADB'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\ESETRADB.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [NVK_CB] TO DISK = N'\\SEARCH\Archive\SQL\NVK_CB.bak' 
WITH NOFORMAT, INIT, NAME = N'NVK_CB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'NVK_CB' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'NVK_CB' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''NVK_CB'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\NVK_CB.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [NVK_OR] TO DISK = N'\\SEARCH\Archive\SQL\NVK_OR.bak' 
WITH NOFORMAT, INIT, NAME = N'NVK_OR-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'NVK_OR' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'NVK_OR' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''NVK_OR'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\NVK_OR.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [NVK_ORSK] TO DISK = N'\\SEARCH\Archive\SQL\NVK_ORSK.bak' 
WITH NOFORMAT, INIT, NAME = N'NVK_ORSK-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'NVK_ORSK' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'NVK_ORSK' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''NVK_ORSK'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\NVK_ORSK.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [NVK_SAM] TO DISK = N'\\SEARCH\Archive\SQL\NVK_SAM.bak' 
WITH NOFORMAT, INIT, NAME = N'NVK_SAM-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'NVK_SAM' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'NVK_SAM' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''NVK_SAM'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\NVK_SAM.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [NVK3new] TO DISK = N'\\SEARCH\Archive\SQL\NVK3new.bak' 
WITH NOFORMAT, INIT, NAME = N'NVK3new-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'NVK3new' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'NVK3new' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''NVK3new'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\NVK3new.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [OAO] TO DISK = N'\\SEARCH\Archive\SQL\OAO.bak' 
WITH NOFORMAT, INIT, NAME = N'OAO-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'OAO' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'OAO' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''OAO'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\OAO.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [OAO] TO DISK = N'\\SEARCH\Archive\SQL\Orsk2012.bak' 
WITH NOFORMAT, INIT, NAME = N'Orsk2012-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'Orsk2012' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'Orsk2012' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''Orsk2012'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\Orsk2012.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [S_disp] TO DISK = N'\\SEARCH\Archive\SQL\S_disp.bak' 
WITH NOFORMAT, INIT, NAME = N'S_disp-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'S_disp' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'S_disp' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''S_disp'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\S_disp.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [ServArchive] TO DISK = N'\\SEARCH\Archive\SQL\ServArchive.bak' 
WITH NOFORMAT, INIT, NAME = N'ServArchive-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'ServArchive' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'ServArchive' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''ServArchive'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\ServArchive.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [Servis6] TO DISK = N'\\SEARCH\Archive\SQL\Servis6.bak' 
WITH NOFORMAT, INIT, NAME = N'Servis6-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'Servis6' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'Servis6' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''Servis6'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\Servis6.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [zarplata] TO DISK = N'\\SEARCH\Archive\SQL\zarplata.bak' 
WITH NOFORMAT, INIT, NAME = N'zarplata-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'zarplata' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'zarplata' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''zarplata'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\zarplata.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

BACKUP DATABASE [zpnvk] TO DISK = N'\\SEARCH\Archive\SQL\zpnvk.bak' 
WITH NOFORMAT, INIT, NAME = N'zpnvk-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'zpnvk' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'zpnvk' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''zpnvk'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\zpnvk.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO


Третий шаг:
USE [ESETRADB]
GO
BACKUP LOG [ESETRADB] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'ESETRADB_log' , 0)
GO
DBCC SHRINKDATABASE (ESETRADB, 10);
GO
USE [NVK_CB]
GO
BACKUP LOG [NVK_CB] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'NVK_CB_log' , 0)
GO
DBCC SHRINKDATABASE (NVK_CB, 10);
GO
USE [NVK_OR]
GO
BACKUP LOG [NVK_OR] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'NVK_OR_log' , 0)
GO
DBCC SHRINKDATABASE (NVK_OR, 10);
GO
USE [NVK_ORSK]
GO
BACKUP LOG [NVK_ORSK] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'NVK_ORSK_log' , 0)
GO
DBCC SHRINKDATABASE (NVK_ORSK, 10);
GO
USE [NVK_SAM]
GO
BACKUP LOG [NVK_SAM] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'NVK_SAM_log' , 0)
GO
DBCC SHRINKDATABASE (NVK_SAM, 10);
GO
USE [NVK3new]
GO
BACKUP LOG [NVK3New] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'NVK3new_log' , 0)
GO
DBCC SHRINKDATABASE (NVK3New, 10);
GO
USE [OAO]
GO
BACKUP LOG [OAO] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'OAO_log' , 0)
GO
DBCC SHRINKDATABASE (OAO, 10);
GO
USE [Orsk2012]
GO
BACKUP LOG [Orsk2012] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'Orsk2012_log' , 0)
GO
DBCC SHRINKDATABASE (Orsk2012, 10);
GO
USE [S_disp]
GO
BACKUP LOG [S_disp] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'S_disp_log' , 0)
GO
DBCC SHRINKDATABASE (S_disp, 10);
GO
USE [ServArchive]
GO
BACKUP LOG [ServArchive] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'ServArchive_log' , 0)
GO
DBCC SHRINKDATABASE (ServArchive, 10);
GO
USE [Servis6]
GO
BACKUP LOG [Servis6] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'Servis6_log' , 0)
GO
DBCC SHRINKDATABASE (Servis6, 10);
GO
USE [zarplata]
GO
BACKUP LOG [zarplata] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'zarplata_log' , 0)
GO
DBCC SHRINKDATABASE (zarplata, 10);
GO
USE [zpnvk]
GO
BACKUP LOG [zpnvk] WITH TRUNCATE_ONLY
GO
DBCC SHRINKFILE (N'zpnvk_log' , 0)
GO
DBCC SHRINKDATABASE (zpnvk, 10);
GO

Аналогичным джобом делается и разностный бэкап.
Проблема в том, что с SQL-скриптами я совсем не дружу, а баз много и они постоянно приходят/уходят, каждый раз переписывать скрипт несколько напрягает. По опыту школьного программирования на Паскале я понимаю, что данные скрипты мягко говоря не вполне оптимальны и их можно заключить в цикл для каждой БД, но как это сделать я не знаю. Собственно в этом и прошу помощи... Заранее благодарен всем за ответы. PS Да, местами я нуб, прошу за это не пинать))
28 дек 12, 11:47    [13699608]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5116
список баз в master.sys.databases
динамик скрипт в руки и...
28 дек 12, 13:25    [13700328]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Как то так... Что под рукой было.
declare @Dbname nvarchar(4000)
declare @sql nvarchar(4000)
declare @sql1 nvarchar(4000)
DECLARE authors_cursor CURSOR FOR 
select name from sys.databases
	where (ну тут любое условие или без)


OPEN authors_cursor

	FETCH NEXT FROM authors_cursor 
	INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN

--print @dbname
	Set @sql = 'BACKUP DATABASE ' + '[' + @DBname + ']' + ' TO  DISK = N''P:\Backup\' + @dbname + '.bak''' + ' WITH NOFORMAT, INIT,  NAME = N''' + @dbname + '-Full Database Backup''' + ', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10'
	Set @sql1 = 'BACKUP LOG ' + '[' + @DBname + ']' + ' TO  DISK = N''P:\Backup\' + @dbname + '.bak''' + ' WITH NOFORMAT, NOINIT,  NAME = N''' + @dbname + '-Transaction LogBackup''' + ', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10'
 --print @sql
 exec sp_executesql @sql
 exec sp_executesql @sql1
   FETCH NEXT FROM authors_cursor 
   INTO @dbname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
28 дек 12, 13:28    [13700363]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Ozerov, спасибо!
Правильно ли я Вас понял? Сделал аналогично Вашему только для архивирования...
declare @Dbname nvarchar(4000)
declare @arcdata nvarchar(4000)
DECLARE authors_cursor CURSOR FOR 
select name from sys.databases
	where (ну тут любое условие или без)

OPEN authors_cursor

	FETCH NEXT FROM authors_cursor 
	INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN
--print @dbname
        Set @arcdata = 'master..xp_cmdshell "C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\' + @DBname + '.rar \\SEARCH\Archive\SQL\'  + @DBname + '.bak'
 --print @arcdata
 exec sp_executesql @arcdata
   FETCH NEXT FROM authors_cursor 
   INTO @dbname
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
28 дек 12, 15:03    [13700935]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
что-то я видимо не так понял, в таком виде оно не работает...
28 дек 12, 15:07    [13700965]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Гость333
Member

Откуда:
Сообщений: 3683
evoname
что-то я видимо не так понял, в таком виде оно не работает...

Вы апострофы где-то по дороге потеряли.

Set @arcdata = 'master..xp_cmdshell "C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\' + @DBname + '.rar \\SEARCH\Archive\SQL\'  + @DBname + '.bak'

—>
Set @arcdata = 'master..xp_cmdshell ''"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\' + @DBname + '.rar \\SEARCH\Archive\SQL\'  + @DBname + '.bak'''
28 дек 12, 15:13    [13701005]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Гость333, спасибо!
Так гораздо лучше))
А насчет апострофов - не совсем понял логику их размещения, по количеству открывающих и закрывающих вроде все ок, операторы вынесены из апострофов... Все-таки SQLный язык - это не Паскаль...)))
28 дек 12, 15:16    [13701033]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Гость333
Member

Откуда:
Сообщений: 3683
evoname,

Ну смотрите, в первом посте у вас написана команда:
EXEC master..xp_cmdshell '"C:\Program Files\WinRAR\rar" тут куча параметров ESETRADB.bak'
.
В процедуру sp_executesql вы должны передать то же самое, со всеми кавычками и апострофами. Иначе команда будет выглядеть так:
EXEC master..xp_cmdshell "C:\Program Files\WinRAR\rar" тут куча параметров ESETRADB.bak

, и SQL Server не сможет её обработать из-за ошибки синтаксиса (даже форумная подсветка намекает, что эти два фрагмента кода сильно отличаются). Значит, при генерации команды для sp_executesql нужно задвоить все первоначальные апострофы. Мне кажется, в Паскале то же самое.
28 дек 12, 15:30    [13701191]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Еще момент, в скрипте, предложенном уважаемым Ozerov нет одного куска, который присутствовал в моем изначальном коде:
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'zpnvk' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'zpnvk' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''zpnvk'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\zpnvk.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

Как бы его тоже включить в скрипт? У меня в очередной раз не получается(((
28 дек 12, 17:30    [13701988]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
и еще, как объявить переменную, в которой можно было бы хранить путь к бэкапу? Чтобы не писать его каждый раз полностью...
28 дек 12, 17:31    [13701997]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Собственно, вот моя попытка включить старый код в новый скрипт... Надо ли говорить, что она неудачна))))

declare @Dbname nvarchar(4000)
declare @arcdata nvarchar(4000)
declare @backdata nvarchar(4000)
declare @backupSetId as int
DECLARE authors_cursor CURSOR FOR 
select name from sys.databases
OPEN authors_cursor
FETCH NEXT FROM authors_cursor 
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
--print @dbname
Set @arcdata = 'master..xp_cmdshell ''"C:\Program Files\WinRAR\rar" m -ep -m2 -rr1p -ag+YYYY_MM_DD_HHMM_ \\SEARCH\Archive\SQL\' + @DBname + '.rar \\SEARCH\Archive\SQL\'  + @DBname + '.bak'''
Set @backdata = 'BACKUP DATABASE ' + '[' + @DBname + ']' + ' TO  DISK = N''\\SEARCH\Archive\SQL\' + @DBname + '.bak''' + ' WITH NOFORMAT, INIT, NAME = N''' + @DBname + '-Full Database Backup''' + ', SKIP, NOREWIND, NOUNLOAD, STATS = 10'

select @backupSetId = position from msdb..backupset where database_name=N''' + DBname + ''' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N''' + Dbname + ''' )
if @backupSetId is null begin raiserror(N'''Verify failed. Backup information for database ' + @DBname + ' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\' + @DBname + '.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND

--print @arcdata
exec sp_executesql @arcdata
--print @backdata
exec sp_executesql @backdata
FETCH NEXT FROM authors_cursor 
INTO @dbname
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
28 дек 12, 17:34    [13702011]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Гость333
Member

Откуда:
Сообщений: 3683
evoname,

А вы весь этот скрипт передавайте в sp_executesql, вместе с declare, select, if и проч.:
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'Orsk2012' and 
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'Orsk2012' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''Orsk2012'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'\\SEARCH\Archive\SQL\Orsk2012.bak' 
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND


Пример:
declare @sql nvarchar(4000);
set @sql = N'declare @s varchar(100);
select @s = ''Hello world!'';
if @s is null
    raiserror(''Ничего себе глюк!'', 16, 1)
else
    print @s;';
print 'Текст динамического SQL:'
print @sql;
print '----------------';
print 'Результат выполнения динамического SQL:'
exec sp_executesql @sql;
28 дек 12, 17:56    [13702183]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
evoname
Member

Откуда: Orenburg
Сообщений: 81
Гость333, Спасибо!
Еще момент, нашел тут еще одну процедурку
exec sp_MSForEachDb 'BACKUP DATABASE [?] TO DISK = ''?.bak'' WITH INIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT'

Она не решит мою проблему с бэкапами всех баз? Вместо громоздкого скрипта одна готовая процедура... Или я чего не понимаю((
28 дек 12, 18:03    [13702232]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в написании скрипта  [new]
Гость333
Member

Откуда:
Сообщений: 3683
evoname,

Можно и через sp_msforeachdb, я хотел про неё написать, но вылетело из головы, сорри :-)
Тогда надо добавлять условие, чтобы ненужные базы не попадали в обработку. Например, базу tempdb забэкапить нельзя (SQL Server выдаст ошибку), это можно разрулить примерно так:
exec sp_msforeachdb N'if ''?'' = ''tempdb'' return;
print ''backup [?] database'' '

Или можно где-нибудь хранить таблицу со списком БД, не подлежащих архивации, и делать запрос к этой таблице.

Кстати, вы делаете бэкапы системных БД master, msdb и model? Если нет, то пора начать делать :-)
28 дек 12, 18:31    [13702395]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить