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

Docker部署MSSQL 2019偶发无法创建登录名但数据库创建正常故障排查

问题根因
  • 核心问题是硬等待30秒的初始化触发逻辑不可靠:不同宿主机性能、磁盘IO速度有差异,30秒时间点可能刚好处于MSSQL服务部分就绪的状态:能响应建库请求,但执行到登录名创建逻辑时,服务的系统权限表还未完全初始化完成,或者服务临时不可用
  • 你当前没有捕获sqlcmd命令的执行状态与报错:默认sqlcmd遇到严重错误会中断后续语句执行,前面的建库语句已经提交生效,后面的登录名创建、授权语句就会被跳过,刚好匹配你"数据库创建成功、登录名偶发缺失"的现象
  • 日志中出现的18456状态38报错与初始化脚本无关:报错来源IP是172.17.0.1(Docker网关,即宿主机侧的访问请求),是外部程序尝试访问还未创建完成的test/test2库导致的,不影响容器内的初始化逻辑执行
修复方案
  1. 替换硬等待为服务就绪探测,修改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 "初始化脚本执行完成,退出码:$?"
  1. 优化SQL脚本逻辑:你当前给TestUser授予了sysadmin服务器级角色,不需要额外创建库级用户即可访问所有数据库,如果没有特殊需求可以删除CREATE USER TestUser FOR LOGIN TestUser;语句,避免上下文切换带来的潜在问题。
  2. 若需要给特定库授权,可明确指定数据库上下文:
USE [test];
GO
CREATE USER TestUser FOR LOGIN TestUser;
GO

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:54:03