Имя: Пароль:
1C
1C 7.7
v7: Создание бекапа из 1С.
0 varelchik
 
03.12.13
16:34
Откуда:
Сообщений: 1    Ситуация следующая.
Использую 1С++ для прямых запросов к базе.
Вроде все тривиально.

Запрос=глСоединение();
Текст="
|BACKUP DATABASE [BUH_BEST] TO DISK = N'D:\BACKUP\BUH_BEST.bak'
|WITH NOFORMAT, INIT
|";
Сообщить("НАчало");
Стат=Запрос.ВыполнитьСкалярный(Текст);

Так вот когда запускаю, файл BUH_BEST.bak в положенном месте появляется.
А как только запрос отработал, то тут же исчезает.
Хотя та же процедура в менежмент студио работает нормально и файл не пропадает.
Подскажите в какую сторону рыть?
1 ADirks
 
03.12.13
17:02
а вот если сказать
Запрос.Выполнить(Текст);
то файло остаётся, зато 1С падает :)
видимо, всё это как-то связано со статистикой, которая выдаётся в message.
2 trad
 
03.12.13
17:04
Текст="
    |BACKUP DATABASE [BUH_BEST] TO DISK = N'D:\BACKUP\BUH_BEST.bak'
    |WITH NOFORMAT, INIT, STATS=100
    |";
    Запрос.Выполнить(Текст);
    Предупреждение("!",1);
3 varelchik
 
03.12.13
17:07
(1),(2) не канает.
всеравно пропадает.
4 varelchik
 
03.12.13
17:15
Стат=Запрос.ВыполнитьИнструкцию(Текст);
та же хрень.
5 varelchik
 
03.12.13
17:18
Запрос=глСоединение();
    Текст="
    |BACKUP DATABASE [BUH_BEST] TO DISK = N'D:\BACKUP\BUH_BEST.bak'
    |--WITH NOFORMAT, INIT, STATS=100
    |";
    Стат=Запрос.Выполнить(Текст);

а вот так работает.
и база не падает.
6 trad
 
03.12.13
17:18
ВыполнитьИнструкцию и ВыполнитьСкалярный точно не подойдут
попробуй в предупреждении таймаут увеличить
7 varelchik
 
03.12.13
17:18
и файл сохраняеться.
всем спасибо за наводку.
8 varelchik
 
03.12.13
17:18
(6) смотри комент.
9 trad
 
03.12.13
17:21
глСоединение у тебя наверняка возвращает глобальную переменную. Так?
10 Ёпрст
 
03.12.13
17:22
тест на вшивость

   Текст="
    |BACKUP DATABASE [BUH_BEST] TO DISK = N'D:\BACKUP\BUH_BEST.bak' WITH NOFORMAT, INIT, STATS=100";
    Стат=Запрос.Выполнить(Текст);
11 trad
 
03.12.13
17:32
(9)+
Если глСоединение возвращает глобальную переменную, то hstmt после выполнения останется открытым, ибо Выполнеть() его не закрывает.
Из-за этого будет невозможно получить какие-либо другие данные данные.
Поэтому нужно после Выполнить() обязательно вызывать Закрыть()
И тут снова получаем (0)
Между Выполнить() и Закрыть() нужна пауза, чтобы дать серверу закончить работу с файлом.
12 trad
 
03.12.13
17:33
А ВыполнитьИнструкцию и ВыполнитьСкалярный это Выполнить+Закрыть в одном флаконе
13 Ёпрст
 
03.12.13
17:34
а вот нафига это всё ?
ежели не секрет ?
скоммуниздить базу и отправить по почте ?...
14 ADirks
 
03.12.13
17:36
(11) во, у меня как раз из-за этого падало
вот так
    Запрос = СоздатьОбъект("ODBCRecordSet");
    Текст = "Set NoCount ON
    |BACKUP DATABASE [base] TO DISK = 'c:\tmp\base.bak'
    |";
    Стат = Запрос.Выполнить(Текст);
    Если Стат <> 1 Тогда
        Сообщить(ЗапросСКЛ.ПолучитьОписаниеОшибки(), "!");
    КонецЕсли;

не падает, но файло удаляет. Прикольно...
15 ADirks
 
03.12.13
17:38
ага, про таймаут пропустил
с таймаутом всё пучком
16 trad
 
03.12.13
17:39
(14)вот, если Запрос создать локально, то hstmt закроется при разрушении локальной переменной
17 trad
 
03.12.13
17:44
(15)
сервер сделал бекап, но видимо какие то файловые операции не закончив, кидает месседж клиенту, что все ОК.
Метод Выполнить() получает месседж, смотрит, что роусета никакого нет и заканчивает свою работу.
Модуль заканчивается, стейтмент закрывается, но сервер то еще не кончил.
Для него, для сервера - это аборт, вот он файло и грохает.
18 trad
 
03.12.13
17:48
(17) +
точнее сервер кидает серию сообщений, но Выполнить() реагирует только на первое, во время которого операция бекапа еще не совсем завершена и ему не хватает долей секунд, и его абортят
19 Холст
 
03.12.13
17:55
а если из 1С запускать батник ?
20 varelchik
 
03.12.13
18:26
с бекапам решили.
теперь процесс обратный восстановить базу но уже в другом месте.
21 varelchik
 
03.12.13
18:28
тута уже хуже.
    Текст="
    |set nocount on
    |RESTORE DATABASE [BUH] FROM  DISK = N'"+КаталогИБ()+"\BUH_BEST.bak' WITH  FILE = 1,REPLACE
    |";
    Стат=Запрос.Выполнить(Текст);
типа возвращает Стат=1
и выполнение заканчивается.
Но!
в менежменте висит Восстановление из резервной копии.
И усе.
22 varelchik
 
03.12.13
18:30
хотя таже строка выполненая из менежмент студио восстанавливает путем.
вот только еще и выдает сообщения.
Обработано 87624 страниц для базы данных "BUH", файл "BUH_BAT" для файла 1.
Обработано 2 страниц для базы данных "BUH", файл "BUH_BAT_log" для файла 1.
RESTORE DATABASE успешно обработал 87626 страниц за 149.114 секунд (4.590 MБ/сек).
23 varelchik
 
03.12.13
18:31
может как-то моно выключить вывод сообщений?
походу он скорее всего влияет.
24 varelchik
 
03.12.13
18:32
у кого какие идеи?
25 varelchik
 
03.12.13
18:34
(11) А это мысль.
Щас в после выполнить вставил.
глПауза(10);
Посмотрим что выйдет.
26 varelchik
 
03.12.13
18:38
ЕССССССССССССССССССССС!
10 сек фатило шоб закончило!
Между Выполнить()
и Закрыть()
надо время как говорилось в (11).
Всем спасибо за помощь.
27 varelchik
 
03.12.13
18:53
(13) Не ну почему секрет?
задовбали проверки.
решили сделать копию бухии.
шо если шо основную базу выключить и показать копию.
28 trad
 
03.12.13
22:37
А если 10 сек не хватит что будешь делать?
29 trad
 
03.12.13
22:48
Я бы через адо сделал и не мучился
30 varelchik
 
04.12.13
09:31
(28) это даже много.
там число вывод сообщений.
по на вскидку тама пару сек.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн