Имя: Пароль:
IT
Админ
MS SQL: дополнительная копия во время бэкапа
0 extrim-style
 
03.06.13
16:50
Настраиваю планы обслуживания на SQL для бэкапов. После выполнения бэкапа нужно сохранить его отдельную копию в другую папку. Можно это штатно сделать? WS2008
1 Fragster
 
гуру
03.06.13
16:50
можно делать бэкап средствами командной строки уиндоус
2 Ёпрст
 
03.06.13
16:51
да, простейшим скриптом копирования файлов по маске. Его тоже в план обслуживания пихаешь
3 extrim-style
 
03.06.13
16:52
(1) а можно и не можно. Как доп. копию сохранить после создания? Видимо только отдельным запросом?
4 Лефмихалыч
 
03.06.13
16:52
добавить в план задание-скрипт, который скопирует, куда надо
5 Fragster
 
гуру
03.06.13
16:52
(3) а?
6 Lionee
 
03.06.13
16:53
(0)Эффектор сэйвер , делает , по времени куда и сколько захочешь
7 ptiz
 
03.06.13
16:54
Не пользовался, но вроде оно:
xp_cmdshell
http://msdn.microsoft.com/en-us/library/ms175046
8 extrim-style
 
03.06.13
16:54
(4) я понял. ответ на вопрос в (0) - штатно никак. Под "штатно" я подразумевал обойтись без скриптов.
9 Лефмихалыч
 
03.06.13
16:56
(8) WSH - это штатно
10 rs_trade
 
03.06.13
16:57
ssis в помощь
11 Jump
 
03.06.13
16:57
(8)Хм, а зачем?
Обычно штатные средства делают копию на тот же компьютер, а уже отдельный скрипт, гонит на фтп, облако.
12 ptiz
 
03.06.13
16:58
Дожили, уже t-sql в ms sql - это "нештатно" :)
13 Лефмихалыч
 
03.06.13
16:59
(11) ну, как?.. чтобы гарантировать, что индексы не перестроятся и статистика не обновится, если бэкап не удалось слить на второй вспомогательный резервный сервер богом забытой файлопомойки
14 extrim-style
 
03.06.13
17:00
(12) пример запроса есть?
15 Лефмихалыч
 
