Имя: Пароль:
1C
 
Не могу восстановить базу из SQL бекапа.
,
0 Druzh0k
 
13.09.20
22:23
Мне нужно программно создать бэкап SQL базы, потом ее обновить и в случае ошибки восстановить базу из бэкапа. Это мой первый опыт работы с SQL сервеом и SQL базами. Бэкап базы создается, а восстановление - нет. Может кто подскажет возможные причины.  Я подключаюсь с другой базы (активных сеансов в базе нет).

Функция создания бэкапа (работает):

                СтрокаСоединения = "Password="+ПараметрыАвтообновленияБазы.ПарольSQL+";User ID="+ПараметрыАвтообновленияБазы.ПользовательSQL+
                ";InitialCatalog="+ПараметрыАвтообновленияБазы.ИмяБазыSQL+";Data Source="+ПараметрыАвтообновленияБазы.ИмяСервераSQL;              

                Попытка
                               СоединениеSQL = Новый COMObject("ADODB.Connection");              
                               СоединениеSQL.Provider="SQLOLEDB";
                               СоединениеSQL.ConnectionString=СтрокаСоединения;
                               СоединениеSQL.ConnectionTimeout = 30;
                               СоединениеSQL.CommandTimeout = 3600;
                               СоединениеSQL.Open();
                Исключение
                               Возврат "Ошибка подключения к серверу SQL: "+ОписаниеОшибки();
                КонецПопытки;          

                местоНаДиске = ПутьКФайлу+"\Backup_"+ПараметрыАвтообновленияБазы.ИмяБазыSQL+Формат(ТекущаяДата(),"ДФ=ггММддЧЧммсс")+".BAK";

                ТекстЗапроса = "

                |DECLARE @physical_backup_device nvarchar(255)
                |
                |SET @physical_backup_device = N'"+местоНаДиске+"'
                |
                |BACKUP DATABASE ["+ПараметрыАвтообновленияБазы.ИмяБазыSQL+"]
                |TO  DISK = @physical_backup_device
                |WITH
                |  COPY_ONLY, INIT, NOUNLOAD, COMPRESSION,
                |  NAME = N'Work_"+ПараметрыАвтообновленияБазы.ИмяБазыSQL+"_backup', NOSKIP, STATS = 10, NOFORMAT";

                Команда     = Новый COMОбъект("ADODB.Command");
                Команда.ActiveConnection   = СоединениеSQL;
                Команда.CommandText = ТекстЗапроса;

                Попытка
                               Команда.Execute();
                Исключение
                               СоединениеSQL.Close();
                               Возврат "Ошибка выполнения запроса SQL: "+ОписаниеОшибки();
                КонецПопытки;              

                СоединениеSQL.Close();
                Возврат 0;

Функция восстановления (не работает, обламывается при выполнении скрипта):

СтрокаСоединения = "Password="+ПараметрыАвтообновленияБазы.ПарольSQL+";User ID="+ПараметрыАвтообновленияБазы.ПользовательSQL+
";Initial Catalog="+ПараметрыАвтообновленияБазы.ИмяБазыSQL+";Data Source="+ПараметрыАвтообновленияБазы.ИмяСервераSQL;              

                Попытка
                               СоединениеSQL = Новый COMObject("ADODB.Connection");      
                               СоединениеSQL.Provider="SQLOLEDB";
                               СоединениеSQL.ConnectionString=СтрокаСоединения;
                               СоединениеSQL.ConnectionTimeout = 30;
                               СоединениеSQL.CommandTimeout = 3600;
                               СоединениеSQL.Open();
                Исключение
                               Возврат "Ошибка подключения к серверу SQL: "+ОписаниеОшибки();
                КонецПопытки;              

                ТекстЗапроса="RESTORE DATABASE ["+ПараметрыАвтообновленияБазы.ИмяБазыSQL+"]
                |FROM DISK = '"+ПутьКФайлу+"'
                |WITH
                |FILE = 1,  NOUNLOAD, STATS = 10";    

                Команда     = Новый COMОбъект("ADODB.Command");
                Команда.ActiveConnection   = СоединениеSQL;
                Команда.CommandText = ТекстЗапроса;  

                Попытка
                               Команда.Execute();
                Исключение
                               СоединениеSQL.Close();
                               Возврат "Ошибка выполнения запроса SQL: "+ОписаниеОшибки();
                КонецПопытки;        

                СоединениеSQL.Close();

                Возврат 0;
1 vde69
 
13.09.20
22:26
сначала сделай это не из 1с а из консоли SQL
2 Ёпрст
 
13.09.20
22:34
REPLACE не хватает и.. ты в туже базу восстанавливаешщь, а оно точно надо ?
3 Ёпрст
 
13.09.20
22:37
WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10 вот так пробуй
4 Druzh0k
 
14.09.20
07:57
(2) да, мне нужно в ту же базу восстановить.
(3) так тоже не работает
5 MyNick
 
14.09.20
08:00
(4) "да, мне нужно в ту же базу восстановить."
Если это тестовая база, ок.
Но если боевая - за такую "автоматизацию" отпиливают руки ржавой пилой.
6 MyNick
 
14.09.20
08:02
(0) " и в случае ошибки восстановить базу из бэкапа"

