跳到主內容

Prisma Accelerate 故障排除

在使用 Prisma Accelerate 時,您在開發和操作過程中可能會遇到由特定錯誤程式碼突出顯示的錯誤。瞭解這些錯誤的含義、發生原因以及如何解決它們對於確保應用程式的平穩執行至關重要。本指南旨在提供有關 Prisma Accelerate 遇到的特定錯誤程式碼的見解和故障排除步驟。

P6009 (ResponseSizeLimitExceeded)

當資料庫查詢的響應大小超過配置的查詢響應大小限制時,會觸發此錯誤。我們實施此限制是為了保護您的應用程式效能,因為檢索超過 5MB 的資料會由於多個網路層而顯著降低應用程式的速度。通常,在執行 ETL(提取、轉換、載入)操作時,傳輸超過 5MB 的資料很常見。然而,對於其他場景,例如事務查詢、使用者介面的即時資料獲取、批次資料更新或在 ETL 上下文之外聚合大型資料集進行分析,通常應避免此情況。這些用例雖然必不可少,但通常可以最佳化以在配置的查詢響應大小限制內工作,從而確保更流暢的效能和更好的使用者體驗。

P6009 可能的原因

響應中傳輸圖片/檔案

如果正在獲取表中儲存的圖片或檔案,導致響應大小過大,則可能會出現此錯誤。通常不建議將資產直接儲存在資料庫中,因為它會顯著影響資料庫效能和可伸縮性。除了效能之外,它還會使資料庫備份變慢,並顯著增加儲存常規備份的成本。

建議解決方案:查詢響應大小限制配置得更大。如果仍然超出限制,請考慮將圖片或檔案儲存在 BLOB 儲存中,例如 Cloudflare R2AWS S3Cloudinary。這些服務允許您最佳化儲存資產並返回訪問 URL。與其直接將資產儲存在資料庫中,不如儲存 URL,這將大幅減小響應大小。

資料過度抓取

在某些情況下,會無意中獲取大量記錄或欄位,導致超出配置的查詢響應大小限制。當查詢中的where子句不正確或完全缺失時,可能會發生這種情況。

建議解決方案:查詢響應大小限制配置得更大。如果仍然超出限制,請仔細檢查where子句是否按預期過濾資料。為防止獲取過多記錄,請考慮使用分頁。此外,使用select子句僅返回必要的欄位,從而減小響應大小。

獲取大量資料

在許多資料處理工作流中,特別是涉及 ETL(提取-轉換-載入)過程或計劃的 CRON 作業的工作流中,需要從資料來源(如資料庫、API 或檔案系統)提取大量資料用於分析、報告或進一步處理。如果您正在執行獲取大量資料進行分析處理的 ETL/CRON 工作負載,則可能會遇到此限制。

建議解決方案:查詢響應大小限制配置得更大。如果超出限制,請考慮將查詢拆分為批次。這種方法可確保每個批次僅獲取部分資料,從而防止您超出單個操作的大小限制。

P6004 (QueryTimeout)

當資料庫查詢未能在配置的查詢超時限制內返回響應時,會發生此錯誤。查詢超時限制包括等待連線池中的連線、到資料庫的網路延遲以及查詢本身的執行時間。我們強制執行此限制是為了防止無意的長時間執行查詢,這些查詢可能會使系統資源過載。

Accelerate 的跨區域網路時間不包含在配置的查詢超時限制內。

P6004 可能的原因

此錯誤可能由多種原因引起。其中一些主要原因包括:

高流量和連線不足

如果應用程式正在接收非常高的流量並且沒有足夠的可用資料庫連線,則查詢需要等待連線變為可用。這種情況可能導致查詢等待連線的時間超過配置的查詢超時限制,如果在此持續時間內未得到服務,最終將觸發超時錯誤。

建議解決方案:在平臺環境中設定 Accelerate 時,檢查並可能增加連線字串引數中指定的connection_limit參考)。此限制應與資料庫的最大連線數保持一致。

預設情況下,連線限制設定為 10,除非在您的資料庫連線字串中指定了不同的connection_limit

長時間執行的查詢

即使連線可用,查詢也可能響應緩慢,達到配置的查詢超時限制。如果單個查詢中獲取了大量資料,或者表中缺少適當的索引,則可能會發生這種情況。

建議解決方案:將查詢超時限制配置得更大。如果超出限制,請識別執行緩慢的查詢並僅獲取必要的資料。使用select子句檢索特定欄位,避免獲取不必要的資料。此外,考慮新增適當的索引以提高查詢效率。您還可以將長時間執行的查詢隔離到單獨的環境中,以防止它們影響事務查詢。

資料庫資源爭用

一個常見但具有挑戰性的問題是,當在同一資料庫上執行的其他服務執行繁重的分析或資料處理任務時,會大量消耗資料庫資源。這些操作可能會壟斷資料庫連線和處理能力,導致即使是簡單的查詢也無法及時執行。這種“繁忙”或“嘈雜”的資料庫環境可能導致通常快速執行的查詢變慢甚至超時,尤其是在其他服務活動頻繁期間。

使用者通常依靠 CPU 和記憶體使用指標來衡量資料庫負載,這可能會產生誤導。雖然這些是重要的指標,但它們可能無法完全代表資料庫的執行狀態。讀取、寫入和等待時間等直接指標可以更清晰地瞭解資料庫的效能,應密切監控。這些指標的顯著下降,特別是在查詢或資料模型沒有變化的情況下,表明外部壓力正在影響資料庫效能。

建議解決方案:如果通常快速的查詢間歇性變慢或超時而未對其進行任何修改,則很可能是競爭查詢對同一資料庫表施加了壓力。要診斷此問題,請採用監控工具或利用資料庫的固有功能來觀察讀取、寫入和等待時間。此類監控將揭示與觀察到的效能下降相符的活動模式或峰值。

此外,定期審查和最佳化關鍵查詢並驗證表是否正確索引至關重要。這種積極主動的方法最大限度地降低了這些查詢受競爭工作負載導致的速度減慢影響的可能性。

P6009P6004 錯誤的注意事項

