問題
問題一
[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)
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)
conn.commit()
conn.autocommit = False