《VACUUM深度解析及最佳实践-数据库管理、开发实践专场(33页).pdf》由会员分享,可在线阅读,更多相关《VACUUM深度解析及最佳实践-数据库管理、开发实践专场(33页).pdf(33页珍藏版)》请在三个皮匠报告上搜索。
1、VACUUMVACUUM深度解析及最佳实践深度解析及最佳实践 唐成中启乘数唐成(网名osdba)中启乘数科技创始人,PostgreSQL修炼之道:从小工到专家的作者,PostgreSQL中国用户会副主席。历任过阿里巴巴高级数据库专家,从事过阿里巴巴Greenplum、PostgreSQL数据库的架构设计和运维。目前专注于高性能数据库解决方案及高性能存储技术。我们为什么要关心我们为什么要关心Vacuum?防止因事物ID回卷问题(Transaction ID Wraparound)而导致的宕机 表膨胀问题 性能问题.Transaction ID Wraparound 会发生什么?当还剩下1000万
2、可用的xid时,日志中出现如下告警:WARNING:database XXX must be vacuumed within 177009986 transactionsHINT:To avoid a database shutdown,execute a database-wide VACUUM in XXX.那么在xid被用到的剩余100万时,的log会报警并主动down库:If these warnings are ignored,the system will shut down and refuse to start any new transactions once there a
3、re fewer than 1 million transactions left until wraparound:ERROR:database is not accepting commands to avoid wraparound data loss in database XXXX表膨胀问题表膨胀问题 数据库的空间一直膨胀 表的空间一直膨胀 之前没有防治好,事后处理很麻烦 事后想缩减空间,如果通过vacuum full会锁表,无法在线处理 第三方工具来在线缩减空间,比较麻烦。风险问题 难受!Vacuum是什么?是什么?Vacuum:“真空吸尘器真空吸尘器”吸什么“尘”?垃圾数据?旧版
4、本数据?需要了解MVCC什么是什么是MVCC?Multiversion concurrency control(MCC or MVCC),is a concurrency control method commonly used by database management systems to provide concurrent access to the database and in programming languages to implement transactional memory.借助借助wiki上的解释:上的解释:两大功能读不阻塞写,写不阻塞读提供快照读(一致性读)的功
5、能MVCC如何实现如何实现 简单说,就是更新数据时,保留原先版本的数据,即一行数据存在多个版本。实现方法:回滚段的实现方法(Oracle、MySQL Innodb的实现方法)在原先的数据文件中的旧版本数据不删除,生成新版本的数据(PostgreSQL的实现方法)通常与事务的功能集成在一起:但MVCC时事物回滚或提交之后,旧版本的数据仍然需要保留一段时间,是延迟清除的。旧版本数据延迟清除的原因旧版本数据延迟清除的原因 就是为了提供快照读(一致性读)的功能 对于Read Commited隔离级别:需要保证当开始执行一个SQL之后,这个SQL是读一个不变的快照的数据,即使在这个SQL执行过程中有其它
6、的事物提交了,这些提交的数据对于这个SQL也是看不到了,这样保证了数据的一致性。对于Read Repeatable隔离级别:从这个事物开始之后,看到的数据就是一个不变的数据,执行相同的SQL总是可以看到相同的数据。所以叫“可重复读”快照读(一致性读)的用途快照读(一致性读)的用途 在一个繁忙的转帐的系统中,如果没有一致性读,此管理者中很难查询到一致的数据。用户A转账100元管理者数据库户名户名账户费用账户费用行号行号.用户A12202000.用户B7806000.我要查所有用户的账户费用的总和:select sum(money)from T;账户表T用户BVacuum就是为了清除旧版本数据就是