请勿滥用 2PC, 忘记提交prepared transaction对PostgreSQL造成的危害.
2015-10-14 21:42
357 查看
我在数据库中开启了一个2PC事务,但是不去管他,会发生什么呢?有什么危害?
Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
Postgres-XL的项目发起人Mason Sharp
pgpool的作者石井达夫(Tatsuo Ishii)
PG-Strom的作者海外浩平(Kaigai Kohei)
Greenplum研发总监姚延栋
周正中(德哥), PostgreSQL中国用户会创始人之一
汪洋,平安科技数据库技术部经理
……
postgres=# begin;BEGINpostgres=# insert into t6 values (1);INSERT 25622 1postgres=# prepare transaction 'a';PREPARE TRANSACTIONpostgres=# select * from txid_current_snapshot(); txid_current_snapshot ------------------------------- 639903995:639904018:639903995(1 row)postgres=# select * from pg_prepared_xacts ; transaction | gid | prepared | owner | database -------------+-----+-------------------------------+----------+---------- 639903995 | a | 2015-09-24 10:03:53.900569+08 | postgres | postgres(1 row)
危害1, 膨胀
因为vacuum 在回收垃圾时,判断dead tuple可以回收的前提是,dead tuple是在最早未提交事务之前产生的。
所以,在这个事务之后,产生的DEAD TUPLE都无法被回收,即使VACUUM FULL也无法回收。
源码分析请参考
http://blog.163.com/digoal@126/blog/static/16387704020153305256157/
危害2, 年龄
年龄同样会受到威胁,最多只能降低到最早未提交的事务。
例如:
postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 36 | 639903995 | postgres(1 row)无法降低年龄了postgres=# vacuum freeze;VACUUMpostgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 36 | 639903995 | postgres(1 row)随着事务流逝,年龄越来越大postgres=# insert into t6 values (1);INSERT 25655 1postgres=# insert into t6 values (1);INSERT 25656 1postgres=# insert into t6 values (1);INSERT 25657 1postgres=# insert into t6 values (1);INSERT 25658 1postgres=# insert into t6 values (1);INSERT 25659 1postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 41 | 639903995 | postgres(1 row)postgres=# vacuum freeze;VACUUMpostgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 41 | 639903995 | postgres(1 row)
危害3, 持锁,DDL当然也是下不去的。
包括vacuum full, alter table, ....
最后,还需要提醒,基于流复制的备库,2PC事务会复制过去,激活后就可以看到。
所以2PC是非常坚强的,停库后起来还在,切换到备库也还在。
监控必须建立起来,对于长时间不提交的prepared transaction,及时告警。
[参考]
1. http://blog.163.com/digoal@126/blog/static/1638770402012101423358264
2. http://www.postgresql.org/docs/9.4/static/sql-prepare-transaction.html
3. http://www.postgresql.org/docs/9.4/static/sql-commit-prepared.html
4. http://www.postgresql.org/docs/9.4/static/sql-rollback-prepared.html
5. http://www.postgresql.org/docs/9.4/static/view-pg-prepared-xacts.html
6. http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS
7. http://blog.163.com/digoal@126/blog/static/16387704020153305256157/
Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
Postgres-XL的项目发起人Mason Sharp
pgpool的作者石井达夫(Tatsuo Ishii)
PG-Strom的作者海外浩平(Kaigai Kohei)
Greenplum研发总监姚延栋
周正中(德哥), PostgreSQL中国用户会创始人之一
汪洋,平安科技数据库技术部经理
……
2015年度PG大象会报名地址:http://postgres2015.eventdove.com/PostgreSQL中国社区: http://postgres.cn/PostgreSQL专业1群: 3336901(已满)PostgreSQL专业2群: 100910388PostgreSQL专业3群: 150657323 |
危害1, 膨胀
因为vacuum 在回收垃圾时,判断dead tuple可以回收的前提是,dead tuple是在最早未提交事务之前产生的。
所以,在这个事务之后,产生的DEAD TUPLE都无法被回收,即使VACUUM FULL也无法回收。
源码分析请参考
http://blog.163.com/digoal@126/blog/static/16387704020153305256157/
危害2, 年龄
年龄同样会受到威胁,最多只能降低到最早未提交的事务。
例如:
postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 36 | 639903995 | postgres(1 row)无法降低年龄了postgres=# vacuum freeze;VACUUMpostgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 36 | 639903995 | postgres(1 row)随着事务流逝,年龄越来越大postgres=# insert into t6 values (1);INSERT 25655 1postgres=# insert into t6 values (1);INSERT 25656 1postgres=# insert into t6 values (1);INSERT 25657 1postgres=# insert into t6 values (1);INSERT 25658 1postgres=# insert into t6 values (1);INSERT 25659 1postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 41 | 639903995 | postgres(1 row)postgres=# vacuum freeze;VACUUMpostgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database(); age | datfrozenxid | datname -----+--------------+---------- 41 | 639903995 | postgres(1 row)
危害3, 持锁,DDL当然也是下不去的。
包括vacuum full, alter table, ....
最后,还需要提醒,基于流复制的备库,2PC事务会复制过去,激活后就可以看到。
所以2PC是非常坚强的,停库后起来还在,切换到备库也还在。
监控必须建立起来,对于长时间不提交的prepared transaction,及时告警。
[参考]
1. http://blog.163.com/digoal@126/blog/static/1638770402012101423358264
2. http://www.postgresql.org/docs/9.4/static/sql-prepare-transaction.html
3. http://www.postgresql.org/docs/9.4/static/sql-commit-prepared.html
4. http://www.postgresql.org/docs/9.4/static/sql-rollback-prepared.html
5. http://www.postgresql.org/docs/9.4/static/view-pg-prepared-xacts.html
6. http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS
7. http://blog.163.com/digoal@126/blog/static/16387704020153305256157/
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- Flex字符串比较 还有Flex字符串操作
- CentOS下DB2数据库安装过程详解
- PostgreSQL新手入门教程
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- PostgreSQL教程(十):性能提升技巧
- PostgreSQL教程(二):模式Schema详解
- PostgreSQL教程(十三):数据库管理详解
- PostgreSQL教程(八):索引详解