Уведомления

Группа в Telegram: @pythonsu

#1 Июль 3, 2009 07:13:06

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

сделал такой скрипт:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pymssql

conn = pymssql.connect(host='127.0.0.1', user='auto', password='auto', database='torg')
cur = conn.cursor()
cur.execute("BACKUP DATABASE torg TO DISK = 'e:\torg.bak' with init")
conn.close()
выдает ошибку:
pymssql.OperationalError: SQL Server message 3021, severity 16, state 0, line 1:
Cannot perform a backup or restore operation within a transaction.
SQL Server message 3013, severity 16, state 1, line 1:
BACKUP DATABASE is terminating abnormally.

я так понял он пишет что не может запустить бекап в режиме транзакции, но почему включилась эта транзакция?
(в инете пошарил по этому вопросу, на забугорных сайтах вроде что-то есть но непонятное)
жанный запрос под этим пользователем прекрасно работает из QueryAnalacer

что делать?

Отредактировано (Июль 3, 2009 07:13:49)

Офлайн

#2 Июль 3, 2009 08:57:27

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

pymssql сама оборачивает запрос в begin tran - commit (rollback).

o7412369815963
что делать?
Менять код pymssql, использовать другую библиотеку, вынести бэкап в отдельный от программы скрипт и запускать из CMD-файла.



Отредактировано (Июль 3, 2009 08:59:19)

Офлайн

#3 Июль 3, 2009 12:27:10

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

Извнияюсь за возможно глупый ответ от человека, который не пользовался pymssql вообще :)
Первое, что бросилось в глаза, это ‘e:\torg.bak’… \t не эскейпится случайно ли в символ TAB?



Отредактировано (Июль 3, 2009 12:27:51)

Офлайн

#4 Июль 3, 2009 12:37:00

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

igor.kaist
не эскейпится случайно ли в символ TAB?
До этого не доходит просто. Ругалось бы по-другому.

В pymssql __init соединения прописано:
self.__cnx.query(“begin tran”)

И далее в коде
def commit(self):

self.__cnx.query(“commit tran”)
self.__cnx.fetch_array()
self.__cnx.query(“begin tran”)

Вот так вот. Ни много, ни мало, транзакция висит сразу после открытия соединения и после завершения операции открывается еще одна :)



Отредактировано (Июль 3, 2009 12:37:51)

Офлайн

#5 Июль 3, 2009 13:02:46

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

Как вариант, можно через odbc к mssql подключиться. Более муторно, но все же…



Офлайн

#6 Июль 3, 2009 14:01:15

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

а если перед отправкой запроса “бекапа”, отправить запрос об закрытии транзакции?

Офлайн

#7 Июль 3, 2009 14:04:59

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

    conn = pymssql.connect(host='127.0.0.1', user='auto', password='auto', database='torg')
cur = conn.cursor()
print 'exec'
cur.execute("commit tran")
cur.execute("BACKUP DATABASE torg TO DISK = 'e:\\torg.bak' with init")
cur.execute("begin tran")
conn.close()
вроде сработало

всем спасибо

Офлайн

#8 Июль 3, 2009 14:34:36

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

Хак в чистом виде :)
Только лучше уж сначала проверить, существует ли транзакция, прежде чем делать commit. Кстати, а почему commit, а не rollback?



Офлайн

#9 Июль 3, 2009 15:42:17

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

Lexander
Хак в чистом виде :)
Только лучше уж сначала проверить, существует ли транзакция, прежде чем делать commit. Кстати, а почему commit, а не rollback?
так, на скорую руку написал. по идее должно быть бе разницы, изменений же никаких не производиться.
а как можно проверить включена ли транзакция?

Офлайн

#10 Июль 3, 2009 18:21:07

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

backup MSSQL ошибка :(

o7412369815963
по идее должно быть бе разницы
Для сервера БД это важно. Он все равно выполняет работу с системными таблицами, логом транзакций. Я по памяти не могу сказать какую команду оптимальнее использовать. Лучше об этом почитать в BOL.
o7412369815963
а как можно проверить включена ли транзакция?
Средствами сервера - проверить значение @@TRANCOUNT, может быть сама библиотека может выдать инфу об открытых транзакциях.



Отредактировано (Июль 3, 2009 18:22:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version