03.06.13
17:03
(14) да это не sql запрос должен быть, а
// JScript
var fso = WScript.CreateObject("Scripting.FileSystemObject");
fso.CopyFile("c:\path\to\fresh\sql.dump","\\failopomojka\raznoe\prochee\vazhnie_fajli\");
16 Лефмихалыч
 
03.06.13
17:04
или тупо xcopy.exe

всё просто
17 extrim-style
 
03.06.13
17:04
(15) судя по сабжу мне нужно скопировать вновь созданный, т.е. последний. А где тут поиск последнего?
18 extrim-style
 
03.06.13
17:07
(15) а как к T-SQL прикрутить JScript. Он его переваривает?
19 Лефмихалыч
 
03.06.13
17:09
(18) ты только форум читаешь, а в манагемент студию даже не смотрел? У задания в плане бослуживания есть тип, его смотри
20 extrim-style
 
03.06.13
17:09
(2) а куда скрипт прикручивать?
21 extrim-style
 
03.06.13
17:10
(19) я сегодня еще ни разу форум не читал...
22 extrim-style
 
03.06.13
17:20
(19) В Back Up Database Task тип или где?
23 extrim-style
 
03.06.13
17:27
(19) через Jobs чтоли?
24 extrim-style
 
03.06.13
17:41
Скопировал файл бэкапа в другой каталог, а на значке файла появляется замочек. Что это значит?
25 extrim-style
 
03.06.13
17:48
(24) http://antonov-sergey.blogspot.ru/2011/04/windows-server-2008-r2.html
видимо, это с правами связано, т.к. копирую файл созданный бэкап-пользователем
26 extrim-style
 
03.06.13
18:06
Добавил джобс на основе вот этого:
@echo off
setlocal

pushd "x:\in"

for /f "tokens=*" %%i in (' dir /b *.txt ') do (

   for /f "tokens=1" %%j in ( "%%~ti" ) do if "%%j"=="%date%" set "file=%%i"

)

copy "%file%" "x:\out"
popd

http://forum.oszone.net/thread-205784.html

отдельно в батнике работает, а в плане обслуживания не сработал. Пишет: [136] Job ... reported: The process could not be created for step 1 of job 0xC2A95A6062992C49AD3111E8DABCAB9E (reason: The system cannot find the file specified)

Может ему задержка нужна?
Телепаты есть?
27 Slon747
 
03.06.13
18:13
(26) Права на папку для пользователя MSSQLUser..... ?
28 Jaap Vduul
 
03.06.13
18:14
(26)
У пользователя, под которым job выполняется, диск X не примаплен.
29 Slon747
 
03.06.13
18:15
У меня такой скрипт работает.
Находит последний полный бекап и копирует куда указано.
Могу скинуть.
30 Slon747
 
03.06.13
18:17
+(29) последний бекап беру из записей msdb
31 extrim-style
 
03.06.13
18:18
(29) кидай
32 Slon747
 
03.06.13
18:20
(31)
DECLARE @DatabaseName VARCHAR(100) -- имя базы данных
DECLARE Name VARCHAR(255) -- путь к файлу бэкапа
DECLARE cmd VARCHAR(300)  -- результат команды который выполняет xp_cmdshell
DECLARE @PathIn VARCHAR(255)
DECLARE @PathOut VARCHAR(255)
SET @DatabaseName = 'My_Base_Name'
SET @PathIn='H:\\MSSQL_Backup\\' + @DatabaseName
SET @PathOut='F:\\Long_Time_Backup\\' + @DatabaseName
--выбираем из базы msdb последний бэкап
Select Name=name
From [msdb].[dbo].[backupset]
where database_name=@DatabaseName and type='D'
order by backup_finish_date

SET Name = SUBSTRING(Name,1,LEN(Name))

SET cmd='copy /Y ' + @PathIn + '\\' + Name + '.bak ' + @PathOut + '\\' + Name + '.bak'
EXEC master.dbo.xp_cmdshell cmd
33 Slon747
 
03.06.13
18:21
+(32)
Для работы ф-ции xp_cmdshell нужно выставить параметры:

use master
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
34 extrim-style
 
03.06.13
18:31
(33) спасибо, но что-то сложно. Пока попробую завести (26)
(27) права на папку есть у MSSQLSERVER, он в неё и бэкапит.
Попробовал еще дать права для SQLSERVERAGENT - безрезультатно.
35 extrim-style
 
03.06.13
18:34
менял owner'a у джобса на MSSQLSERVER и SQLSERVERAGENT - толку нет
36 Slon747
 
03.06.13
18:34
(34) Ниче сложного. Большая часть кода - установка переменных, а (33) нужно выполнить 1 раз после установки MSSQL
37 extrim-style
 
03.06.13
18:36
(36) да я понял. вот как раз из-за (33) не хочется.
38 Slon747
 
03.06.13
18:39
может добавить права для "NETWORK SERVICE" ?
39 Speshuric
 
03.06.13
21:23
(0) Нафига что-то городить? Зачем копировать после? Процитирую себя же:
http://infostart.ru/public/173494/

....
Часто удобно делать сразу не одну резервную копию, а две. Например, одна может лежать локально на сервере (чтобы была под рукой), а вторая сразу формируется в физически удалённое и защищённое от неблагоприятных воздействий хранилище:

BACKUP DATABASE [mydb] TO
   DISK = N'C:\Backup\mydb.bak',
   MIRROR TO DISK = N'\\safe-server\backup\mydb.bak'
   WITH INIT, FORMAT
...
40 extrim-style
 
04.06.13
09:16
(40) смотри, т.е. я настраиваю план обслуживания, добавляю бэкап, смотрю его код, чтобы добавить mirror to:
BACKUP DATABASE [MYBASE] TO  DISK = N'D:\MSSQL\Backup\MYBASE\month\MYBASE_backup_2013_06_04_083644_4918130.bak' WITH NOFORMAT, NOINIT,  NAME = N'MYBASE_backup_2013_06_04_083644_4918130', SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'MYBASE' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'MYBASE' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''MYBASE'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N'D:\MSSQL\Backup\MYBASE\month\MYBASE_backup_2013_06_04_083644_4918130.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND


но здесь, и у тебя тоже, сразу имя файла указывается на основе даты, которое в плане обслуживания формируется самостоятельно. Как дату прикрутить в таком формате?
41 Speshuric
 
04.06.13
11:49
(40)Так?
<CODE>DECLARE @DatabaseName AS SYSNAME;
DECLARE @DateStyle AS SMALLINT;
DECLARE @CurrentDateTime AS DATETIME;
DECLARE @CurrentDateTimeString AS NVARCHAR(MAX);
DECLARE @LocalBackup AS NVARCHAR(MAX);
DECLARE @RemoteBackup AS NVARCHAR(MAX);

SET @CurrentDateTime = GETDATE();
SET @DateStyle = 126; --ISO 8601 - мне нравится этот формат, можно использовать ODBC (120 и 121), можно вообще самому сконструировать
SET @CurrentDateTimeString = REPLACE(CONVERT(NVARCHAR(MAX), @CurrentDateTime, @DateStyle), ':', ''); --форматируем, удаляем двоеточия
SET @DatabaseName = N'mydb';
SET @LocalBackup = N'C:\Backup\' + @DatabaseName + @CurrentDateTimeString + N'.bak';
SET @RemoteBackup = N'\\safe-server\backup\' + @DatabaseName + @CurrentDateTimeString + N'.bak';

BACKUP DATABASE @DatabaseName TO
  DISK = @LocalBackup
  MIRROR TO DISK = @RemoteBackup
  WITH INIT, FORMAT;</CODE>
42 extrim-style
 
04.06.13
11:59
(41) ну тут не нижние подчеркивания. Кроме этого дополнительного бэкапа у меня всё остальное настроено по стандартной схеме, поэтому хотелось бы единообразия. Но тут, видимо, только выбирать дату по частям и приводить к нужной строке...

Поэтому пока буду пробовать (26) завести.
43 rs_trade
 
04.06.13
12:01
в плане обслуживания насколько я помню можно сколько угодно мест назначения добавлять
44 rs_trade
 
04.06.13
12:09
(40) Автор, внимательно посмотри еще на этот синатксис

BACKUP DATABASE [AdventureWorks2012] TO  DISK = N'D:\B1\b1.bak',  DISK = N'D:\B2\b2.bak' WITH NOFORMAT, NOINIT,  NAME = N'AdventureWorks2012_backup_2013_06_04_120550_2635966', SKIP, REWIND, NOUNLOAD,  STATS = 10
45 extrim-style
 
04.06.13
12:11
(44) посмотрел. не проникся. что там?
46 rs_trade
 
04.06.13
12:13
(45) TO  DISK = N'D:\B1\b1.bak',  DISK = N'D:\B2\b2.bak

через запятую перечисляются ресурсы куда положить бекап.
47 Lama12
 
04.06.13
12:15
У нас примерно так же как в (32)(33)
48 rs_trade
 
04.06.13
12:18
(46) так же это можно сделать через гуй

https://www.dropbox.com/s/rc5tobv1ui6wxsq/Untitled.png
49 extrim-style
 
04.06.13
12:24
(48) ссылка в (39) говорит, что:
"BACKUP DATABASE [mydb] TO
   DISK = N'C:\Backup\mydb.bak',
   MIRROR TO DISK = N'\\safe-server\backup\mydb.bak'
   WITH INIT, FORMAT


Если не указать MIRROR TO, то это будет не 2 зеркальных копии, а одна копия, разбитая на 2 файла, по принципу чередования. И каждая из них в отдельности будет бесполезна."

А мне нужно 2 копии.
50 Speshuric
 
04.06.13
12:30
(44)(46) Отличный совет. 2 файла копии и оба по отдельности бесполезны.
(42) Я думаю, что подчёркивания разместить достаточно легко и очевидно.
51 rs_trade
 
04.06.13
12:40
(50) хех. да, они только оба нужны при восстановлении.
52 extrim-style
 
05.06.13
11:09
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший