# TiDB Server 容器启动失败问题排查与解决
TiDB启动失败核心原因是PD的–advertise-client-urls配置缺失,导致地址解析错误容器环境下TiDB的–path参数无需添加http://协议头,直接使用pd:2379即可精简镜像无基础命令时,优先通过宿主机测试网络连通性,而非容器内排查ExitCode=1且日志为空时,优先排查参数错误和依赖服务地址配置。
·
TiDB Server 容器启动失败问题排查与解决
一、问题现象
- TiDB Server 容器持续处于Restarting状态,重启次数达16次
docker compose logs tidb无有效输出,容器日志为空- Inspect信息显示ExitCode=1,OOMKilled=false(排除内存溢出)
- PD/TiKV容器显示Up状态,但TiDB无法正常启动
二、核心原因分析
- PD容器缺失****–advertise-client-urls=http://pd:2379****配置,导致PD返回的成员信息为localhost:2379
- TiDB在容器环境下解析localhost为自身容器,引发连接拒绝(dial tcp [::1]:2379: connect: connection refused)
- 初期尝试添加http://协议头到TiDB的–path参数,导致DNS解析错误(lookup http on 127.0.0.11:53: no such host)
- TiDB启动参数使用错误(如–log-level不存在),加剧进程初始化崩溃
三、分步排查与解决过程
3.1 排除内存溢出问题
- 检查Inspect信息,确认OOMKilled=false,排除内存不足导致的崩溃
- 验证WSL2内存配置(memory=8GB,swap=4GB),确认资源充足
3.2 验证PD网络连通性
- 在宿主机执行网络测试命令:
docker run --rm --network tidb-docker_default busybox telnet pd 2379
- 输出Connected to pd,确认容器间网络连通性正常
3.3 修正TiDB启动参数错误
- 移除错误的–log-level参数,使用TiDB支持的核心参数
- 去掉–path参数中的http://协议头,修正为–path=pd:2379
3.4 修正PD关键配置
- 在docker-compose.yml中为PD添加–advertise-client-urls配置:
pd:
command:
- --name=pd
- --client-urls=http://0.0.0.0:2379
- --advertise-client-urls=http://pd:2379
- --peer-urls=http://0.0.0.0:2380
- --initial-cluster=pd=http://pd:2380
- --data-dir=/data
- 重启PD容器使配置生效:
docker compose down pd
docker compose up -d pd
3.5 验证TiDB最简启动
- 执行最简启动命令测试:
docker run --name tidb-test --network tidb-docker_default -it pingcap/tidb:v7.5.0 --store=tikv --path=pd:2379
- 日志显示[pd] switch leader [new-leader=http://pd:2379],确认TiDB成功连接PD
四、最终解决方案
4.1 完整docker-compose.yml配置
services:
pd:
image: pingcap/pd:v7.5.0
ports:
- "2379:2379"
command:
- --name=pd
- --client-urls=http://0.0.0.0:2379
- --advertise-client-urls=http://pd:2379
- --peer-urls=http://0.0.0.0:2380
- --initial-cluster=pd=http://pd:2380
- --data-dir=/data
volumes:
- ./pd-data:/data
tikv:
image: pingcap/tikv:v7.5.0
ports:
- "20160:20160"
command:
- --addr=0.0.0.0:20160
- --pd=http://pd:2379
- --data-dir=/data
volumes:
- ./tikv-data:/data
depends_on:
- pd
tidb:
image: pingcap/tidb:v7.5.0
ports:
- "4000:4000"
- "10080:10080"
command:
- --store=tikv
- --path=pd:2379
- --advertise-address=tidb
- --log-file=/dev/stdout
depends_on:
- pd
- tikv
4.2 重启集群
docker compose down
docker compose up -d
五、验证结果
- TiDB容器状态变为Up,不再反复重启
- 日志显示[pd] switch leader [new-leader=http://pd:2379],连接PD成功
- 日志显示[new store with retry success],连接TiKV成功
- 可通过mysql客户端连接TiDB:mysql -h 127.0.0.1 -P 4000 -u root
六、关键总结
- TiDB启动失败核心原因是PD的–advertise-client-urls配置缺失,导致地址解析错误
- 容器环境下TiDB的–path参数无需添加http://协议头,直接使用pd:2379即可
- 精简镜像无基础命令时,优先通过宿主机测试网络连通性,而非容器内排查
- ExitCode=1且日志为空时,优先排查参数错误和依赖服务地址配置
更多推荐
所有评论(0)