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

Откуда: Yekaterinburg
Сообщений: 687
MS SQL Server 2000 DE, есть небольшая база, клиентская часть написана на Accesse
Пользователей - 3 человека
Подскажите пожалуйста уважаемые профессионалы, как наладить резервное копирование базы??
вроде в DE таких инструментов я не видела, а покупать коммерческую версию ради 3 человек глупо
25 апр 08, 13:41    [5596624]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
MS SQL Server 2000 DE, есть небольшая база, клиентская часть написана на Accesse
Пользователей - 3 человека
Подскажите пожалуйста уважаемые профессионалы, как наладить резервное копирование базы??
вроде в DE таких инструментов я не видела, а покупать коммерческую версию ради 3 человек глупо


DE = Desktop Engine? В ее комплекте идет SQL Agent, который может выполнять задания, которые могут быть созданы с помощью системных хранимых процеудр sp_add_job, sp_add_jobstep, sp_add_jobschedule и которые могут выполнять инструкцию BACKUP DATABASE.

Подробности в документации.
25 апр 08, 13:47    [5596664]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
СПАСИБО!
25 апр 08, 15:40    [5597678]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Получаю ошибки:

E:\common\Temp\1\metrology>OSQL -Usa -passw -S BRAND\MASTER -i parts.sql -n

Msg 2812, Level 16, State 62, Server BRAND\MASTER, Line 6
Could not find stored procedure 'sp_add_job'.
Msg 2812, Level 16, State 62, Server BRAND\MASTER, Line 4
Could not find stored procedure 'sp_add_jobstep'.
Msg 2812, Level 16, State 62, Server BRAND\MASTER, Line 4
Could not find stored procedure 'sp_add_jobstep'.
Msg 2812, Level 16, State 62, Server BRAND\MASTER, Line 4
Could not find stored procedure 'sp_add_jobserver'.
Msg 2812, Level 16, State 62, Server BRAND\MASTER, Line 8
Could not find stored procedure 'sp_start_job'.

Выходит этих процедур на моем сервере нет??
Что делать подскажите плиз уважаемые профессионалы!
7 май 08, 18:58    [5638770]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
Процедуры эти как и все вообще находятся не только на сервер, но и в конкретной базе.
Именно эти процедуры находятся в базе msdb
7 май 08, 19:03    [5638788]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Ага спасибо, сказала use msdb и все сработало
создался файл msdb.bak_dat, msdb.log_dat почему-то не создался.
Но мне-то надо откатить не базу msdb, а базу metrologytest. Как это сделать подскажите плиз уважаемые профессионалы.
Сейчас текст такой ( взят из book online):

USE msdb
EXEC sp_add_job @job_name = 'myTestBackupJob',
@enabled = 1,
@description = 'myTestBackupJob',
@owner_login_name = 'sa',
@notify_level_eventlog = 2,
@notify_level_email = 2,
@notify_level_netsend =2,
@notify_level_page = 2
-- @notify_email_operator_name = 'email name'
go

-- Add job step (backup data).
USE msdb
EXEC sp_add_jobstep @job_name = 'myTestBackupJob',
@step_name = 'Backup msdb Data',
@subsystem = 'TSQL',
@command = 'BACKUP DATABASE msdb TO DISK = ''d:\msdb.dat_bak''',
@on_success_action = 3,
@retry_attempts = 5,
@retry_interval = 5
go

-- Add job step (backup log).
USE msdb
EXEC sp_add_jobstep @job_name = 'myTestBackupJob',
@step_name = 'Backup msdb Log',
@subsystem = 'TSQL',
@command = 'BACKUP LOG msdb TO DISK = ''d:\msdb.log_bak''',
@on_success_action = 1,
@retry_attempts = 5,
@retry_interval = 5
go

-- Add the target servers.
USE msdb
EXEC sp_add_jobserver @job_name = 'myTestBackupJob', @server_name = N'(local)'

