|
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) это даже много.
там число вывод сообщений. по на вскидку тама пару сек. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |