如何疑難排解 Aurora PostgreSQL 相容執行個體中的本機儲存問題?

2 分的閱讀內容
0

我在 Amazon Aurora PostgreSQL 相容版本資料庫執行個體中遇到本機儲存問題。

簡短說明

Amazon Aurora 叢集中的資料庫執行個體具有兩種儲存類型:

  • 用於持續性資料的儲存空間 (共用叢集磁碟區)。如需詳細資訊,請參閱叢集磁碟區包含的內容
  • 根據執行個體類別,叢集中每個 Aurora 執行個體的本機儲存空間。此儲存體大小受到執行個體類別約束,只能透過移至較大的資料庫執行個體類別進行變更。Aurora PostgreSQL 相容性會使用本機儲存空間儲存錯誤日誌和暫存檔案。如需詳細資訊,請參閱 Aurora PostgreSQL 的暫存儲存空間限制

解決方法

您可以使用適用於 FreeLocalStorage 的 Amazon CloudWatch 指標,監控與 Aurora 資料庫執行個體或節點相關聯的本機儲存空間。此指標會報告每個資料庫執行個體可用於暫存資料表和日誌的儲存空間量。如需詳細資訊,請參閱使用 Amazon CloudWatch 監控 Amazon Aurora 指標

如果 Aurora 本機儲存空間已滿,請視您收到的錯誤而定,使用以下疑難排解步驟。

暫存資料表或檔案使用本地儲存空間

「錯誤:無法寫入暫存檔案的 XXXXXXXX 區塊: 設備沒有剩餘空間。」

當資料庫執行個體上的暫存儲存空間用完時,就會發生這個錯誤。這可能有許多原因,包括以下操作:

  • 變更大型資料表
  • 在大型資料表上新增索引
  • 使用複雜的 JOIN、GROUP BY 或 ORDER BY 子句執行大型 SELECT 查詢。

使用下列方法檢查暫存資料表和暫存檔案的大小:

1.    對於暫存檔案,請在與 Aurora PostgreSQL 相容的資料庫執行個體上開啟 log_temp_files參數。此參數會記錄大於指定 KB 數之暫存檔的使用情况。開啟此參數之後,刪除檔案時,會為每個暫存檔案建立日誌項目。0 值會記錄所有暫存檔案資訊。正值僅記錄大於或等於指定 KB 數的檔案。預設值為 -1 會關閉暫存檔案日誌。使用此參數可識別暫存檔案詳細資訊,然後將這些暫存檔案與 FreeLocalStorage 指標產生關聯。

**注意:**開啟 log_temp_files 參數可能會導致對 Aurora PostgreSQL 相容資料庫執行個體進行過多記錄。因此,最佳實務是檢查 Aurora PostgreSQL 相容日誌檔案的大小,然後再開啟 log_temp_files。如果日誌檔案佔用本機儲存空間的最大空間,請減少 rds.log_retention 的值以回收空間。rds.log_retention 的預設值為三天。

您也可以使用此命令後續執行的差異檢閱暫存檔案:

maxiops=> select datname, temp_files , pg_size_pretty(temp_bytes) as temp_file_size  FROM   pg_stat_database order by temp_bytes desc;

**注意:**在 temp_files 欄中,會計算所有暫存檔案,無論您何時建立暫存檔案 (例如,透過排序或雜湊)。檢視 pg_stat_database 中的 temp_filestemp_bytes 欄正在收集累積值的統計資訊。您可以使用 pg\ _stat\ _reset () 函數或重新啟動資料庫執行個體來重設此值。如需詳細資訊,請參閱 PostgreSQL 文件以取得其他統計資料函數

如果您使用與 Aurora PostgreSQL 相容的 10 或更新版本,您可以使用 Performance Insights 監視 temp_bytestemp_files。這也適用於 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS)。除了等待事件之外,Performance Insights 還提供資料庫引擎內部指標的原生計數器。如需詳細資訊,請參閱適用於 Amazon RDS for PostgreSQL 原生計數器

您也可以增加 maintenance_work_memwork_mem,將更多記憶體分配給正在執行作業的處理程序。這會使用較多記憶體進行作業,因此可使用較少的暫存磁碟儲存空間。如需有關這些參數的詳細資訊,請參閱 PostgreSQL maintenance_work_memwork_mem 的文件。最佳實務是在查詢或工作階段層級設定 maintenance_work_memwork_mem的值,以避免記憶體不足。如需詳細資訊,請參閱 Amazon Aurora PostgreSQL 參考資料

2.    針對暫存資料表,請執行下列查詢:

maxiops=> SELECT
n.nspname as SchemaName
,c.relname as RelationName
,CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
END as RelationType
,pg_catalog.pg_get_userbyid(c.relowner) as RelationOwner
,pg_size_pretty(pg_relation_size(n.nspname ||'.'|| c.relname)) as RelationSize
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n
    ON n.oid = c.relnamespace
WHERE  c.relkind IN ('r','s')
AND  (n.nspname !~ '^pg_toast' and nspname like 'pg_temp%')
ORDER BY pg_relation_size(n.nspname ||'.'|| c.relname) DESC;

最佳實務是密切監控您的應用程式,並查看哪些交易會建立暫存資料表。如此一來,您就可以管理可用本機儲存空間容量的使用量。您也可以移至 Aurora 執行個體的較高執行個體類別,以便執行個體擁有更多可用的本機儲存空間。

日誌檔案使用的本機儲存空間

過多的記錄也可能導致資料庫執行個體耗盡本機儲存空間。以下是一些可能會消耗本機儲存空間的記錄參數範例。使用量可能是由於過多記錄或長時間保留錯誤日誌。

rds.log_retention_period
auto_explain.log_min_duration
log_connections
log_disconnections
log_lock_waits
log_min_duration_statement
log_statement
log_statement_stats

若要識別造成過多記錄的參數,請分析 PostgreSQL 日誌以尋找最大日誌。然後,識別哪個參數負責這些日誌中的大多數項目。然後,您可以修改造成過多記錄的參數。

如果您重複執行因錯誤而失敗的查詢,則依預設 PostgreSQL 會將錯誤記錄到 PostgreSQL 錯誤日誌中。檢閱記錄的錯誤,然後修正失敗的查詢,以防止使用過多的儲存空間記錄。您也可以減少 rds.log_retention 的預設值 (三天),以回收錯誤日誌所使用的空間。

如果需要過多的記錄,而您因為日誌檔案而使用可用的本機儲存空間進行限流,請考慮移至較高的執行個體類別。這表示您的 Aurora 資料庫執行個體有更多可用的本機儲存空間。


相關資訊

Amazon Aurora PostgreSQL 的的最佳實務

AWS 官方
AWS 官方已更新 1 年前