查看原文
其他

第17期吐槽:被DDL坑过的人不计其数!严重时引起雪崩,危害仅次于删库跑路!PG官方不支持online DDL确实后患无穷

digoal PostgreSQL码农集散地 2024-07-08

文中参考文档点击阅读原文打开, 同时推荐2个学习环境: 

1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像

2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库

3、PolarDB开源数据库内核、最佳实践等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

关注公众号, 持续发布PostgreSQL、PolarDB、DuckDB等相关文章. 


第17期吐槽:PG官方不支持online DDL

1、产品的问题点

  • PG 官方还不支持online DDL

2、问题点背后涉及的技术原理

  • DDL时需要加排他锁, 堵塞所有与被锁对象相关的操作, 包括select. 而且PG是锁排队机制,即使当前DDL还没有获得排它锁,它其实已经会堵塞其他任何锁的请求,再访问较频繁的表上操作的话容易引起大量等待甚至雪崩。

  • 当然, PG很多DDL操作不需要table rewrite, 只需要改元数据, 例如加字段, 某些改字段长度的操作(具体见手册内alter table的语法介绍).

3、这个问题将影响哪些行业以及业务场景

  • 几乎所有行业, 当需要对大表执行DDL(例如发布变更), 而且这个DDL需要table rewrite时.

  • 即使没有table rewrite,如果这个表上面有其他已经持有锁的未结束长事务或query,那么一样会引起堵塞,也就是上面第二点里说的。
  • 一些典型的场景是刷新统计数据,然后切换表名DDL、或者直接truncate 然后刷新数据,和逻辑备份或长的事务或查询冲突。
  • 又比如修改字段类型、添加字段等。

4、会导致什么问题?

  • 当DDL需要table rewrite时. 那么需要长时间持有排他锁, 如果是个被频繁访问的表, 可能长时间影响业务, 甚至需要停业务来执行DDL.

  • 即使DDL没有table rewrite,如果这个表上面有其他已经持有锁的未结束长事务或query,那么一样会引起堵塞,也就是上面第二点里说的。

5、业务上应该如何避免这个坑

  • 使用pg_migrate或pg-osc插件, 参考阅读:

    • 《用pg_migrate实现PostgreSQL online DDL with table rewrite》

    • 《PostgreSQL online DDL 工具 - pg-osc》

  • 在业务设计的时候尽量避免未来发生table rewrite的结构变更, 如修改字段类型(某些情况将导致底层存储内容发生变化, 如int4到int8).

  • 使用trigger, PG的继承表功能进行实现, 非常复杂. 一般用户不懂.

  • 执行DDL时设置lock timeout,防止堵塞别的请求而引起的雪崩。

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题

  • 非官方插件, 心里没底, 或者得等这些插件存活几年以上, 并且看到他们的贡献者数量、活跃度等比较健康时才敢使用. PG的大版本在不断推出, 插件的兼容性是否能跟上. 确实遇到过一些插件只支持某些低版本.

  • 管理复杂度增加.

7、数据库未来产品迭代如何修复这个坑

  • PG有个插件pg_repack, 在线垃圾回收, 只短暂的加排他锁, 切换数据文件filenode. 可借鉴类似思想, 实现需要table rewrite的DDL的短暂加排他锁, 而不是整个过程加排他锁.

  • 希望 pg_repack, pg_migrate, pg-osc 可以有机会进入PG的主干, 作为官方插件.

本期彩蛋-招商中...


文章中的参考文档请点击阅读原文获得. 


欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存