周三是新年的第一天,所以周三和周五的文字调换一下,所以postgresql 高可用的文字要在周四发布,敬请见谅。

还能怪谁,谁用的怪谁呗  使用过 PostgreSQL 的对比其他的数据库,都会怕一件事,explosion.  此时的postgresql 就像一个充了气的娃娃,能将你已经预估好的数据的存储空间,完全填满,系统可能会停止运行,或者你的老板会给你在早晨 big  morning call。

当然可以谴责postgresql 的“不靠谱”,或者不如先问,是不是.......

到底是为什么会这样,(之前写过两篇文字关于vacuum可以翻翻哈),那就是MVCC,因为要结合自身,以及实现RDS数据库都有的MVCC ,在一群不大理解此事情的使用者“光顾” 后,postgresql 就变成了充气娃娃。

通过保持每行的多个版本,MVCC减少了放置在数据库行上的独占锁的数量。

我们可以来看看下面的例子,建立一个十分 清纯的表

CREATE TABLE exploded (id SERIAL PRIMARY KEY,x  INTEGER NOT NULL);

然后就插入 100万条记录

INSERT INTO exploded (x) VALUES (generate_series(1,1000000));

然后我们查看这100万条记录占用了35MB 的空间

UPDATE exploded SET x = x + 1;
SELECT pg_size_pretty(pg_relation_size('exploded'));

我们可以看一下在update 后这个表变成了69MB

我们将实验继续下去, 再次update 如果按照逻辑思维,表应该继续膨胀到 100MB 左右,但实际上,没有,压根就没有变化。

到这里的捋一捋,"充气娃娃"到底什么时候充气,什么时候就不膨胀了.

先问个问题,其他的数据库为什么不会这样,例如ORACLE ,MYSQL ,事实上是这样的吗,你何曾听过POSTGRESQL 有 REDO , UNDO ,而 ORACLE ,MYSQL 都有 UNDO log 这就是不同的数据库实现 MVCC 的手法不一样,ORACLE MYSQL 是去膨胀他的UNDO LOG ,而Postgresql 是在行设计来完成部分的UNDO LOG 的功能。所以mysql 需要进行purge, postgresql 需要 vacuum.

那到底为什么第二次不膨胀了的问题我想就很好回答了,如果你在ORACLE ,MYSQL 里面执行一个事务结束后,在执行一个事务,UNDO LOG 大部分可能性会复用空间来解决,所以POSTGRESQL 也会将不再使用的“死行”进行回收,我们也叫 vacuum. 来保证表空间不会无序大量的进行膨胀。

那问题剩下就是,怎么会导致无法vacuum(画外音,我这出事了,别讲大道理,赶紧给我解决方法) OK ,下面只说怎么和充气娃娃处

1  autovacuum 运行了吗 ?  通过查看 pg_stat_user_tables 可以看到 exploed 表 已经 autovacuum_count 两次了。

2 是否有长时间运行的语句

SELECT pid, datname, usename, state, backend_xmin,query,backend_type,query_start,client_addr

FROM pg_stat_activity

WHERE backend_xmin IS NOT NULL

ORDER BY age(backend_xmin) DESC;

3 您老人家是否开了复制槽,并且接收方已经“玩失踪了”

SELECT slot_name, slot_type, database, xmin
FROM pg_replication_slots
ORDER BY age(xmin) DESC;

4 两段式提交中,prepare操作操作由于某些原因 迟迟不能commit   (参见分布式数据库概念)

SELECT gid, prepared, owner, database, transaction AS xmin
FROM pg_prepared_xacts
ORDER BY age(transaction) DESC;

5  长时间不提交的事务,有没有

select datname,application_name,client_addr,backend_start,xact_start,query,state,backend_xid,backend_xmin

from pg_stat_activity

where (state = 'idle in transaction')

and xact_start is not null;

OK 在过滤了这些问题后,如果你的问题还没有解决的情况,应该不会太大

当然你也可以通过下面的方法来看看到底有多少表在你的数据库中有猫腻,有多少行没有被vacuum。

SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum

FROM pg_stat_all_tables

ORDER BY n_dead_tup

/ (n_live_tup

* current_setting('autovacuum_vacuum_scale_factor')::float8

+ current_setting('autovacuum_vacuum_threshold')::float8)

DESC

LIMIT 10;

至于上面的那些问题怎么解决,KILL 连接(参见另一篇 KILL -9 客户连接,你胆真肥的那篇,你可千万别弄巧成拙),或者是在出现问题,需要大量的整体的full vacuum,请参见 repack 那篇,基本上这样的问题就都解决了。

postgresql (参见数据库简史 1那篇),可以算是数据库界的元老了,能活这么长时间,也是有自己的优点的,所以在某些坛子看见提出 POSTGRESQL  VACUUM 以及提出PG数据库原理是怪胎,可以考虑另一个问题,postgresql 事务回滚怎么比 某些数据库要快?

