Pyodbc - SQL 服务器数据库还原不完整

Pyodbc - SQL Server database restore incomplete

我正在尝试使用以下脚本从 Windows 中的 python 3.7 恢复数据库。

删除数据库按预期正常运行。

还原数据库未按预期工作,数据库始终显示 "Restoring...." 并且从未完成。

指定路径下有数据库文件,但数据库不可用

如何解决这个问题?

import pyodbc

try:
    pyconn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=MY-LAPTOP\SQLEXPRESS;DATABASE=master;UID=sa;PWD=sa123')
    cursor = pyconn.cursor()
    pyconn.autocommit = True
    sql = "IF EXISTS (SELECT 0 FROM sys.databases WHERE name = 'data_test') BEGIN DROP DATABASE data_test END"
    pyconn.cursor().execute(sql)

    sql = """RESTORE DATABASE data_test FROM DISK='G:\dbbak\feb-20-2020\data_test_backup_2020_02_20_210010_3644975.bak' WITH RECOVERY,
    MOVE N'Omnibus_Data' TO N'd:\db\data_test.mdf',
    MOVE N'Omnibus_Log' TO N'd:\db\data_test_1.ldf';"""
    print(sql)
    pyconn.cursor().execute(sql)
    while pyconn.cursor().nextset():
        pass 
    pyconn.cursor().close()
except Exception as e:
    print(str(e))

您没有使用单个光标,因此您的程序在恢复完成之前退出,并在中途中止。

应该是这样的:

conn = pyodbc.connect(' . . .')
conn.autocommit = True
cursor = conn.cursor()
cursor.execute(sql)
while cursor.nextset():
    pass 
cursor.close()

0

几小时后我找到了解决方案。必须执行no MASTER,其他session必须终止,DB必须设置为OFFLINE,然后RESTORE再设置为ONLINE。

def backup_and_restore():
server = 'localhost,1433'
database = 'myDB'
username = 'SA'
password = 'password'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE=MASTER;UID='+username+';PWD='+ password)
cnxn.autocommit = True

def execute(cmd):
    cursor = cnxn.cursor()
    cursor.execute(cmd)
    while cursor.nextset():
        pass
    cursor.close()

execute("BACKUP DATABASE [myDB] TO DISK = N'/usr/src/app/myDB.bak'")
execute("ALTER DATABASE [myDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;")
execute("ALTER DATABASE [myDB] SET OFFLINE;")
execute("RESTORE DATABASE [myDB] FROM DISK = N'/usr/src/app/myDB.bak' WITH REPLACE")
execute("ALTER DATABASE [myDB] SET ONLINE;")
execute("ALTER DATABASE [myDB] SET MULTI_USER;")