對於原生支援 Prisma ORM 的執行時,您可以考慮建立兩個 PrismaClient 例項。一個使用 Accelerate 連線字串(字首為prisma://),另一個使用直接資料庫連線字串(字首為postgres://mysql://等)。這種方法的主要思想是繞過 Accelerate 處理某些特定查詢。

但是,請注意,可用連線將分攤到您的兩個 PrismaClient 例項之間。瞭解管理多個例項的含義至關重要,尤其是在直接資料庫連線方面。使用帶有直接資料庫連線字串的 PrismaClient 例項意味著此連線將直接與您的資料庫互動。

這種方法需要仔細考慮,因為直接連線和 Accelerate 管理的連線共享相同的底層資料庫連線池。這可能導致資源爭用,從而可能影響資料庫服務的效能和可用性。

此外,直接連線可能對資料庫的效能和可用性產生重大影響。消耗大量資源的操作可能會降低依賴同一資料庫的其他使用者或程序的服務質量。

如果您的應用程式執行時環境原生支援 Prisma ORM,並且您正在考慮此策略以規避 P6009 和 P6004 錯誤,則可以建立兩個 PrismaClient 例項:

  1. 一個使用 Accelerate 連線字串(字首為prisma://)的例項,用於通用操作。
  2. 另一個使用直接資料庫連線字串(例如,字首為postgres://mysql://等)的例項,用於預期會超出配置的查詢超時限制或導致響應大於配置的查詢響應大小限制的特定操作。
export const prisma = new PrismaClient({
datasourceUrl: process.env.DIRECT_DB_CONNECTION,
})

export const prismaAccelerate = new PrismaClient({
datasourceUrl: process.env.ACCELERATE_CONNECTION,
}).$extends(withAccelerate())

此設定允許您透過直接連線策略性地指導某些操作,從而降低遇到上述錯誤的風險。但是,在做出此決定時,應全面瞭解潛在後果,並評估您的資料庫基礎設施是否可以支援此額外負載而不會影響整體效能和可用性。

另請參閱為什麼 Accelerate 在服務中斷期間不會回退到直接連線字串?

P6008 (ConnectionError|EngineStartError)

此錯誤表示 Prisma Accelerate 無法建立與資料庫的連線,可能由於多種原因。

P6008 可能的原因

資料庫無法公開訪問

如果您的資料庫位於 VPC 中,或者訪問許可權僅限於特定的 IP 地址,則如果 Accelerate 未啟用靜態 IP,或者您的資料庫防火牆中不允許靜態 IP,您可能會遇到此錯誤。

建議解決方案:為 Accelerate 啟用靜態 IP 並配置資料庫防火牆以允許從提供的靜態 IP 地址進行訪問。

資料庫主機/埠不可達

如果資料庫的伺服器地址(主機名)和埠不正確或不可達,則可能會遇到此錯誤。

建議解決方案:驗證建立 Prisma Accelerate 專案時提供的資料庫連線字串中的主機名/埠。此外,嘗試使用資料庫 GUI 工具(例如,Prisma StudioTablePlusDataGrip)連線資料庫以進行進一步調查。

使用者名稱/密碼/資料庫名稱不正確

當向 Prisma Accelerate 提供了錯誤的憑據時,可能會發生此錯誤,從而阻止它建立與資料庫的連線。

建議解決方案:驗證提供給 Prisma Accelerate 的連線字串中資料庫的使用者名稱、密碼和名稱的正確性。確保這些憑據與您的資料庫所需的憑據匹配。使用直接資料庫 GUI 工具測試連線也有助於確認所提供的憑據是否正確。

資料庫響應時間過長

如果資料庫響應連線請求時間過長,Prisma Accelerate 可能會超時並丟擲此錯誤。如果資料庫不活動或正在從休眠模式喚醒,則可能會發生這種情況。

建議解決方案:驗證資料庫是否處於活動狀態且可訪問。如果資料庫處於休眠模式,請嘗試使用直接資料庫 GUI 工具向其傳送請求或使用資料庫的管理控制檯喚醒它。

P5011 (TooManyRequests)

當 Prisma Accelerate 檢測到大量請求超出允許的閾值時,會發生此錯誤。它作為一種保護措施,以保護 Prisma Accelerate 和您的底層資料庫免受過載。

P5011 可能的原因

激進的重試迴圈

如果您的應用程式立即或以最小延遲重試查詢,尤其是在收到某些錯誤後,請求的快速累積可能會超過閾值。

建議解決方案

  • 實施指數退避策略。不要立即重試或以固定延遲重試,而是在每次失敗嘗試後逐漸增加延遲時間。
  • 這使系統有時間恢復,並降低了 Prisma Accelerate 和資料庫過載的可能性。

突然的流量高峰

不可預測的流量激增(例如,在產品釋出、限時搶購或病毒式增長事件期間)可能導致達到閾值並導致P5011錯誤。

建議解決方案

  • 考慮為 Prisma Accelerate 和您的資料庫制定主動擴充套件策略。
  • 監控流量和資源使用情況。如果您預計流量激增,請聯絡支援以進行容量規劃和潛在配置調整。

長時間或計劃的高工作負載

某些程序,例如批次資料匯入、ETL 操作或擴充套件的 CRON 作業,會隨著時間的推移產生持續的高查詢量。

建議解決方案

  • 使用批處理或分塊技術將大型操作分解為較小的部分。
  • 建立節流或排程以更均勻地分配負載。

其他錯誤

MySQL (Aiven) 錯誤:“我們無法處理您的請求。請重新整理並重試。”

問題

當使用包含?ssl-mode=REQUIRED引數的 Aiven MySQL 連線字串時,您可能會遇到以下錯誤:

We were unable to process your request. Please refresh and try again.

原因

ssl-mode=REQUIRED引數與 Accelerate 不相容,這會導致連線問題。

建議解決方案

要解決此錯誤,請從您的 MySQL 連線字串中刪除?ssl-mode=REQUIRED引數。

示例

  • 原始連線字串:mysql://username:password@host:port/database?ssl-mode=REQUIRED
  • 更新後的連線字串:mysql://username:password@host:port/database
© . This site is unofficial and not affiliated with Prisma Data, Inc.