Python 3 调用pyodbc进行 SQL server 远程数据库备份

问题

问题一

[Microsoft][ODBC SQL Server Driver][SQL Server]不能在事务内部执行备份或还原操作。 (3021) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]BACKUP DATABASE 正在异常终止。
  • 这是因为没有打开 autocommit 开关,执行备份语句前需要:
conn.autocommit = True

问题二

  • 每天定时远程备份数据库,数据库位于服务器A,python程序在服务器B运行
  • 发现最终生成的bak文件虽然最新日期发生了变化,但是其实bak文件里的备份数据库一直停留在第一次在服务器A直接运行backup语句生成的那个版本,并没有被覆盖。
  • 最后发现是因为过早的关闭游标了,导致备份没有正常写进bak文件。
  • 因为我把执行sql语句封装在一个函数里,当执行完backup语句之后,脱离了函数体,游标就被关闭了,我试了下如果在关闭游标前先 time.sleep(5) ,就能成功
def execute(self, sql):
    cur = self.conn.cursor()
    exe = cur.execute(sql)
    # cur.close()  # 如果关闭游标的话,会造成数据库备份不成功
    self.conn.commit()
    return exe

示例

import pyodbc
pyobdcStr = "DRIVER={SQL SERVER};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s"%(server, user, password, DBname)
conn = pyodbc.connect(pyobdcStr)

path = 'D:/schedual_task.bak'
sql = f'''backup database ZQGL to DISK=N'{path}' WITH INIT'''
conn.autocommit = True  # 这个要打开,否则会报错
cur = conn.cursor()
cur.execute(sql) # 执行备份需要一点时间
# cur.close()  # 不能关闭游标
conn.commit() # 记住 commit
conn.autocommit = False

你可能感兴趣的:(Python,SQL)