Имя: Пароль:
IT
Админ
как снять копию базы средствами ms sql 2012
0 sidalexsandr
 
17.03.17
09:11
Поискал в интернете но не нашел. Как создать копию 1с sql базы средствами ms sql server 2012, причем имя копии должно быть UPP_2017-03-11 (то есть UPP_Текущая дата).
1 bodri
 
17.03.17
09:13
Один раз снять или всё таки чтоб постоянно копировал с интервалом?
2 vde69
 
17.03.17
09:13
&НаКлиенте
//
//
Процедура ВыгрузитьАрхивSQL(ЛокальноеИмяАрхива, Отказ) Экспорт
    Попытка
        мИмяБДSQL = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.БазаИсточник, "ИмяБДSQL");
        мСерверSQL = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.БазаИсточник, "СерверSQL");
        
        COMОбъектSQL = СоздатьПодключениеSQL(мСерверSQL, мИмяБДSQL);    
                
        COMОбъектSQL.Execute("USE " + СокрЛП(мИмяБДSQL) + ";        
        |BACKUP DATABASE " + СокрЛП(мИмяБДSQL) + "
        |TO DISK = '" + СокрЛП(ЛокальноеИмяАрхива) + "'
        |WITH COPY_ONLY, NOFORMAT, NOINIT, COMPRESSION, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
        |;");
        УстановитьСтатусОперации("Выгрузка", 3);
    Исключение
        Сообщить(ОписаниеОшибки());
        Отказ = Истина;
        УстановитьСтатусОперации("Выгрузка", 2);
    КонецПопытки;
КонецПроцедуры


&НаКлиенте
//
//
Процедура  ЗагрузитьАрхивSQL(ЛокальноеИмяАрхива, ИмяБазыИсточника, ИмяDBO, Отказ) Экспорт
    Попытка
        мИмяБДSQL = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.БазаДляКопии, "ИмяБДSQL");
        мСерверSQL = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.БазаДляКопии, "СерверSQL");
        
        ИмяФайлаДанных = "";
        ИмяФайлаЛога = "";
        
        COMОбъектSQL = СоздатьПодключениеSQL(мСерверSQL, "master");    
        
        Рекордсет = Новый COMОбъект("ADODB.RecordSet");
        Command = Новый COMОбъект("ADODB.Command");
        Command.ActiveConnection = COMОбъектSQL;

        Command.CommandText =
            "select mf.physical_name
            |from sys.master_files as mf
            |    join sys.databases as mb
            |    on mb.database_id = mf.database_id
            |WHERE     (mb.name = '"+мИмяБДSQL+"' and mf.type=0)";

        Command.CommandType = 1;
        Рекордсет = Command.Execute();
        Рекордсет.MoveFirst();                
        Пока не Рекордсет.EOF() Цикл
            ИмяФайлаДанных = Рекордсет.Fields("physical_name").Value;
            Рекордсет.MoveNext();
        КонецЦикла;

        Command.CommandText =
            "select mf.physical_name
            |from sys.master_files as mf
            |    join sys.databases as mb
            |    on mb.database_id = mf.database_id
            |WHERE     (mb.name = '"+мИмяБДSQL+"' and mf.type=1)";

        Command.CommandType = 1;
        Рекордсет = Command.Execute();
        Рекордсет.MoveFirst();                
        Пока не Рекордсет.EOF() Цикл
            ИмяФайлаЛога = Рекордсет.Fields("physical_name").Value;
            Рекордсет.MoveNext();
        КонецЦикла;
        
        ЗаписатьНачалоОперацииНаСервере ();
        
        ТекстКоманды =
            "RESTORE DATABASE " + СокрЛП(мИмяБДSQL) + "
            |FROM DISK = '" + СокрЛП(ЛокальноеИмяАрхива) + "'
            |WITH FILE = 1, NOUNLOAD,  REPLACE,  STATS = 5,
            |MOVE N'"+ИмяБазыИсточника+"' TO N'"+ИмяФайлаДанных+"',
            |MOVE N'"+ИмяБазыИсточника+"_log' TO N'"+ИмяФайлаЛога+"';";
        
        COMОбъектSQL.Execute(ТекстКоманды);
        
        ТекстКоманды = "ALTER AUTHORIZATION ON DATABASE::"+ СокрЛП(мИмяБДSQL) +" TO " + СокрЛП(ИмяDBO) + ";";
        
        COMОбъектSQL.Execute(ТекстКоманды);

        УстановитьСтатусОперации("Загрузка", 3);
    Исключение
        Сообщить(ОписаниеОшибки());
        Отказ = Истина;
        УстановитьСтатусОперации("Загрузка", 2);
    КонецПопытки;
КонецПроцедуры
3 sidalexsandr
 
17.03.17
09:15
(1) Постоянно, каждую ночь в 2 часа.
4 bodri
 
17.03.17
09:17
тогда надо настроить Maintenance Plans в консоли скл
5 bodri
 
