无法在事务中执行备份或还原操作

时间:2014-12-12 12:11:19

标签: python sql pyodbc

我正在使用PyODBC来备份我的数据库,使用以下代码:

SQL_command = """
                BACKUP DATABASE [MyDatabase]
                TO DISK = N'D:\MSSQL\BACKUP\MyDatabase_20141212.bak' WITH
                      NOFORMAT
                ,     NOINIT
                ,     NAME = N'MyDatabase_20141212'
                ,     SKIP
                ,     REWIND
                ,     NOUNLOAD
                ,     STATS = 10
              """

conn.cursor.execute(SQL_command)

conn.cursor.commit()

上面的代码给出了一条错误消息:

  

pyodbc.ProgrammingError:

     

(' 42000',' [42000] [Microsoft] [ODBC SQL   服务器驱动程序] [SQL Server]无法执行备份或还原操作   在交易中。 (3021)(SQLExecDirectW);

     

[42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server] BACKUP DATABASE是   异常终止。 (3013)&#39)

我尝试在SQL Server中运行SQL代码,它运行正常。

我可以知道我的代码有什么问题吗?

非常感谢。

3 个答案:

答案 0 :(得分:7)

您的错误说

  

无法在事务中执行备份或还原操作。

事务默认在pyodbc中启动,那么如何在不创建事务的情况下执行查询?只需打开自动提交:

conn.autocommit = true
// do stuff
conn.autocommit = false

pyodbc常见问题解答an entry about this

答案 1 :(得分:4)

默认情况下,所有pyodbc连接都以事务开头。

您需要打开自动提交 - 使用autocommit关键字连接函数:

conn.autocommit = true

答案 2 :(得分:0)

其他答案是正确的。您确实需要设置自动提交。但是,该事务将完成,但是由于SQL Server中的一个怪癖及其返回状态消息以进行备份和还原操作的方式,因此实际上不会进行备份。

要解决此问题,您需要遍历这些返回消息,直到没有返回消息为止:

SQL_command = """
                BACKUP DATABASE [MyDatabase]
                TO DISK = N'D:\MSSQL\BACKUP\MyDatabase_20141212.bak' WITH
                      NOFORMAT
                ,     NOINIT
                ,     NAME = N'MyDatabase_20141212'
                ,     SKIP
                ,     REWIND
                ,     NOUNLOAD
                ,     STATS = 10
              """

conn.cursor.execute(SQL_command)
while conn.cursor.nextset():
     pass 

conn.cursor.close()