ThingsBoard CE从3.4.4升级至3.5.x时Schema更新失败求助
ThingsBoard CE 3.4.4升级至3.5.x故障排查与解决方案
一、先搞定PostgreSQL端口占用问题
日志里的端口占用是核心诱因——数据库起不来,Schema更新肯定失败。
- 先查谁占了5432端口:
- 用
docker ps看正在跑的容器,找到占用5432的容器,docker stop <容器ID>直接停掉。 - 如果是宿主机进程搞的,Linux下
lsof -i :5432找PID,再kill -9 <PID>;Windows用netstat -ano | findstr :5432抓PID,去任务管理器结束进程。
- 用
- 升级前检查
docker-compose.yml里postgres的端口映射,确保5432:5432没和宿主机其他服务冲突。
二、修复Schema更新失败与'notification_target'表缺失问题
1. 先回退到正常的3.4.4版本
得先确保原数据库没损坏:
- 停掉现在故障的升级容器:
docker stop thingsboard - 启动3.4.4版本容器,确认能正常访问、数据没问题:
docker run -d --name thingsboard -p 8080:8080 -p 1883:1883 -p 5683:5683/udp -v ~/.mytb-data:/data -v ~/.mytb-logs:/var/log/thingsboard thingsboard/tb-postgres:3.4.4 - 进容器查数据库状态:
docker exec -it thingsboard psql -U postgres -d thingsboard,输\dt确认所有表都在,别缺东西。
2. 严格按官方分步升级(3.4.4 → 3.5.0 → 3.5.1)
跳版本升级必然导致Schema脚本执行不全,表缺失是大概率事件:
- 先备份3.4.4的数据库:
docker exec -it <postgres容器ID> pg_dump -U postgres thingsboard > tb_backup_3.4.4.sql - 停掉3.4.4的容器,跑3.5.0的升级脚本,指定源版本:
docker run -it --rm -v ~/.mytb-data:/data -v ~/.mytb-logs:/var/log/thingsboard -v ~/.mytb-conf:/config thingsboard/tb-postgres:3.5.0 upgrade --fromVersion=3.4.4 - 别中途断容器,等脚本跑完。如果再出现'ERROR: canceling statement due to user request',试试:
- 进postgres容器改
postgresql.conf,把statement_timeout设为0(禁用语句超时),然后重启postgres服务。
- 进postgres容器改
- 3.5.0升级完,启动正常容器确认能访问:
docker run -d --name thingsboard -p 8080:8080 -p 1883:1883 -p 5683:5683/udp -v ~/.mytb-data:/data -v ~/.mytb-logs:/var/log/thingsboard thingsboard/tb-postgres:3.5.0 - 再重复备份、升级流程,从3.5.0升到3.5.1:
docker run -it --rm -v ~/.mytb-data:/data -v ~/.mytb-logs:/var/log/thingsboard -v ~/.mytb-conf:/config thingsboard/tb-postgres:3.5.1 upgrade --fromVersion=3.5.0
3. 手动补'notification_target'表
要是升级后还是缺这个表,直接手动建(表结构匹配3.5.x):
- 进postgres数据库:
docker exec -it <postgres容器ID> psql -U postgres -d thingsboard - 执行以下SQL:
CREATE TABLE notification_target ( id uuid NOT NULL, created_time bigint NOT NULL, tenant_id uuid, customer_id uuid, user_id uuid, target_type varchar(255) NOT NULL, target_config jsonb NOT NULL, PRIMARY KEY (id) ); CREATE INDEX idx_notification_target_tenant_id ON notification_target(tenant_id); CREATE INDEX idx_notification_target_customer_id ON notification_target(customer_id); CREATE INDEX idx_notification_target_user_id ON notification_target(user_id); - 建完重启ThingsBoard容器就行。
三、后续避坑提醒
- 升级前必备份数据库,别嫌麻烦。
- 严格按官方版本路径升级,别跳级。
- 升级过程中别关终端、别断网,让脚本跑完。
- 给Docker分配足够的CPU和内存,资源不够也会导致脚本超时被取消。
内容的提问来源于stack exchange,提问作者Aslanbek Aitbaev
相关产品推荐
相关产品推荐