А что за ошибки такие, что требуется автовосстановление боевой из бэкапа? Они у вас ежедневно происходят?
Мне за 17 лет работы с 1С ни разу не требовалось восстанавливать боевую базу (ну кроме всяких миграций в облака и т.п.). Что уж там говорить про автоматический скрипт для этого...
7 rphosts
 
14.09.20
08:05
В (1) вам всё правильно написали! Заставьте свою поделку работать из консольки и только потом....
8 Druzh0k
 
14.09.20
08:08
(5)  Я делаю автообновление конфигурации. В случае ошибки при обновлении мне нужно восстанавливать базу из бекапа.
9 MyNick
 
14.09.20
08:13
(8) какая жесть...
10 Александр111
 
14.09.20
08:13
попробуй остановить сервер 1с, а потом восстановить
11 MyNick
 
14.09.20
08:14
Вас бы в режим 24*7 бросить хотя бы с парой сотен пользователей и тысячами заказов в сутки, чтобы напрочь отбить желание заниматься такой автоматизированной херней
12 Druzh0k
 
14.09.20
08:24
(11) проблема в том, что у нас именно такой режим работы. И мне самой страшно, но так хочет руководство.
13 fisher
 
14.09.20
09:17
А когда рабочая база разрушится из-за попытки восстановления в нее сбойного бэкапа руководство скажет "каким же дебилом нужно было быть чтобы так понять и реализовать нашу простую но гениальную идею" и уволит.
14 Ёпрст
 
14.09.20
09:26
(4) значит есть активные соединения к базе, прибей их сперва
15 MyNick
 
14.09.20
10:19
(13) точно.
(12) твоя первоочередная задача - защищать систему от еманутых идей.
Считай, что ты с ней уже не справилась. Но еще можно все исправить.
Ибо. Поднятие бэкапа в боевую - это самый серьезный, аварийно-внештатный в работе любого ИТ подразделения шаг.
И должен производиться только вручную. С предстоящим и последующим анализом произошедшего, формулированием выводов, налаживанием системы предупреждения подобных аварий в будущем, расстановки контрольных точек и назначения ответственных.
А не как в этой ветке...
(вангую)
Руководство поручило сделать автозагрузку конфы ночью, в минимум загрузки пользователей и процессов.
ТС парировала - нуяжесплю.
Руководство намекнуло - ну тыжпрограммист, сделайчтобысамо.
ТС - ну мол, а если что-то пойдет не так и все сломается?
Руководство - ну так у нас ведь делаются бэкапы, ДА!?
ТС - ага, значит я все сейчас придумаю...

Так? )
16 Druzh0k
 
14.09.20
10:34
(15) скажу честно там еще все на много хуже.
17 ptiz
 
14.09.20
10:36
(0) " и в случае ошибки " - а что будет являться признаком ошибки?
18 ptiz
 
14.09.20
10:37
+ к (10) - тормози службу 1С
19 MyNick
 
14.09.20
10:38
(16) настолько затрахались поднимать бэкап, что решили сделать это на автомате? )))
20 Druzh0k
 
14.09.20
10:39
(16) почему особо не могу защищать систему от всех идей... я на этом месте работаю 4 месяца - и права качать сильно не могу. Но я постараюсь убедить, что восстанавливать базу из бэкапа автоматически - это совсем плохо.
21 Druzh0k
 
14.09.20
10:40
(19) по озвученной мне статистике для одной из систем за 2 года это пришлось делать один раз.
22 XMMS
 
14.09.20
11:31
Тут может не до конца донесли мысль: если вы отрубаете рабочую базу, и вместо нее заливаете бэкап, то вот список вопросов перед этим:
1. Какой давностью бэкап? Какие изменения уже произошли и будут потеряны?
2. Точно ли бэкап рабочий и проверен? Можно ли терять изменения после него?
3. Сохранили вы  ещё одну копию рабочей БД перед заливкой бэкапа? Корректна ли эта копия?
4. В случае фаталити по всем пунктам выше, есть шанс восстановить данные непосредственно с дисков, если они не перезатерты. Восстановление бэкапа приводит к затиранию старой информации на дисках и сужает возможные экстренные меры в случае необходимости.
23 Druzh0k
 
14.09.20
11:45
(22) 1. Бэкап создан перед обновлением конфигурации. Изменения только те, что возникли в процессе обновления конфигурации. Их как раз нужно потерять.
2.Как можно программно проверить рабочий или нет бэкап, никуда не загружая его.
3.Нет, копий больше нет. Есть бэкапы, которые создаются по регламенту, мой созданный перед обновлением конфигурации и рабочая база.
4.Ну для этого есть бэкапы создаваемые по регламенту (но в них могут быть неполные данные).
24 vde69
 
14.09.20
21:42
(23)
1. все проблемы при обновлении конфигурации должны разливаться ТОЛЬКО вручную
2. в твоем алгоритме нет бекапа проблемной базы, который потом можно крутить
3. если хотите снизить вероятность проблем при обновлении то алгоритм должен быть такой

1. выкидываем всех и переводим базу в сингл моду
2. делаем бекап
3. из бекапа делаем копию базу
4. обновляем копию базы
5. проверяем копию базы
6. далее есть 2 пути,
  а. перегружаем из копии в рабочую
  б. обновляем рабочую и выключам сингл моду
7. в случае проблем на этапе 6 у нас есть полностью рабочая база из 5.