不限制数据库种类,可以讨论,学习各种数据库的一个群,期待,其中有一些文件,可以随意自取,另外还会不断添加。

PostgreSQL 变成充气娃娃,怪谁?相关推荐

  1. python娃娃_充气娃娃?Python告诉你到底有多爽......

    上某东的时候,突然给我弹了一个充气娃娃的广告,于是就点进去就看了一下评论,全是神评论啊.所以我就想着把大神们的评论们扒拉下来仔细瞅瞅,于是这篇文章就诞生了 ,纯属学习啊,不要想入非非啊,还有,不喜勿喷 ...

  2. 在群晖上搭建基于 PostgreSQL 的 Joplin Server

    前言 笔者一直想找一款能代替 MWeb 的跨平台工具,由于工作的变更,很多 Mac 上好用的软件在 Windows 平台直接无法使用--反正探索了一圈感觉 Joplin 看起来是不错的,笔记功能和 M ...

  3. 数据库:PostgreSQL 和 MySQL对比

    比较版本:PostgreSQL 11 VS MySQL5.7(innodb引擎) Oracle官方社区版版权情况:PostgreSQL 11(免费开源).MySQL5.7 Oracle官方社区版(免费 ...

  4. 充气娃娃?Python告诉你到底有多爽......

    上某东的时候,突然给我弹了一个充气娃娃的广告,于是就点进去就看了一下评论,全是神评论啊.所以我就想着把大神们的评论们扒拉下来仔细瞅瞅,于是这篇文章就诞生了?,纯属学习啊,不要想入非非啊,还有,不喜勿喷 ...

  5. Postgresql 权限也能搞死你 之 小菜的一天 (2)

    PostgreSQL的权限问题估计没有多少人会关注, 小菜经过上次的教训后,又找了一份工作,今天又是第一天上班,不过小菜到底有没有吸收了上次的教训.  follow him 第一天上班,小菜被分配主管 ...

  6. Postgresql 日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...

  7. pg数据库开启远程连接_如何运行远程客户端连接postgresql数据库

    如何运行远程客户端连接 postgresql 数据库 前提条件是 2 个: 1 , pg_hba.conf 里面配置了运行远程客户机连接 pg_hba.conf 配置后需要重新加载 reload 生效 ...

  8. Postgresql: 时间戳long,TimeStamp,Date,String互转

    今天遇到一个神奇的问题:Postgre数据库里存的 10位long类型的时间戳,拿Java代码转完的日期年月日时分秒,转出来的时间和在pgAdmin里用sql转完的日期 整整差了8个小时..... 你 ...

  9. Postgresql:删除及查询字段中包含单引号的数据

    Postgresql:删除及查询字段中包含单引号的数据 1. 假设pg表t_info的属性att,值为固定的:'test' 2. 假设值为不固定的,'abcde' 参考 1. 假设pg表t_info的 ...

最新文章

  1. 查找 framework 文件中是否包含 WKWebView
  2. linux没有日志如何排错,在 Linux 中使用日志来排错
  3. 让指针指向初始位置c语言,初始C语言中的指针(翁凯男神MOOC)
  4. jms在jboss上的简单应用
  5. Tool/IDE之MinGW:MinGW(C++环境)的简介、安装、使用方法之详细攻略
  6. [XSY4170] 妹子(线段树上二分)
  7. 谷歌guava_Google Guava BloomFilter
  8. 【渝粤题库】国家开放大学2021春1373特殊教育概论题目
  9. docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像
  10. SharePoint 2013的100个新功能之搜索(一)
  11. android数据序列化的实现
  12. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
  13. SAP License:SAP系统上线时的相关检查清单
  14. 正在配置更新请勿关闭计算机怎么办,电脑开机“显示正在配置更新请勿关闭计算机”该怎么办?...
  15. 4千多个表情斗图图片大全ACCESS\EXCEL
  16. win7家庭版计算机添加用户,win7家庭版怎样设置来宾用户权限
  17. 用python画皮卡丘-用python画一只可爱的皮卡丘
  18. FullCalendar-vue demo例子
  19. 一文告诉你Java日期时间API到底有多烂
  20. Matlab + Adobe illustrator科研作图

热门文章

  1. 显控触摸屏android,关于显控触摸屏的应用
  2. [附源码]java毕业设计企业招标系统
  3. 操作系统实验(linux内核编译,添加系统调用,windows进程创建,脚本程序编写)
  4. 5款剪辑视频,总有一款是你想要的!
  5. 拜年神器php,Biu神器手机版
  6. 日本网民评论鸿蒙系统,华为P50终于来了:麒麟9000+鸿蒙系统,网友:幸福来得太突然...
  7. Windows XP 系统JDK安装
  8. 推荐常用的六个插件武装你的Chrome(附带文件下载)
  9. 大数据多元化教学评价_多元化
  10. 安装videosrt(视频字幕提取软件)