SQL DBMI中无需重生成完整.bak,绕过日志恢复备份的方案咨询
可行替代方案:无需重新生成完整备份恢复SQL DBMI的多日志文件备份
问题背景
尝试在Azure Databricks中通过以下代码恢复Azure SQL托管实例(DBMI)的备份文件时,遇到错误提示DBMI不支持从包含多个日志文件的备份恢复,且无法重新生成不含日志的完整备份:
url2 = 'https:/[REDACTED]/PROD_2009_2round.bak' # Define restore command using the credential object restore_command = f""" RESTORE DATABASE [PROD_2009] FROM URL = '{url2}'; """ # Execute restore command cursor.execute(restore_command) # Close cursor and connection cursor.close() conn.close()
错误信息:
ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Restoring from a backup that contains multiple log files is not supported in SQL Database Managed Instance. (41921) (SQLExecDirectW)')
替代方案
方案1:在SQL Server实例上预处理备份文件(本地/Azure VM)
- 将目标
.bak文件下载到本地SQL Server或Azure VM上的SQL Server实例中 - 执行
RESTORE FILELISTONLY命令查看备份内的文件列表,确认数据文件和日志文件的逻辑名:
RESTORE FILELISTONLY FROM DISK = 'C:\your-path\PROD_2009_2round.bak'
- 恢复数据库时仅保留数据文件,将日志文件重定向到临时位置,之后清理日志:
RESTORE DATABASE [PROD_2009_TEMP] FROM DISK = 'C:\your-path\PROD_2009_2round.bak' WITH MOVE 'YourDataFileLogicalName' TO 'C:\temp\PROD_2009.mdf', MOVE 'YourLogFileLogicalName' TO 'C:\temp\PROD_2009.ldf', REPLACE
- 对预处理后的数据库生成仅含数据的备份:
BACKUP DATABASE [PROD_2009_TEMP] TO DISK = 'C:\your-path\PROD_2009_CLEAN.bak' WITH COPY_ONLY, COMPRESSION, STATS = 10
- 将新生成的
PROD_2009_CLEAN.bak上传回原存储位置,再在Databricks中执行原恢复命令即可
方案2:结合AZCopy批量处理Blob存储中的备份
如果备份文件已存储在Azure Blob存储,可通过AZCopy工具完成下载-处理-上传流程:
- 下载备份到Azure VM的SQL Server实例:
azcopy copy "https://[your-storage-account].blob.core.windows.net/your-container/PROD_2009_2round.bak" "D:\backups\PROD_2009_2round.bak" --sas-token "[your-sas-token]"
- 按照方案1的步骤处理备份,生成干净的备份文件
- 将新备份上传回Blob存储:
azcopy copy "D:\backups\PROD_2009_CLEAN.bak" "https://[your-storage-account].blob.core.windows.net/your-container/PROD_2009_CLEAN.bak" --sas-token "[your-sas-token]"
- 在Databricks中恢复新的备份文件
方案3:自动化处理流程(适用于重复场景)
如果需要频繁处理此类备份,可通过Azure Data Factory(ADF)或Azure Logic Apps配置自动化管道:
- 配置Blob存储到Azure VM的文件复制活动
- 添加T-SQL执行活动,完成备份预处理和新备份生成
- 配置VM到Blob存储的文件上传活动
- 触发Databricks作业执行恢复命令
内容的提问来源于stack exchange,提问作者Nathanael Tom Aterado
相关产品推荐
相关产品推荐

