使用 Python 将 .bak 文件还原到 MSSQL

Restore .bak file to MSSQL using Python

提问人:dunnadad 提问时间:11/7/2023 最后编辑:Thom Adunnadad 更新时间:11/21/2023 访问量:56

问:

我撞到了一堵砖墙。我尝试了各种形式并通过权限等进行故障排除。 最终,我尝试使用 python 将 .bak 文件还原到 MSSQL。我可以通过 MS Server Management Studio 手动还原,但是,我想自动执行还原和删除功能,以便我可以运行一系列数据库来执行查询。

  • Python 3.11.5 通过 Anaconda 环境
  • Jupyter 笔记本
  • 用户体验是名义上的

我已经对此进行了详细研究,但找不到解决方案。任何帮助将不胜感激。

下面是我的返回代码;

import pyodbc

server_name = 'DESKTOP-OEBL7M5\\FYRE'
database_name = 'shell'
target_database_name = 'Hoosker_Doo_6H'
windows_authentication = True
username = 'DESKTOP-OEBL7M5\\BKR'
password = None
backup_file_path = 'C:\\Database\\Raw Data Files\\New Database Files'

if windows_authentication:
    conn_str = f'DRIVER={{SQL Server}};SERVER={server_name};DATABASE={database_name};Trusted_Connection=yes;'
else:
    conn_str = f'DRIVER={{SQL Server}};SERVER={server_namer};DATABASE={database_name};UID={username};PWD={password}'

try:
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()
except Exception as e:
    print(f"Error: {e}")

restore_query = f'''
RESTORE DATABASE {target_database_name}
FROM DISK = '{backup_file_path}'
WITH REPLACE, RECOVERY;
'''

try:
    conn.autocommit = True
    cursor.execute(restore_query)
    print(f"Databse '{target_database_name}' restored successfully!")
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.autocommit = False
    if conn is not None:
        conn.close()

错误: ('42000', “[42000] [Microsoft] [ODBC SQL Server 驱动程序] [SQL Server] 无法打开备份设备'C:\数据库\原始数据文件\新数据库文件'。操作系统错误 5(访问被拒绝。(3201) (SQLExecDirectW);[42000] [Microsoft] [ODBC SQL Server 驱动程序] [SQL Server] 还原数据库异常终止。(3013)")

蟒蛇 sql-server pyodbc

评论

1赞 Thom A 11/7/2023
不要忘记路径是相对于 SQL Server 主机的,而不是相对于本地计算机的,并且运行 SQL Server 的服务帐户需要访问备份所在的路径。RESTORE
0赞 Charlieface 11/7/2023
也不要将数据库和文件名注入到查询中,请使用诸如RESTORE DATABASE @db FROM DISK = @file
0赞 dunnadad 11/8/2023
@ThomA我在MSSMS中运行了“SELECT HOST_NAME()”命令,它返回了“DESKTOP-OEBL7M5”。我还授予了对“共享”和“高级共享”配置下的备份路径的完全权限,以便“Everyone”具有完整的读/写功能。
0赞 dunnadad 11/8/2023
@Charlieface我有点困惑——那我应该怎么写restore_query呢?
1赞 AlwaysLearning 11/8/2023
如果设置为 .bak 文件而不是文件夹的完整路径,会发生什么情况?backup_file_path

答:

1赞 AshMas 11/21/2023 #1

我认为您的代码中有一个错别字:

conn_str = f'DRIVER={{SQL Server}};SERVER={server_namer};DATABASE={database_name};UID={username};PWD={password}'

替换为和其余代码就可以了。'server_namer''server_name'

最好