【问题标题】:Error: "Cannot perform a backup or restore operation within a transaction." when trying to backup MSSQL database using pyodbc and freetds错误:“无法在事务中执行备份或恢复操作。”尝试使用 pyodbc 和 freetds 备份 MSSQL 数据库时
【发布时间】:2014-08-06 18:45:49
【问题描述】:

当我尝试使用 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”的参考可以解决这个问题,但这似乎根本没有任何区别。

有人对此有什么有用的见解可以分享吗?

提前致谢,迈克

【问题讨论】:

  • DATABASE=&lt;database&gt; 您使用的是目标数据库名称还是Master ??应该是Master
  • @M.Ali 感谢您的回复。我不确定我是否关注你,但我在连接字符串中将数据库名称交换为 Master,但我得到了以下错误。 pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]Could not find stored procedure 'dbo.backupStashDB'. (2812) (SQLExecDirectW)"是我误会你的回复还是这个存储过程“放错地方了”?
  • @SwedishMike 您收到的存储过程错误是由于master 中不存在该存储过程。您收到的原始错误不是由无效的数据库上下文引起的。使用您的原始代码备份并查看我对类似问题的回答 here
  • @beargle 也非常感谢您的回复。我查看了您的回复,我看到您建议在其中添加 autocommit=True 部分,或者我是否遗漏了其他内容?如果是这样,我的代码中确实有那个位,但我仍然收到交易错误?
  • 另一条评论,虽然这不是原因;你实际上想使用“TDS_Version=7.2;”在您的连接字符串中,每个 freetds.org/userguide/choosingtdsprotocol.htm

标签: python sql-server pyodbc freetds


【解决方案1】:

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)
...

【讨论】:

  • 非常感谢 - 这解释并解决了这一切。你是明星!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多