2013-11-19 8 views
2

Оператор резервного копирования не может использоваться в транзакции при выполнении с помощью курсора 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, функция будет работать тихо, но в резервной папке не создается резервный файл.

+0

У вас есть усталость 'cur.autocommit = True' перед выполнением резервного копирования? Также дайте больше информации о базе данных и покажите нам сообщение об ошибке. –

+0

@ MichałNiklas, добавлена ​​дополнительная информация, спасибо. – Erxin

ответ

7

Предполагая, что вы используете SQL Server, укажите autocommit=True, когда соединение постройки:

>>> import pyodbc 
>>> connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}', 
           server='InstanceName', database='master', 
           trusted_connection='yes', autocommit=True) 
>>> backup = "BACKUP DATABASE [AdventureWorks] TO DISK = N'AdventureWorks.bak'" 
>>> cursor = connection.cursor().execute(backup) 
>>> connection.close() 

Это использование pyodbc 3.0.7 с Python 3.3.2. Я считаю, что с более старыми версиями pyobbc вам нужно было использовать Cursor.nextset() для создаваемого файла резервной копии. Например:

>>> import pyodbc 
>>> connection = pyodbc.connect(driver='{SQL Server Native Client 11.0}', 
           server='InstanceName', database='master', 
           trusted_connection='yes', autocommit=True) 
>>> backup = "E:\AdventureWorks.bak" 
>>> sql = "BACKUP DATABASE [AdventureWorks] TO DISK = N'{0}'".format(backup) 
>>> cursor = connection.cursor().execute(sql) 
>>> while cursor.nextset(): 
>>> pass 
>>> connection.close() 

Стоит отметить, что я не должен использовать Cursor.nextset() для резервного копирования файла, который будет создан с текущей версией pyodbc и SQL Server 2008 R2.

+0

Версия pyodbc - pyodbc-3.0.7.win32-py2.7, а среда python - py2.7, я запускаю сценарий резервного копирования в XP с помощью SQL Express 2005. Ваши первые фрагменты кода вызовут исключение, как я упоминаю в вопрос. Я попробую второй. – Erxin

+0

@Erxin Пожалуйста, отредактируйте свой вопрос с фактическим текстом исключения, который зарегистрирован – Bryan

+0

Добавлена ​​информация об исключении и фрагменты кода. Спасибо за вашу помощь. :) – Erxin

Смежные вопросы