Sql server Pyodbc-SQL Server数据库还原不完整
我正在尝试使用下面的脚本在Windows中从python 3.7还原数据库 按预期正确删除数据库功能 还原数据库未按预期工作,数据库始终显示“Restoring…”且从未完成 数据库文件位于指定路径中,但数据库不可用 如何解决这个问题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
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,将此标记为答案,以便它可以帮助其他人回答类似的问题。接受为答案。