前言
这篇文章旨在提供 RDS for PostgreSQL 的一些开发和运维建议,以助您提升数据库使用的标准化和稳定性。
性能与稳定性
- 慎用子事务,避免事务中使用过多的子事务。
- 游标使用后及时关闭。
- 对于在线业务,建议使用 CREATE INDEX CONCURRENTLY 方法创建索引,以避免阻塞其他会话在目标索引表上的 DML 操作。
- 对于重建索引操作,在 PostgreSQL 12 及以上大版本,推荐使用 REINDEX CONCURRENTLY。PostgreSQL 11 及下大版本,使用 CONCURRENTLY 创建新索引成功后,再删除老索引
- 如果可以,使用 TRUNCATE 代替 DELETE,一方面可以提高性能,另一方面可以减少海量 DELETE 时 WAL 日志暴增带来的磁盘压力。
- PostgreSQL 支持在事务中运行 DDL 语句,建议将 DDL 封装在事务中执行,必要时可以回滚。需要提前明确 DDL 的影响,避免长时间的 rewrite table 影响 DML 操作。
- 频繁创建或删除临时表可能增加系统资源消耗。谨慎使用 ON COMMIT DROP 。建议利用 WITH 语句来替代临时表的功能。
- 大批量的数据入库,建议使用 copy 语法,或者 INSERT INTO table VALUES (),(),...(); 的方式,提高写入速度。
- 建议业务上监控 dead replication slot 并及时清理,避免 WAL 无法清理,最终导致磁盘空间耗尽导致实例只读。
管理
权限
- 遵循最小权限原则,建议给予 schema / role 为单位进行权限分配,对不同的业务角色。
表
- 不建议大量使用临时表,频繁的创建删除会消耗大量的系统资源,还可能带来表膨胀等问题
- 不建议创建同名的普通表和临时表。
- 建议保持表结构中字段的数据类型与应用程序中的定义一致,并统一不同表之间的字段校对规则,以免出现错误或无法利用索引的状况。
- 如果业务上有定期清理数据的需求,建议按照表中时间字段进行分区,使用 DROP / TRUNCATE 直接清理对应的子表。
- 对于频繁更新的表且预留了较多的存储空间,可以配置较低的 FILLFACTOR 用于 HOT UPDATE 来提高数据更新性能,减少索引 I/O。
- DDL 操作之前务必慎重,并且选择在低峰期执行。对于 VACUUM FULL 等影响较大的操作,建议设置锁等待,避免长时间运行导致业务阻塞。
- 创建表时,合理的规划字段的数据类型,提高查询效率。同时可以避免频繁的结构变更。
监控告警
- RDS for PostgreSQL 提供了丰富的监控与事件通知,强烈建议进行配置,提前发现潜在风险
- 建议根据业务实际情况,合理配置监控阈值。
- 配置站内信通知,及时了解数据库变更带来的业务影响。
参考文档