Docker部署MSSQL 2019偶发无法创建登录名但数据库创建正常故障排查
问题根因
- 核心问题是硬等待30秒的初始化触发逻辑不可靠:不同宿主机性能、磁盘IO速度有差异,30秒时间点可能刚好处于MSSQL服务部分就绪的状态:能响应建库请求,但执行到登录名创建逻辑时,服务的系统权限表还未完全初始化完成,或者服务临时不可用
- 你当前没有捕获
sqlcmd命令的执行状态与报错:默认sqlcmd遇到严重错误会中断后续语句执行,前面的建库语句已经提交生效,后面的登录名创建、授权语句就会被跳过,刚好匹配你"数据库创建成功、登录名偶发缺失"的现象 - 日志中出现的18456状态38报错与初始化脚本无关:报错来源IP是
172.17.0.1(Docker网关,即宿主机侧的访问请求),是外部程序尝试访问还未创建完成的test/test2库导致的,不影响容器内的初始化逻辑执行
修复方案
- 替换硬等待为服务就绪探测,修改
run-initialization.sh内容如下:
# 循环探测直到MSSQL服务真正可正常连接 until /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$MSSQL_PASSWORD" -d master -Q "SELECT 1" &> /dev/null do sleep 2 done # 服务就绪后执行初始化脚本,增加参数输出执行日志与错误状态 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$MSSQL_PASSWORD" -d master -b -e -i /usr/src/app/Scripts/Database/create-local-databases.sql # 输出执行结果方便后续排查 echo "初始化脚本执行完成,退出码:$?"
- 优化SQL脚本逻辑:你当前给
TestUser授予了sysadmin服务器级角色,不需要额外创建库级用户即可访问所有数据库,如果没有特殊需求可以删除CREATE USER TestUser FOR LOGIN TestUser;语句,避免上下文切换带来的潜在问题。 - 若需要给特定库授权,可明确指定数据库上下文:
USE [test]; GO CREATE USER TestUser FOR LOGIN TestUser; GO
内容的提问来源于stack exchange,提问作者Art_0f_War
相关产品推荐
相关产品推荐