-- Run job. Starts the job immediately.
USE msdb
EXEC sp_start_job @job_name = 'myTestBackupJob'
7 май 08, 19:34    [5638856]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите с резервным копированием  [new]
lYY
Member

Откуда:
Сообщений: 424
Есть такой скрипт для автобэкапа баз SQL, он job генерит, с инета взял
+

/* 

!!! ВНИМАНИЕ !!!
Перед запуском проверить пути в строке (53-54)

@BackupPath - путь для резервных копий
@MetaDataPath - путь к файлам метаданных

*/

USE [msdb]
GO
/****** Object:  Job [CreateBackupJob]    Script Date: 03/26/2009 11:02:45 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 03/26/2009 11:02:45 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'CreateBackupJob', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=0, 
		@notify_level_netsend=0, 
		@notify_level_page=0, 
		@delete_level=0, 
		@description=N'No description available.', 
		@category_name=N'[Uncategorized (Local)]', 
		@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [CreateBackupJob]    Script Date: 03/26/2009 11:02:45 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CreateBackupJob', 
		@step_id=1, 
		@cmdexec_success_code=0, 
		@on_success_action=1, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'/* Общие параметры */
DECLARE @BackupPath varchar(100);
DECLARE @MetaDataPath varchar(100);

SET @BackupPath=''D:\_BACKUP\''
SET @MetaDataPath=''D:\1CMD\''

/* Проверим, надо ли создавать JOB */
DECLARE @jobname varchar(20)
SELECT @jobname = [name]
FROM [msdb].[dbo].[sysjobs]
WHERE [name] = ''Backup databases''
PRINT ''1. Создание задания на резервное копирование баз данных''
IF (@jobname IS NULL) BEGIN /* надо создавать */
	/* Создаём JOB */
	USE msdb EXEC sp_add_job @job_name=''Backup databases'';
	PRINT ''   Создано ЗАДАНИЕ на резервное копирование баз''

	/* Создаём JOBSERVER (без него JOB не запускается) */
	USE msdb EXEC sp_add_jobserver @job_name=''Backup databases'';
	PRINT ''   Создан СЕРВЕР задания на резервное копирование баз''

	/* Создаём утренний JOBSСHEDULE (07:00) */
	USE msdb EXEC sp_add_jobschedule @job_name=''Backup databases'', @name=''Morning backup'', @freq_type=4, @freq_interval = 1, @active_start_time=070000;
	PRINT ''   Создано РАСПИСАНИЕ для УТРЕННЕГО запуска резервного копирования баз''

	/* Создаём дневной JOBSCHEDULE (12:00) */
	USE msdb EXEC sp_add_jobschedule @job_name=''Backup databases'', @name=''Daytime backup'', @freq_type=4, @freq_interval = 1, @active_start_time=120000;
	PRINT ''   Создано РАСПИСАНИЕ для ДНЕВНОГО запуска резервного копирования баз''

END ELSE BEGIN /* не надо создавать */
	PRINT ''   Задание на резервное копирование баз было СОЗДАНО РАНЕЕ''	
END
PRINT ''---''
PRINT ''2. Создание новых шагов задания''

/* Удаляем все шаги */
DECLARE @job_id varchar(100)
SELECT @job_id = [job_id]
FROM [msdb].[dbo].[sysjobs]
WHERE [name] = ''Backup databases''

PRINT '' - Удаление всех шагов...''
DELETE FROM [msdb].[dbo].[sysjobsteps] WHERE [job_id] = @job_id

/* Выбираем имена шагов, которые нужно создать */
DECLARE Step_Names CURSOR FOR

	SELECT [name] + '' - Backup data'' AS BKP_Data, [name] + '' - Backup metadata'' AS BKP_MetaData, [name]
	FROM [master].[dbo].[sysdatabases]
	WHERE	
		([name] != ''tempdb'') and 
		([name] != ''model'') and
		(
			not ( [name] + '' - Backup data'' in (SELECT [step_name]  FROM [msdb].[dbo].[sysjobsteps])	) or
			not ( [name] + '' - Backup metadata'' in (SELECT [step_name]  FROM [msdb].[dbo].[sysjobsteps])	)
		);

