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且日志为空时,优先排查参数错误和依赖服务地址配置
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