跳到主要內容

疑難排解

使用 Prisma Accelerate 時,您可能會在開發和營運期間遇到錯誤,這些錯誤通常會以特定的錯誤代碼突顯。務必了解這些錯誤的含義、發生原因以及如何解決,以確保應用程式順利運作。本指南旨在提供深入解析和步驟,以針對使用 Prisma Accelerate 時遇到的特定錯誤代碼進行疑難排解。

P6009 (ResponseSizeLimitExceeded)

當資料庫查詢的回應大小超過設定的查詢回應大小限制時,會觸發此錯誤。我們實施此限制是為了保護您的應用程式效能,因為檢索超過 5MB 的資料可能會由於多個網路層而顯著降低應用程式的速度。通常,傳輸超過 5MB 的資料在執行 ETL(擷取、轉換、載入)作業時很常見。但是,對於其他情境,例如交易查詢、使用者介面的即時資料擷取、大量資料更新或在 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 工具向其傳送請求以喚醒它,或使用資料庫的管理控制台喚醒它。

其他錯誤

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