OPEN Step_Names
	
	DECLARE @BkpData_nm varchar(20), @BkpMetadata_nm varchar(20), @db_nm varchar(20)
	DECLARE @st_id1 varchar(50), @st_id2 varchar(50), @CMD varchar(200), @st_n varchar(50)

	/* Цикл по выбранным именам */
	FETCH NEXT FROM Step_Names INTO @BkpData_nm, @BkpMetadata_nm, @db_nm
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @st_id1=NULL
		SET @st_id2=NULL
		
		PRINT '' - База данных: ''+@db_nm

		SELECT @st_id1=[step_id] FROM [msdb].[dbo].[sysjobsteps] WHERE [step_name]=@db_nm + '' - Backup data''
		IF (@st_id1 IS NULL) BEGIN

			/* Создаём шаг 1 - бэкап данных */
			SET @st_n=@db_nm+'' - Backup data''
			SET @CMD=''BACKUP DATABASE [''+@db_nm+''] TO  DISK = N''''''+@BackupPath+@db_nm+''.bak'''' WITH NOFORMAT, INIT,  NAME = N''''''+@db_nm+''-Full Database Backup'''', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'';
			USE msdb EXEC sp_add_jobstep NULL, ''Backup databases'', NULL, @st_n, ''TSQL'', @CMD, NULL, 0, 3, 0, 3
			PRINT ''   ДОБАВЛЕН шаг копирования ДАННЫХ''

		END ELSE BEGIN
			PRINT ''   Шаг копирования ДАННЫХ был СОЗДАН РАНЕЕ''
		END

		SELECT @st_id2=[step_id]  FROM [msdb].[dbo].[sysjobsteps] WHERE [step_name]=@db_nm + '' - Backup metadata''
		IF (@st_id2 IS NULL) BEGIN

			/* Создаём шаг 2 - бэкап метаданных */
			/*
			SET @st_n=@db_nm+'' - Backup metadata''
			SET @CMD=''copy /Y "''+@MetaDataPath+@db_nm+''\1cv7.md" "''+@BackupPath+@db_nm+''.md"'';
			USE msdb EXEC sp_add_jobstep NULL, ''Backup databases'', NULL, @st_n, ''CMDEXEC'', @CMD, NULL, 0, 3, 0, 3
			*/
			PRINT ''   ДОБАВЛЕН шаг копирования METAДАННЫХ''

		END ELSE BEGIN
			PRINT ''   Шаг копирования METAДАННЫХ был СОЗДАН РАНЕЕ''
		END

		FETCH NEXT FROM Step_Names INTO @BkpData_nm, @BkpMetadata_nm, @db_nm

	END /* wикл по шагам */
CLOSE Step_Names
DEALLOCATE Step_Names

PRINT ''---''

PRINT ''3. Установка действий''

/* Заменяем действие при успешном и неуспешном выполнении на 3 (выполнить следующий шаг)*/
DECLARE @my_job_id uniqueidentifier
SELECT TOP 1 @my_job_id=[job_id] FROM [msdb].[dbo].[sysjobs] WHERE [name]=''Backup databases''

UPDATE [msdb].[dbo].[sysjobsteps]
SET [on_success_action] = 3,
	[on_fail_action] = 3
WHERE [job_id]=@my_job_id
PRINT ''   После выполнения шага перейти к следующему''

