Оператор резервного копирования не может использоваться в транзакции при выполнении с помощью курсора pyodbc. Кажется, что pyodbc выполняет запрос внутри транзакции по умолчанию. Я также попытался использовать режим autocommit или добавить оператор commit перед оператором резервного копирования. Оба они не работают.Как создать резервную копию базы данных pyodbc
#can't execute the backup statement in transaction
cur.execute("backup database database_name to disk = 'backup_path'")
#not working too
cur.execute("commit;backup database database_name to disk = 'backup_path'")
Возможно ли выполнить резервное копирование pyodbc? Заранее спасибо!
----- Добавлена дополнительная информация -------------------------------------- ---------------------------------
Операция резервного копирования инкапсулируется в функции, например:
def backupdb(con, name, save_path):
# with autocommit mode, should be pyodbc.connect(con, autocommit=True)
con = pyodbc.connect(con)
query = "backup database %s to disk = '%s'" % (name, save_path)
cur = con.cursor()
cur.execute(query)
cur.commit()
con.close()
Если функция вызывается следующим кодом,
backupdb('DRIVER={SQL Server};SERVER=.\sqlexpress;DATABASE=master;Trusted_Connection=yes',
'DatabaseName',
'd:\\DatabaseName.bak')
то исключение будет:
File "C:/Documents and Settings/Administrator/Desktop/bakdb.py", line 14, in <module>'d:\\DatabaseName.bak')
File "C:/Documents and Settings/Administrator/Desktop/bakdb.py", line 7, in backupdb cur.execute(query)
ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot perform a backup or restore operation within a transaction. (3021) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]BACKUP DATABASE is terminating abnormally. (3013)')
С открытием ключевого слова autocommit = True, функция будет работать тихо, но в резервной папке не создается резервный файл.
У вас есть усталость 'cur.autocommit = True' перед выполнением резервного копирования? Также дайте больше информации о базе данных и покажите нам сообщение об ошибке. –
@ MichałNiklas, добавлена дополнительная информация, спасибо. – Erxin