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
發佈了66 篇原創文章 · 獲贊 81 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章