17.03.17
09:19
6 sidalexsandr
 
17.03.17
09:25
(5) Спасибо.
7 1dvd
 
17.03.17
09:33
(3) а сервак не треснит, если каждый день новую копию делать?
8 bodri
 
17.03.17
09:36
(7) а с чего он треснит? у меня настроено ежедневная полная архивация сжатием и каждые 3 часа промежуточные. Эти архивы выгружаются на сервак, а потом перекидываются в 2 разных места. Также планировщик удаляет эти архивы которые старше 2-х дней.
9 1dvd
 
17.03.17
09:37
(8) архив сколько занимает? А сколько развернутая? Представь 365 баз в год
10 1dvd
 
17.03.17
09:37
*через год
11 bodri
 
17.03.17
09:39
(9) 2 базы 250 и 300 ГБ, архив 20 и 22 ГБ соответственно. В этих двух местах куда всё скидывается чистятся по определенному сценарию.
12 1dvd
 
17.03.17
09:40
(11) вот. А ему нужно каждый день делать новую развернутую копию базы. Про чистку ни слова
13 Fish
 
17.03.17
09:42
(8) А зачем каждый день делать полную копию?
14 elCust
 
17.03.17
09:42
(0) А зачем восстанавливать под определенной датой?
15 Fish
 
17.03.17
09:50
+(13) У нас каждый час - бэкап ЖТ, разностный бэкап - раз в день ночью, ну а полный - раз в неделю.
16 Dmitrii
 
гуру
17.03.17
09:51
1dvd дисковое пространство сейчас стоит сущие копейки.
Всерьез обсуждать вопрос экономии на архивах - просто глупо.
Этот не то место, где следует экономить.
Ежедневный архив - нормальная практика для подавляющего большинства случаев. Более частые полные архивы, скорее всего, бессмысленны - вполне достаточно инкрементальных хоть каждый час. В остальных (более сложных) случаях базы держат в полной модели  восстановления.
Ну и ни разу не видел, чтобы кто-то хранил ежедневные архивы более года. Как правило, всё что старше года - оставляют только какие-то ключевые архивы на определенные моменты (после закрытия периода - поквартальные, после прохождения аудита и т.п.)
17 bodri
 
17.03.17
09:56
(12) ну к этому он придет когда место на винтах закончится
18 bodri
 
17.03.17
09:56
(13) модель Симпл стоит
19 Fish
 
17.03.17
09:56
(16) У нас ежедневные хранятся месяц, полные еженедельные - где-то полгода, потом оставляем одну за месяц, и далее они уезжают на ленту.
20 Fish
 
17.03.17
09:57
(18) Тогда понятно. У нас фулл.
21 Дарлок
 
17.03.17
10:00
(15) а из разностного бэкапа восстановиться пробовали или только в теории? )
22 Дарлок
 
17.03.17
10:00
(20) для какой цели?
23 Fish
 
17.03.17
10:01
(21) Почему пробовали? Восстанавливались не раз. Причём на любой момент времени.
24 Dmitrii
 
гуру
17.03.17
10:01
(13) >> зачем каждый день делать полную копию?

У нас, например, ежедневно ночью производится обновление статистики и реорганизация индексов. После этой процедуры разностные бекапы (сохраняющие все измененные страницы) резко вырастают в объёме.
Поэтому после обновления статистики и реорганизации индексов делаем полный бекап и начиная с него в течении дня ежечасно делаются разностные, весьма малого объема.

Модель восстановления у нас простая. Полную считаем избыточной. Ежечасного архива за глаза хватает. Еще не разу не требовалось восстановить базу на какую-то определенную минут или транзакцию.
25 Dmitrii
 
гуру
17.03.17
10:02
(21) А что не так с разностными бекапами?
У нас ни разу (3 разать тьфу) не было проблем.
26 Fish
 
17.03.17
10:02
(22) Чтобы можно было восстановиться на любой момент времени, а не на момент создания бэкапа.
27 Дарлок
 
17.03.17
10:10
(25) неплохо проверить админов на умение их развертывать )
(26) никогда не встречал такой необходимости. Обычно админы просто по дефолту фулл оставляют.
28 sidalexsandr
 
17.03.17
10:40
(5) Как сделать имя копии должно быть UPP_2017-03-11 (то есть UPP_Текущая дата)?
29 bodri
 
17.03.17
10:45
(28) он сам генерить имя в формате ИмяБазы_ГодМесяцДеньЧасМинутаСекунда
30 Одинесю
 
17.03.17
10:46
(28) Батником делал. Копию переименовываешь, переносишь куда надо, удаляешь. Батник регламентом.
31 Fish
 
17.03.17
10:47
(27) "никогда не встречал такой необходимости. " - А я частенько. У нас модель фулл выбрана не по умолчанию (вроде по умолчанию как раз симпл, но могу путать), а вполне осознанно и по необходимости.
32 bodri
 
17.03.17
10:50
(31) В полной по умолчанию Фулл, а в экспрессе Симпл