第17期吐槽:被DDL坑过的人不计其数!严重时引起雪崩,危害仅次于删库跑路!PG官方不支持online DDL确实后患无穷
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
第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) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: