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):
对应修改Dockerfile:#!/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/sqlservrCOPY ./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
相关产品推荐
相关产品推荐