/* Заменяем действие у последнего шага при успешном (=1 - выход) и неуспешном (=2 выход с ошибкой) выполнении */
DECLARE @last_step_id int
SELECT TOP 1 @last_step_id=step_id
FROM [msdb].[dbo].[sysjobsteps] INNER JOIN [msdb].[dbo].[sysjobs] ON ([sysjobsteps].job_id=[sysjobs].job_id)
WHERE [sysjobs].[name]=''Backup databases''
ORDER BY step_id desc
USE msdb EXEC sp_update_jobstep @job_name=''Backup databases'', @step_id=@last_step_id, @on_success_action=1, @on_fail_action=2
PRINT ''   После выполнения ПОСЛЕДНЕГО шага выйти из задания''
PRINT ''---''

PRINT ''   Конец''', 
		@database_name=N'master', 
		@database_user_name=N'dbo', 
		@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'CreateBackupJob', 
		@enabled=1, 
		@freq_type=4, 
		@freq_interval=1, 
		@freq_subday_type=1, 
		@freq_subday_interval=0, 
		@freq_relative_interval=0, 
		@freq_recurrence_factor=0, 
		@active_start_date=20090326, 
		@active_end_date=99991231, 
		@active_start_time=100000, 
		@active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
	IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:


Как бы добавить функционал этого скрипта, чтобы в результате полученный джоб по ошибке посылал уведомление на емэйл.
Кто в sql силен, помогите плиз!
15 май 12, 11:05    [12554772]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Создать джоб из скрипта и настроить в студии соответствующие уведомления.

Сообщение было отредактировано: 15 май 12, 11:25
15 май 12, 11:25    [12554977]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
lYY
Member

Откуда:
Сообщений: 424
А тут в другом фишка.
Этот скрипт выполняется каждый день, он каждый день пересоздает job.
Если программеры добавили или поменяли какую-то базу, ее бэкап включится автоматом.
15 май 12, 11:51    [12555262]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
lYY
А тут в другом фишка.
Этот скрипт выполняется каждый день, он каждый день пересоздает job.
Если программеры добавили или поменяли какую-то базу, ее бэкап включится автоматом.
И что только люди не придумают, лишь бы в визарде мышкой не настраивать Maintenance Plan.
15 май 12, 11:54    [12555298]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
lYY
Member

Откуда:
Сообщений: 424
да хороший инструмент, просто надо доработать немного, о чем и прошу
15 май 12, 12:10    [12555460]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
lYY
просто надо доработать немного, о чем и прошу

Нужно открыть в хелпе статью про sp_add_job и прочитать про параметры
@notify_level_eventlog,
@notify_level_email
@notify_level_netsend
@notify_level_page
15 май 12, 14:12    [12556577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
lYY
Member

Откуда:
Сообщений: 424
Спасибо, с уведомлениями разобрался.

Но вылезла другая проблема - если в задании например 10 шагов и ошибка происходит не на последнем шаге (например, на 5-ом),
то задание считается выполненным с предупреждением(без ошибок). И сообщение на почту не отсылается.
Ну кто придумал такой бред?!

Надо искать другой подход...
18 май 12, 12:12    [12575908]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
lYY
Но вылезла другая проблема - если в задании например 10 шагов и ошибка происходит не на последнем шаге (например, на 5-ом),
то задание считается выполненным с предупреждением(без ошибок). И сообщение на почту не отсылается.
Ну кто придумал такой бред?!

Вы и придумали. Когда в свойствах 5го шага указали не прерывать джоб при ошибке.
18 май 12, 12:18    [12575955]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с резервным копированием  [new]
lYY
Member

Откуда:
Сообщений: 424
Glory
Вы и придумали. Когда в свойствах 5го шага указали не прерывать джоб при ошибке.

Интересно, что лучше -
1. прервать джоб и послать сообщение, и наплевать на бэкапы других баз.
2. Или сбэкапить что можно, но не посылать сообщение?

(Я решил проверять дату всех файлов бэкапов спец.прогой, так, я считаю, надежней. Ну и 2-ой способ.)
18 май 12, 14:50    [12577425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить