驗(yàn)證一次講透)
ThingsBoard多租戶備份完整指南從租戶隔離原理到恢復(fù)驗(yàn)證一次講透【免費(fèi)下載鏈接】thingsboardOpen-source IoT Platform - Device management, data collection, processing and visualization.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/th/thingsboardThingsBoard生產(chǎn)環(huán)境跑在多租戶模式下時(shí)某個(gè)租戶誤刪設(shè)備或誤改規(guī)則鏈可能牽連上千臺(tái)在線設(shè)備的數(shù)據(jù)。沒有備份就是直接損失而整庫備份又太重、單租戶備份找不到表是新手最常卡住的兩個(gè)點(diǎn)。讀完這篇你能用 3 條命令完成全庫備份能按租戶 ID 精準(zhǔn)圈出單個(gè)租戶的設(shè)備與時(shí)序數(shù)據(jù)還會(huì)知道拿什么指標(biāo)判斷備份真的可用。租戶數(shù)據(jù)是怎么隔離的先看懂 tenant_id做備份之前先搞清楚一個(gè)租戶的數(shù)據(jù)到底散落在哪些表里。ThingsBoard 的 SQL 后端采用共享表 tenant_id 列的模式而不是給每個(gè)租戶建一套獨(dú)立表。核心機(jī)制可以看 dao/src/main/resources/sql/schema-entities.sqldevice、asset、dashboard、rule_chain、customer等表都帶tenant_id uuid字段租戶歸屬就靠這一列區(qū)分。時(shí)序數(shù)據(jù)則單獨(dú)存放和實(shí)體表通過entity_id關(guān)聯(lián)表名內(nèi)容定位租戶數(shù)據(jù)的依據(jù)device/asset設(shè)備、資產(chǎn)元數(shù)據(jù)tenant_id直接過濾ts_kv歷史時(shí)序按ts時(shí)間分區(qū)entity_id∈ 該租戶的設(shè)備/資產(chǎn)ts_kv_latest每個(gè)鍵的最新值同上attributes設(shè)備屬性同上租戶本身的增刪改查集中在 dao/src/main/java/org/thingsboard/server/dao/tenant/其中TenantDao是入口需要查某個(gè)租戶的 UUID 時(shí)從這里查庫即可。理解了這一點(diǎn)備份策略就清晰了實(shí)體數(shù)據(jù)按tenant_id圈時(shí)序數(shù)據(jù)按entity_id圈。分步操作Docker pg_dump 完成多租戶備份第 1 步準(zhǔn)備帶 PostgreSQL 的運(yùn)行環(huán)境推薦直接用官方 Docker Compose 起一套 PostgreSQL 后端默認(rèn)是 Cassandra備份方式完全不同。在倉庫根目錄執(zhí)行g(shù)it clone https://gitcode.com/GitHub_Trending/th/thingsboard cd thingsboard/docker docker compose -f docker-compose.yml -f docker-compose.postgres.yml up -ddocker-compose.postgres.yml定義了thingsboard_postgres_1這個(gè)容器后續(xù)所有備份命令都圍繞它。等 core 服務(wù)健康檢查通過后登錄 Web 界面默認(rèn)端口 8080初始賬號(hào) sysadminthingsboard.org創(chuàng)建一個(gè)租戶并接入幾臺(tái)測(cè)試設(shè)備讓庫里先有真實(shí)數(shù)據(jù)可備。第 2 步全量備份并建立行數(shù)基線# 整庫備份-Fc 自定義格式支持后續(xù)按表選擇恢復(fù) docker exec -i thingsboard_postgres_1 pg_dump -U postgres -Fc thingsboard tb_full_$(date %F).dump # 記錄租戶設(shè)備數(shù)作為校驗(yàn)基線 docker exec -i thingsboard_postgres_1 psql -U postgres -d thingsboard -tA \ -c SELECT count(*) FROM device WHERE tenant_id租戶UUID注意用-i而不是-t-t是給交互式終端加偽終端的配合重定向會(huì)把輸出搞沒這是新手最容易踩的坑后面常見坑里會(huì)再提一次。第 3 步按租戶 ID 圈出單租戶數(shù)據(jù)單租戶備份的本質(zhì)是一次按條件過濾的導(dǎo)出。先用租戶 ID 查出設(shè)備清單再拿設(shè)備 ID 過濾時(shí)序表-- 單租戶數(shù)據(jù)提取先拿設(shè)備ID再圈時(shí)序 SELECT count(*) FROM ts_kv WHERE entity_id IN (SELECT id FROM device WHERE tenant_id 租戶UUID);實(shí)際導(dǎo)出時(shí)把SELECT換成COPY ( ... ) TO STDOUT或者對(duì)device、ts_kv兩張表分別pg_dump --tabledevice后按上述條件過濾恢復(fù)即可。租戶的儀表盤、規(guī)則鏈同理都是tenant_id直連過濾。第 4 步掛上定時(shí)任務(wù)自動(dòng)備份在宿主機(jī) crontab 里加一行把腳本路徑換成你的實(shí)際路徑0 2 * * * /opt/backup/thingsboard_backup.sh /var/log/tb_backup.log 21thingsboard_backup.sh的內(nèi)容就是第 2 步那兩條命令加上備份文件存在且非空的判空檢查備份目錄建議按日期建子目錄并保留最近 30 份。驗(yàn)證與常見坑怎么確認(rèn)備份真的可用驗(yàn)證方法只有一個(gè)金標(biāo)準(zhǔn)恢復(fù)出來數(shù)一數(shù)。起一個(gè)空的測(cè)試庫或本地 psql 臨時(shí)實(shí)例用pg_restore把.dump文件灌進(jìn)去對(duì)照第 2 步記錄的基線跑同樣的count(*)數(shù)字一致即通過對(duì)單租戶備份額外抽查ts_kv中 1~2 臺(tái)設(shè)備的時(shí)序條數(shù)。恢復(fù)完成后再從 Web 界面確認(rèn)對(duì)應(yīng)租戶的儀表盤有數(shù)據(jù)可參考上方最新值組件的樣子比單純看行數(shù)更可信。兩個(gè)最常見的坑坑現(xiàn)象處理ts_kv_租戶ID按租戶拆表的假設(shè)部分資料假設(shè)時(shí)序表按租戶命名直接pg_dump -t ts_kv_xxx當(dāng)前 SQL 后端只有一張按時(shí)間分區(qū)的ts_kv必須按entity_id IN (...)過濾docker exec -t 重定向備份文件是 0 字節(jié)或亂碼重定向場(chǎng)景一律用-i去掉-t上生產(chǎn)前的三條建議備份和數(shù)據(jù)庫分開存.dump文件落到另一個(gè)卷或?qū)ο蟠鎯?chǔ)同盤備份等于沒備。保留策略寫進(jìn)腳本每日備份留 30 天、每周備份留 12 個(gè)月用find -mtime 30 -delete一句話就能實(shí)現(xiàn)。每月做一次真實(shí)恢復(fù)演練備份的價(jià)值由恢復(fù)測(cè)試定義只看備份成功的日志是不嚴(yán)謹(jǐn)?shù)?。帶走清單備份前記住兩把鑰匙——實(shí)體表用tenant_id時(shí)序表用entity_id命令用-i不用-t每次備份后跑一次count(*)對(duì)基線。下一步先在測(cè)試租戶上完整走一遍備份 → 恢復(fù) → 數(shù)數(shù)流程通過后再掛 cron。【免費(fèi)下載鏈接】thingsboardOpen-source IoT Platform - Device management, data collection, processing and visualization.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/th/thingsboard創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考