Sql server Pyodbc-SQL Server数据库还原不完整

Sql server Pyodbc-SQL Server数据库还原不完整,sql-server,pyodbc,restore,Sql Server,Pyodbc,Restore,我正在尝试使用下面的脚本在Windows中从python 3.7还原数据库 按预期正确删除数据库功能 还原数据库未按预期工作,数据库始终显示“Restoring…”且从未完成 数据库文件位于指定路径中,但数据库不可用 如何解决这个问题 import pyodbc try: pyconn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=MY-LAPTOP\\SQLEXPRESS;DATABASE=master

我正在尝试使用下面的脚本在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

几个小时后我找到了解决办法。它必须在没有主机的情况下执行,其他会话必须终止,数据库必须设置为脱机,然后恢复,然后再次设置为联机

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;")

@vasanthkumar,将此标记为答案,以便它可以帮助其他人回答类似的问题。接受为答案。