PostgreSQL DDL 与 锁等待

数据库关系型数据库技术服务知识库
写在前面
  • DDL 操作一定要经过审核,并在业务低峰期进行操作。
  • DDL 操作建议提前熟读官方文档,并在测试环境进行测试,需要明确: * 需要什么样的锁。 * 是否需要 rewrite table * 整个操作完成的时间,评估对业务的影响。
  • 建议提前规划好表结构,避免频繁的变更表结构。
DDL 锁等待

DDL 操作会在表上加 EXCLUSIVE LOCK 排他锁,在不需要 rewrite table 的情况下,完成 DDL 操作只需要毫秒级,前提是需要获取到锁,考虑业务上有如下场景:

  • 在表上有读取和写入操作,分别会获取 AccessShareLock 和 RowExclusiveLock,长时间未完成。
  • 在表上执行添加列操作,需要获取表上的 AccessExclusiveLock,如果获取失败需要排队,等待前面读取查询完成。
  • 后续读写请求则会进入到等待队列中,容易造成雪崩。
rewrite table

在需要 rewrite table 的情况下,执行 DDL 的时长取决于表大小和系统负载,建议在执行 DDL 前,提前在测试环境中进行评估。 例如修改列类型操作:

postgres=# create table test_t (id int, info text, crt_time timestamp, c1 int); 
CREATE TABLE
postgres=# select pg_relation_filepath('test_t');
 pg_relation_filepath 
----------------------
 base/13593/50548
(1 row)

postgres=# alter table test_t alter column c1 type text;
ALTER TABLE

//可以看到发生了 rewrite table
postgres=# select pg_relation_filepath('test_t');
 pg_relation_filepath 
----------------------
 base/13593/50554
(1 row)
操作建议

PostgreSQL 支持在事务中运行 DDL 语句,建议将 DDL 封装在事务中执行,必要时可以回滚

demo3=# set lock_timeout='5s';  
SET
demo3=# alter table t1 add column info text;
ERROR:  canceling statement due to lock timeout
参考文档
0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

所属团队号:
相关资源
大模型产品方案白皮书——PromptPilot
AI 正以空前速度重塑行业,大模型成为继移动互联网后的新科技浪潮。如何将其与业务深度融合,实现落地,仍是数字化转型的核心挑战。有效 Prompt 是驱动模型达成业务目标的关键,但业务诉求常模糊、缺乏标准答案,模型理解差异大。企业需让模型准确理解需求、稳定输出高质量结果,并在数据积累中持续优化性能与价值。 PromptPilot 应运而生,通过对话与任务用例自动生成高质量 Prompt 与评估标准,运行中持续识别并优化问题,释放大模型潜力,让非技术人员也能轻松驾驭大模型,推动落地与创新。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论