2025年11月26日 星期三

n8n Environment variables-Executions

n8n Environment variables-Executions

在n8n平台不論手動或自動執行workflow,都會將執行紀錄紀錄在資料庫。
隨著使用時間增加,n8n資料庫可能會不斷增長並影響執行效能。
為避免這種情況,n8n建議不要保存不必要的數據,並啟用對舊資料的清理。
依據官網文件
Executions environment variables
Execution data
進行設定。

主機環境

Ubuntu 24.04.3 LTS
Docker version v28.5.1 
Docker compose version v2.40.3 
n8n Community Edition version 1.118.1 (n8nio/n8n)

設定過程

1.手動刪除

檢查執行紀錄
executions-01

手動刪除紀錄
executions-02

2.設定減少儲存資料

設定資料保存條件,官網提供只儲存error 執行的設定

參數說明
# 儲存結束於錯誤的執行
- EXECUTIONS_DATA_SAVE_ON_ERROR=all
# 不要保存成功执行
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
# 不要為每次執行保存節點進度
- EXECUTIONS_DATA_SAVE_ON_PROGRESS=true
# 不要保存手動啟動的執行
- EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false

於docker-compose.yml增加以下設定
---
# Reduce saved data
# Save executions ending in errors
- EXECUTIONS_DATA_SAVE_ON_ERROR=all
# Don't save successful executions
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
# Don't save node progress for each execution
- EXECUTIONS_DATA_SAVE_ON_PROGRESS=true
# Don't save manually launched executions
- EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
---
以上是全平台的設定,也可以參考工作流程設置, 針對單一工作流程配置這些設定。

3.定期刪除資料

n8n預設啟用executions pruning,會定期刪除已完成的執行及其執行資料和二進位資料。出於效能考慮,刪除會先標記要刪除的目標,然後再將其永久移除。

參數說明
# 啟用executions pruning
- EXECUTIONS_DATA_PRUNE=true
# 執行完成時間超過設定的時間,n8n會刪除超過設定時間的資料。預設值:336小時,單位為小時。
- EXECUTIONS_DATA_MAX_AGE=336
# 執行總數超過 EXECUTIONS_DATA_PRUNE_MAX_COUNT 設定值,n8n會從最早到最新刪除執行記錄。預設值:10000。如果設為0則為無限制。
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000

記住事項:
a.處於new、running或 waiting 狀態的執行不符合刪除條件。
b.帶有註釋的執行(例如,帶有標籤或評分的執行)永遠不會被刪除。
C.定時刪除時,設定參數EXECUTIONS_DATA_HARD_DELETE_BUFFER 安全緩衝期(預設值:1小時),以確保在使用者建置或偵錯工作流程時,最近的資料仍然可用。

可以自行設定EXECUTIONS_DATA_MAX_AGE及EXECUTIONS_DATA_PRUNE_MAX_COUNT的數字,來保持資料完整

於docker-compose.yml增加以下設定
---
# Clear EXECUTIONS_DATA
# Enable executions pruning
- EXECUTIONS_DATA_PRUNE=true
# How old (hours) a finished execution must be to qualify for soft-deletion
- EXECUTIONS_DATA_MAX_AGE=168
# Max number of finished executions to keep. 
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
---

docker-compose.yml
executions-03

注意項目

官方文件提到,如果使用預設SQLite資料庫執行n8n,則任何已清理資料的磁碟空間不會自動釋放,而是會重新用於後續執行的資料。
若要釋放此空間,請設定環境變數(DB_SQLITE_VACUUM_ON_STARTUP=true)或手動執行 VACUUM 操作。

後續事項

20251203

1.設定EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false,手動執行工作流時出現錯誤時無法自動停止,須要手動停止。
n8n會出現以下訊息。
Attempt to read execution was blocked due to insufficient permissions
Unable to stop execution "2070" as it was not found
Image-20251203-5-error

AI協助提供以下答案:
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS設為false,手動執行只會跑邏輯,不會在DB存完整的執行紀錄。這會導致前端或 API 在讀取/停止該執行時找不到對應資料,就可能會出現的兩個錯誤訊息。

Attempt to read execution was blocked due to insufficient permissions 錯誤
在UI在點「測試工作流程」或打開節點執行結果時,會去讀對應的 execution 資料;若該 ID 在 DB 裡沒有對應內容(因為手動執行未被儲存或已被清除),就可能出現「Attempt to read execution was blocked due to insufficient permissions」這類訊息,實際上常見原因之一是 execution record 不存在或不完整,而非真的RBAC權限錯誤。​

若系統在啟動時偵測到「有execution row,但缺少 executionData」的異常,也會在 log 裡報類似錯誤,並且後續對這些 execution 的讀取會被阻擋,避免使用者看到不一致資料。​

Unable to stop execution "2070" as it was not found 錯誤
停止執行(UI的Stop按鈕或 POST /executions/:id/stop)會先查詢該execution ID,在DB或 queue 裡找對應的執行紀錄;如果找不到,就會回傳「execution not found」或類似訊息。​

在手動執行不儲存、或該執行資料被 prune / hard delete 之後,前端仍保留舊的 execution ID,這時去 Stop 就會得到「Unable to stop execution '2070' as it was not found」這種錯誤。

建議保留 EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true,方便在UI中查看「測試執行」的歷史、debug 節點輸出、或隨時手動Stop測試流程,並改用 EXECUTIONS_DATA_PRUNE、EXECUTIONS_DATA_MAX_AGE 等變數來控管DB大小。


沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。