如何通过pyodbc备份数据库

Erx*_*xin 3 python database backup pyodbc

使用pyodbc游标执行时,不能在事务中使用backup语句.似乎pyodbc在默认事务中执行查询.我还尝试使用自动提交模式或在备份语句之前添加commit语句.这两个都不起作用.

#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'")
Run Code Online (Sandbox Code Playgroud)

是否可以通过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()
Run Code Online (Sandbox Code Playgroud)

如果通过以下代码调用该函数,

backupdb('DRIVER={SQL Server};SERVER=.\sqlexpress;DATABASE=master;Trusted_Connection=yes',
             'DatabaseName',
             'd:\\DatabaseName.bak')
Run Code Online (Sandbox Code Playgroud)

那么例外将是:

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)')
Run Code Online (Sandbox Code Playgroud)

打开关键字autocommit = True后,该函数将以静默方式运行,但备份文件夹中没有生成备份文件.

Bry*_*yan 9

假设您使用的是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()
Run Code Online (Sandbox Code Playgroud)

这是使用pyodbc 3.0.7Python 3.3.2.我相信对于旧版本的pyodbc,你需要使用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()
Run Code Online (Sandbox Code Playgroud)

值得注意的是,我没有必要使用Cursor.nextset()来使用当前版本的pyodbc和SQL Server 2008 R2创建备份文件.

  • 对我来说,当不使用“whilecursor.nextset():pass”部分时,我的备份将运行,但不会报告失败,并且不会保留任何备份文件。这些线路让它发挥作用。与此问题类似:https://github.com/mkleehammer/pyodbc/issues/471 (2认同)