You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署SQL Server容器后数据库恢复失败求助

问题:Docker部署SQL Server 2019时数据库恢复失败

我尝试通过Dockerfile创建SQL Server 2019容器并恢复数据库,使用的Dockerfile内容如下:

FROM mcr.microsoft.com/mssql/server:2019-latest
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=Password
ENV MSSQL_COLLATION=Lithuanian_CI_AS
ENV MSSQL_TCP_PORT=1433

RUN mkdir -p /var/opt/mssql/backup

COPY ./DVS_demo.bak /var/opt/mssql/backup/DVS_demo.bak
COPY ./DVS_Files.bak /var/opt/mssql/backup/DVS_Files.bak

CMD /bin/bash /opt/mssql-tools/bin/sqlcmd -S localhost -l 50 -U sa -P "Password" -i "RESTORE DATABASE DVS FROM DISK = '/var/opt/mssql/backup/DVS_demo.bak' WITH MOVE 'mvp_Data' TO '/var/opt/mssql/data/DVS_programavimui.mdf', MOVE 'mvp_Log' TO '/var/opt/mssql/data/DVS_programavimui.ldf'" & /opt/mssql/bin/sqlservr

我通过参数-l 50设置了50秒等待时间,尝试恢复数据库但未成功,无任何报错,SQL Server可正常启动但数据库未恢复,想请教问题原因。


问题分析与解决办法
  • SQL Server启动时序不匹配:你用&将恢复命令与sqlservr进程并行启动,此时恢复命令执行时SQL Server大概率还没完成初始化。即便设置了50秒超时,服务可能在这段时间内仍未就绪,导致恢复命令静默失败。正确逻辑是先启动SQL Server,等服务完全就绪后再执行恢复操作,而非并行运行。
  • 恢复命令执行环境存在问题:直接在CMD中写复合命令,可能因shell解析规则导致恢复命令未正确执行。建议把恢复逻辑抽成单独的shell脚本,让脚本先等待服务就绪,再执行恢复,最后保持服务运行。
    示例脚本(restore-db.sh):
    #!/bin/bash
    # 循环等待SQL Server就绪
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "Password" -Q "SELECT 1" -l 60
    while [ $? -ne 0 ]
    do
        echo "等待SQL Server就绪..."
        sleep 5
        /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "Password" -Q "SELECT 1" -l 60
    done
    
    # 执行数据库恢复
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "Password" -Q "RESTORE DATABASE DVS FROM DISK = '/var/opt/mssql/backup/DVS_demo.bak' WITH MOVE 'mvp_Data' TO '/var/opt/mssql/data/DVS_programavimui.mdf', MOVE 'mvp_Log' TO '/var/opt/mssql/data/DVS_programavimui.ldf'"
    
    # 保持SQL Server运行
    /opt/mssql/bin/sqlservr
    
    对应修改Dockerfile:
    COPY ./restore-db.sh /usr/local/bin/
    RUN chmod +x /usr/local/bin/restore-db.sh
    CMD ["restore-db.sh"]
    
  • 备份文件逻辑名不匹配:确认备份文件内的逻辑数据名和日志名确实是mvp_Data和mvp_Log,如果名字不符,恢复会失败且可能无错误输出。可在容器内执行RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/DVS_demo.bak'查看正确逻辑名。
  • 权限不足:检查备份文件和目标数据目录的权限,确保SQL Server运行用户(mssql)有读取备份文件、写入数据目录的权限。可在Dockerfile中添加:
    RUN chown -R mssql:mssql /var/opt/mssql/backup /var/opt/mssql/data
    

内容的提问来源于stack exchange,提问作者Justinas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:35:21