Найти - Пользователи
Полная версия: backup MSSQL ошибка :(
Начало » Базы данных » backup MSSQL ошибка :(
1
o7412369815963
сделал такой скрипт:
#!/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

что делать?
Lexander
pymssql сама оборачивает запрос в begin tran - commit (rollback).
o7412369815963
что делать?
Менять код pymssql, использовать другую библиотеку, вынести бэкап в отдельный от программы скрипт и запускать из CMD-файла.
igor.kaist
Извнияюсь за возможно глупый ответ от человека, который не пользовался pymssql вообще :)
Первое, что бросилось в глаза, это ‘e:\torg.bak’… \t не эскейпится случайно ли в символ TAB?
Lexander
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”)

Вот так вот. Ни много, ни мало, транзакция висит сразу после открытия соединения и после завершения операции открывается еще одна :)
igor.kaist
Как вариант, можно через odbc к mssql подключиться. Более муторно, но все же…
o7412369815963
а если перед отправкой запроса “бекапа”, отправить запрос об закрытии транзакции?
o7412369815963
    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()
вроде сработало

всем спасибо
Lexander
Хак в чистом виде :)
Только лучше уж сначала проверить, существует ли транзакция, прежде чем делать commit. Кстати, а почему commit, а не rollback?
o7412369815963
Lexander
Хак в чистом виде :)
Только лучше уж сначала проверить, существует ли транзакция, прежде чем делать commit. Кстати, а почему commit, а не rollback?
так, на скорую руку написал. по идее должно быть бе разницы, изменений же никаких не производиться.
а как можно проверить включена ли транзакция?
Lexander
o7412369815963
по идее должно быть бе разницы
Для сервера БД это важно. Он все равно выполняет работу с системными таблицами, логом транзакций. Я по памяти не могу сказать какую команду оптимальнее использовать. Лучше об этом почитать в BOL.
o7412369815963
а как можно проверить включена ли транзакция?
Средствами сервера - проверить значение @@TRANCOUNT, может быть сама библиотека может выдать инфу об открытых транзакциях.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB