Skip to main content

moregeek program

pg-日常运维_mysql dba攻坚之路的博客-多极客编程

VACUUM

表膨胀是什么

有效数据量不变,表越来越大,扫描的效率变低。是因为PG的MVCC写数据时,旧数据不删除,把新数据插入,将旧数据标记为无效,清理之前一直占用空间。执行update的话就是insert+delete的原理,依然会导致表膨胀。


vacuum的作用

磁盘清理dead tuple ;更新统计信息;重组数据;解决事务ID回卷问题。

vacuum : 不要求获得排它锁,找到那些旧的“死”数据,标记为可用状态,不进行空间合并

vacuum full: 就是除了vacuum,进行空间合并,它需要lock table

vacuum analyze: 更新统计信息,使得优化器能够选择更好的方案执行sql

vacuum freeze: 表记录冻结,可解决事务id回卷的问题​


vacuum做了什么

1、清除update或delete 操作后留下的死元组

2、跟踪表块中可用空间,更新free space map

3、更新visibility map,index only scan 以及后续vacuum都会利用到

4、冻结表中的行,防止事务ID回卷

5、配合analyze ,定期更新统计信息


FSM是什么

普通的vacuum只是清理死元组,"腾出"空间,在今后有新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑新增页面。但是每个页面的空闲空间又不是固定大小的,所以如果要利用这些空间空间,就需要遍历一遍数据页面来找到它们,这样会造成比较大的开销。因此就设计了用来记录每个页面剩余空间的空闲空间映射表FSM(Free Space Mapping),以便高效的将空闲空间管理起来,方便查找和重新使用。FSM在第一次vacuum之后会出现,可以使用pg_freespacemap扩展查看。

简单来说,就是vacuum只是清理死元组,利用FSM可以高效的将空间管理起来,方便查找和重新使用。

可以看到表在磁盘中的fsm文件

select pg_relation_filepath('test01');
pg_relation_filepath
----------------------
base/13593/16521
(1 row)
-rw------- 1 postgres postgres 24576 Aug 10 17:25 16521_fsm
-rw------- 1 postgres postgres 8192 Aug 10 17:25 16521_vm

visibility map是什么

all_visible为t表示全部可见,不包含死元组,作用是加快vacuum,进行vacuum时,当扫描到all_visible为t时,则直接跳过。

create extension pg_visibility;
select * from pg_visibility('test01');
blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
0 | t | f | t
1 | t | f | t

vacuum full

极端情况下,就会发生每个页面的"填充率"特别低,因此,需要引入vacuum full,vacuum full会对表进行重组,也就意味着表的oid会变,所以不能我们在日常操作中,要定位表的oid的时候,不能通过pg_class的oid来找,得通过pg_class的relfilenode来找,这样才精确。而且,vacuum full最大会占据原来磁盘空间的两倍,所以请预留好磁盘空间。

如下实验,可以看到经过vacuum full后表的OID已经改变

insert into test02 values (generate_series(1,100));
postgres=# vacuum test02;
VACUUM
postgres=# select pg_relation_filepath('test02');
pg_relation_filepath
----------------------
base/13593/16672
(1 row)

postgres=# vacuum full test02;
VACUUM
postgres=# select pg_relation_filepath('test02');
pg_relation_filepath
----------------------
base/13593/16718
(1 row)


AutoVacuum

触发AutoVacuum条件,达到这个数据量死元组变化

reltuples*autovacuum_vacuum_scale_factor+autovacuum_vacuum_threshold

postgres=# show autovacuum_vacuum_threshold;
autovacuum_vacuum_threshold
-----------------------------
50
(1 row)


postgres=# show autovacuum_vacuum_scale_factor;
autovacuum_vacuum_scale_factor
--------------------------------
0.2
(1 row)

postgres=# insert into test02 values (generate_series(1,100));
INSERT 0 100

