错误:“无法在事务内进行备份或恢复操作。”在使用pyodbc和freetds备份MSSQL数据库时出现

4 投票
1 回答
2590 浏览
提问于 2025-04-18 16:17

我现在在用pyodbc和freetds从Linux主机备份MSSQL数据库时遇到了一些问题。我的环境版本如下:

Python 2.7.6,pyodbc 3.0.7,freetds 0.91-2,Centos 6.5

我运行的代码如下(名字和密码等信息已去掉):

import pyodbc

conn = pyodbc.connect('DRIVER=FreeTDS;SERVER=<servername>;PORT=<port>;DATABASE=<database>;UID=<user>;PWD=<password>;TDS_Version=8.0;Autocommit=True;')
sql = "exec dbo.backupStashDB"
cursor=conn.cursor().execute(sql)
while cursor.nextset():
   pass
conn.close()

我收到的错误信息是:

exec dbo.backupnameDB
Traceback (most recent call last):
  File "soph_stash_db_bkp.py", line 6, in <module>
conn.execute(sql)
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Cannot perform a backup or restore operation within a transaction. (3021) (SQLExecDirectW)')

无论是手动运行命令还是通过存储过程运行这段代码,我都得到了相同的错误信息。

我在网上查了一下,发现有人提到添加'Autocommit=True'可以解决这个问题,但这似乎没有任何效果。

有没有人能分享一些有用的见解呢?

提前感谢,Mike

1 个回答

4

autocommit 应该作为一个关键字参数传递给 pyodbc.connect 函数,而不是放在 ODBC 连接字符串里。可以查看以下部分:

"有些关键字是 pyodbc 使用的,并不会传递给 odbc 驱动程序..."


请将你的代码修改为以下内容:

...
conn = pyodbc.connect('DRIVER=FreeTDS;SERVER=<servername>;PORT=<port>;DATABASE=<database>;UID=<user>;PWD=<password>;TDS_Version=8.0;',
                      autocommit=True)
...

撰写回答