找回密碼
 立即註冊
    查看: 148|回覆: 0

    HA 資料庫完整調校:recorder 整份設定、用 SQL 揪出吃空間的實體、換 MariaDB 的完整步驟

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 13:44:48 | 顯示全部樓層 |閱讀模式
    這篇是資料庫的完整處置。

    假設你已經確認「慢」的原因是資料庫(怎麼確認在 tid=271,一句話版本是:執行 recorder.disable 之後明顯變順)。接下來要做的是:看懂 recorder 在做什麼、用 SQL 找出到底是誰在吃空間、把設定調對、必要時換引擎。

    recorder.disable

    先算一次,你就知道為什麼會變這麼大

    HA 預設把每一個實體的每一次狀態變化寫進資料庫。聽起來合理,直到你算一下:
    1. 一個功率感測器,每 10 秒回報一次
    2.   一天   8,640 筆
    3.   一個月 259,200 筆
    4. 五個這種感測器
    5.   一個月 130 萬筆
    6. 再加上每一筆的「屬性」(單位、圖示、裝置類別、friendly_name…)
    7. 以及每個 Zigbee 裝置的 LQI、電量、訊號強度
    8. 以及所有自動化與腳本的觸發事件
    複製代碼

    結果就是幾 GB 的資料庫、開機要好幾分鐘、歷史頁面卡住、SD 卡被寫爆。

    ---

    步驟 1:先看清楚你的資料庫現在的狀態

    怎麼看整體大小

    設定 → 系統 → 修復 → 右上三個點 → 系統資訊,往下找 Recorder 區塊。

    你會看到什麼:
    1. Recorder
    2.   資料庫引擎     sqlite
    3.   資料庫版本     3.45.x
    4.   預估資料庫大小  1842.31 MiB
    5.   目前執行中      是
    6.   最舊的執行起始時間  2026-09-15T04:12:00+08:00
    複製代碼

    直接看檔案更準(裝 Terminal & SSH 附加元件,或 Container 版直接 SSH 進主機),到設定目錄:
    1. ls -lh home-assistant_v2.db*
    複製代碼

    你會看到什麼:
    1. -rw-r--r-- 1 root root 1.8G Sep 25 14:02 home-assistant_v2.db
    2. -rw-r--r-- 1 root root  32K Sep 25 14:02 home-assistant_v2.db-shm
    3. -rw-r--r-- 1 root root 412M Sep 25 14:02 home-assistant_v2.db-wal
    複製代碼

    ⚠ 三個檔案都要算。-wal 是「預寫日誌」,忙碌的系統上可能幾百 MB,只看主檔會低估。

    判準:


    • 500MB 以下 —— 正常
    • 1 到 2GB —— 該整理了
    • 3GB 以上 —— 一定有問題
    • -wal 超過主檔的 20% —— 寫入壓力很大,優先處理步驟 3


    做一個「資料庫大小」感測器,讓它自己盯著

    到設定 → 裝置與服務 → 新增整合,搜尋 SQL,加入。

    它會問幾個欄位,SQLite 的話這樣填:


    • 資料庫網址:留空(留空就是用 HA 自己的那個)
    • 名稱:資料庫大小
    • 查詢:

    1. SELECT ROUND(page_count * page_size / 1024.0 / 1024.0, 1) AS size
    2. FROM pragma_page_count(), pragma_page_size();
    複製代碼


    • 資料欄:size
    • 測量單位:MB


    MariaDB 的話查詢要換成:
    1. SELECT ROUND(SUM(data_length + index_length) / 1048576, 1) AS size
    2. FROM information_schema.tables
    3. WHERE table_schema = 'homeassistant';
    複製代碼

    你會看到什麼:新增成功後出現 sensor.資料庫大小,值是一個數字。

    顯示 unknown 或 unavailable → 查詢語法錯了,或是資料欄名稱跟查詢輸出的欄位名不符(兩邊都要是 size)。

    順便做一個超標提醒,放在 automations.yaml:
    1. - id: db_too_big_alert
    2.   alias: 資料庫超過 2GB 提醒
    3.   triggers:
    4.     - trigger: numeric_state
    5.       entity_id: sensor.zi_liao_ku_da_xiao
    6.       above: 2000
    7.       for:
    8.         hours: 6
    9.   conditions: []
    10.   actions:
    11.     - action: persistent_notification.create
    12.       data:
    13.         title: 資料庫超過 2GB
    14.         message: >
    15.           目前 {{ states('sensor.zi_liao_ku_da_xiao') }} MB,該檢查 recorder 設定了
    複製代碼

    ⚠ entity_id 要用實際的。中文名稱會被轉成拼音,到開發者工具 → 狀態搜尋「資料庫」看它實際叫什麼,複製過來。for: hours: 6 是為了避免 purge 期間數字跳動造成重複通知。

    ---

    步驟 2:用 SQL 找出到底是誰在吃空間(這一步最關鍵)

    不做這一步的話,後面的 exclude 清單都是猜的。

    用 Terminal & SSH 附加元件,到設定目錄。

    查詢 A:哪些實體的筆數最多
    1. sqlite3 home-assistant_v2.db "
    2. SELECT m.entity_id, COUNT(*) AS 筆數
    3. FROM states s
    4. JOIN states_meta m ON m.metadata_id = s.metadata_id
    5. GROUP BY m.entity_id
    6. ORDER BY 筆數 DESC
    7. LIMIT 25;
    8. "
    複製代碼

    你會看到什麼:
    1. sensor.power_meter_power|1284391
    2. sensor.router_download_speed|982104
    3. sensor.router_upload_speed|981887
    4. device_tracker.my_phone|412039
    5. sensor.cpu_temperature|298112
    6. sensor.zigbee_bulb_linkquality|187432
    7. sensor.living_room_temperature|41208
    8. sensor.outdoor_humidity|38901
    9. ...
    複製代碼

    怎麼讀:拿第一筆跟第十筆比。差一個數量級以上就是異常(128 萬 vs 4 萬)。

    查詢 B:哪些實體佔最多空間(比筆數更準)

    筆數多不等於佔空間多 —— 一個狀態值很長、屬性很多的實體,一筆就抵別人十筆。
    1. sqlite3 home-assistant_v2.db "
    2. SELECT m.entity_id,
    3.        COUNT(*) AS 筆數,
    4.        ROUND(SUM(LENGTH(COALESCE(s.state,'')) +
    5.                  LENGTH(COALESCE(sa.shared_attrs,''))) / 1048576.0, 2) AS 約MB
    6. FROM states s
    7. JOIN states_meta m ON m.metadata_id = s.metadata_id
    8. LEFT JOIN state_attributes sa ON sa.attributes_id = s.attributes_id
    9. GROUP BY m.entity_id
    10. ORDER BY 約MB DESC
    11. LIMIT 25;
    12. "
    複製代碼

    你會看到什麼:
    1. sensor.power_meter_power|1284391|284.31
    2. sensor.weather_forecast|8412|196.04
    3. sensor.router_download_speed|982104|142.88
    4. camera.front_door|41200|98.12
    5. ...
    複製代碼

    以下還有約 81% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-11-10 00:38 , Processed in 0.136155 second(s), 25 queries .

    快速回覆 返回頂部 返回列表