reltuples*autovacuum_vacuum_scale_factor+autovacuum_vacuum_threshold
触发AutoVacuum条件,达到这个数据量变化

postgres=# select 100*0.2+50;
?column?
----------
70.0
(1 row)
表存活行数
select reltuples ,relpages from pg_class where relname='test02';
reltuples | relpages
-----------+----------
100 | 1

也可以修改触发AutoVacuum的条件

 alter table test02 set (autovacuum_vacuum_scale_factor=0.001);

在操作系统层面可以看到autovacuum的进程,autovacuum launcher 是守护进程,fork出autovacuum_max_workers进程进行AutoVacuumpg_stat_progress_vacuum可以看到vacuum进行到那一步骤了。

select name,setting from pg_settings where name like '%autovacuum%';
name | setting
-------------------------------------+-----------
autovacuum | on
autovacuum_analyze_scale_factor | 0.1
autovacuum_analyze_threshold | 50
autovacuum_freeze_max_age | 200000000
autovacuum_max_workers | 3
autovacuum_multixact_freeze_max_age | 400000000
autovacuum_naptime | 60
autovacuum_vacuum_cost_delay | 2
autovacuum_vacuum_cost_limit | -1
autovacuum_vacuum_scale_factor | 0.2
autovacuum_vacuum_threshold | 50
autovacuum_work_mem | -1
log_autovacuum_min_duration | -1
(13 rows)


重建索引

reindex 是8级锁

reindex index concurrently等价于online ddl

©著作权归作者所有:来自51CTO博客作者进击的CJR的原创作品,请联系作者获取转载授权,否则将追究法律责任

百度交易中台之资产系统架构浅析_百度geek说的博客-多极客编程

作者 | 小黑哥导读:百度交易中台资产系统是基于百度收银台和交易系统下,对公司内C端个人现金、虚拟类资产(虚拟币等)业务进行收拢、管理,提供安全可靠且符合国家清算规范的用户资产管理能力。交易中台资产系统基于现有交易中台部分能力,一站式解决业务方对用户资产管理、平台分账、对账、财报等问题,快速支持资产类业务发展。全文5085字,预计阅读时间13分钟。一、系统介绍百度交易中台支持百度集团内部的代收代付

lua脚本在redis事务中的应用实践_京东云官方的博客-多极客编程

使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务中的命令要么全部被执行,要么全部都不执行(原子操作)。但其中有命令因业务原因执行失败并不会阻断后续命令的执行,且也无法回滚已经执行过的命令。如果想要实现和MySQL一样的事务处理可以使用Lua脚本来实现,Lua脚本中

mysqldump备份期间做ddl会发生什么_mysql dba攻坚之路的博客-多极客编程

MDL锁当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。MDL 会直到事务提交才释放,在做表结构变更的时候,你一定要小心不要导致锁住线上查询和更新。读写互斥读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始

keewidb:兼容redis协议,领跑nosql_腾讯云数据库的博客-多极客编程

如果现在的我们离开了互联网,生活会是什么样子?互联网++++,已经深刻渗透到人们的生活中。不知道大家有没有想过?每一个互联网+结合的背后都是海量的存储需求。你查看的每一个商品、组建的每一个战队、阅读的每一篇文章,基于互联网的每一个兴趣爱好,都有它的key和value。在 key-value 数据库领域,Redis 因其高吞吐、低延迟、丰富的数据结构一直受开发者欢迎,但 Redis 全内存方案无法解

pg--扫描方式_mysql dba攻坚之路的博客-多极客编程

CTID是什么CTID是一个系统列,用于标识某一元组位于哪个位置,由(block number + 块内的偏移量offset)组成和oracle的rowid十分类似select attname from pg_attribute where attrelid='test2'::regclass; attname ---------- cmax cmin ctid 类似oracle的r

pg--执行计划之辅助算法_mysql dba攻坚之路的博客-多极客编程

Sort需要排序数据时,这个节点就会作为计划树的一部分被添加。可以显式或隐式地要求排序数据postgres=# drop table demotable;DROP TABLEpostgres=# CREATE TABLE demotable (num numeric, id int);CREATE TABLEpostgres=# INSERT INTO demotable SELECT rando

百度交易中台之资产系统架构浅析_百度geek说的博客-多极客编程

作者 | 小黑哥导读:百度交易中台资产系统是基于百度收银台和交易系统下,对公司内C端个人现金、虚拟类资产(虚拟币等)业务进行收拢、管理,提供安全可靠且符合国家清算规范的用户资产管理能力。交易中台资产系统基于现有交易中台部分能力,一站式解决业务方对用户资产管理、平台分账、对账、财报等问题,快速支持资产类业务发展。全文5085字,预计阅读时间13分钟。一、系统介绍百度交易中台支持百度集团内部的代收代付

edius 9.0软件安装包下载及安装教程_乐乐软件管家的博客-多极客编程

EDIUS 9.0软件简介:EDIUS 9.0是非常优秀的编辑软件,拥有完善的文件工作流程,提供了实时、多轨道、多格式混编、合成、色键、字幕和时间线输出功能。EDIUS因其迅捷、易用和可靠的稳定性为广大专业制作者和电视人所广泛使用,是混合格式编辑的绝佳选择。EDIUS的设计哲学是总是让用户可以立即应用最新的先进的视频格式。EDIUS一直以来就是格式支持的领导者,完全支持所有主要设备制造商,比如松下

运维智能化的三大关键技术_枫叶飘飘的博客-多极客编程

以往基础设施运维管理(ITOM)、配置管理数据库、网络性能监控系统和应用性能监控系统的建设有相对标准化的产品作为基础,也有方法学作为参考。相比之下,应用智能运维系统更贴近企业多样化的应用系统、业务流程和用户场景,没有开箱即用的工具平台和普遍适用的方法学参考。因此,其对扩展性和可定制化能力的要求较高,往往需要针对特定场景定制智能化算法,对团队的技术能力要求较高。应用智能运维是在现有的应用性能管理系统

【服务器数据恢复】服务器误删除导致邮件数据丢失的数据恢复案例_sun的博客-多极客编程

服务器数据恢复环境: 8块盘组成的RAID5磁盘阵列; EXT3文件系统。 服务器故障: 由于误删除导致文件系统中的邮件丢失。 服务器数据恢复过程: 一、服务器数据恢复工程师为每块磁盘做镜像, 后续所有的数据恢复操作都在镜像盘上进行, 不会对原始磁盘数据造成二次破坏。 二、分析数据在硬盘中分布的规律,获取RAID类型、RAID条带大小、每块磁盘的顺序等RAID信息。根据获取到的RAID信息重新组建

javaweb核心之servletconfig_紫轩蝶泪的博客-多极客编程

2 ServletConfig 2.1 ServletConfig概述 2.1.1 基本概念 它是Servlet的配置参数对象,在Servlet规范中,允许为每个Servlet都提供一些初始化配置。所以,每个Servlet都一个自己的ServletConfig。它的作用是在Servlet初始化期间,把一些配置信息传递给Servlet。 2.1.2 生命周期 由于它是在初始化阶段读取了web.xml

数据中台与业务中台的区别与联系_枫叶飘飘的博客-多极客编程

业务中台更多偏向于业务流程管控,将业务流程中共性的服务抽象出来,形成通用的服务能力。比如电商平台,有C2C、B2C、C2B、B2B四种模式,其中订单、交易、商品管理、购物车等模块都是有共性的。将这些组件沉淀出来,形成电商行业的业务中台,再基于这些业务中台组件的服务能力,可以快速搭建前台应用,譬如C2C模式的淘宝、B2C模式的天猫、B2B模式的1688、C2B模式的聚划算,用户通过这些前台业务触点使