收藏 分享(赏)

PostgreSQL实例恢复与热备份技术内 幕.ppt

上传人:weiwoduzun 文档编号:4435608 上传时间:2018-12-28 格式:PPT 页数:24 大小:2.84MB
下载 相关 举报
PostgreSQL实例恢复与热备份技术内 幕.ppt_第1页
第1页 / 共24页
PostgreSQL实例恢复与热备份技术内 幕.ppt_第2页
第2页 / 共24页
PostgreSQL实例恢复与热备份技术内 幕.ppt_第3页
第3页 / 共24页
PostgreSQL实例恢复与热备份技术内 幕.ppt_第4页
第4页 / 共24页
PostgreSQL实例恢复与热备份技术内 幕.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、PostgreSQL实例恢复与热备份技术内幕,唐成大象会 2015 Postgres 用户大会,姓名:唐成,网名osdba 杭州沃趣网络科技有限公司首席数据库架构师 PostgreSQL修炼之道:从小工到专家作者 专注于数据库、存储领域 历任网易开发专家、阿里巴巴高级数据库专家,自我介绍,关注我,http:/ http:/,提纲,什么是实例恢复? 当数据库实例异常终止后,重启实例时会恢复到被异常终止时的状态 实例能正常启动 已提交事务的数据还在 导致数据库实例异常终止的原因 被kill掉,如内存不足时被OOM Killer给kill掉了 操作系统崩溃 硬件故障导致机器停机或重启,实例恢复与热备

2、份基础,实例恢复的原理 每项操作记录到重做日志中,实例重新启动后,重演(replay)日志,这个动作称为“前滚” “前滚”完成后,多数数据库还会把未完成的事务取消掉,就象这些事务从来没有执行过一样。这个动作称之为“回滚” 在“前滚”过程中,数据库是不能被用户访问的。 每次“前滚”时,从哪个点开始? Checkpoint点的概念登场了:保证Checkpoint点之前的数据已持久化了。 发生Checkpoint点的周期通常在几分钟,实例恢复与热备份基础,热备份的原理 把正在运行的数据库中的数据文件直接拷贝出来,然后把拷贝开始到结束之间的重做日志重新执行一遍,就能把数据库推到一个一致点。 但存在以下

3、问题? 如果正在运行的数据库正在写一个数据块,而你正在读这个数据块,有可能你读到的数据块的前半部分是新数据而后半部分是旧数据。 解决办法: 读的过程中,如果发现读出的数据块是不一致的,则再次读。 重做日志中有此块的一个基础备份,即使不一致,则会用日志中的块覆盖。,实例恢复与热备份基础,PostgreSQL实例恢复的总体设计,控制文件,记录上次checkpoint点时WAL日志的位置。 文件为global/pg_control,记录重做日志,每次事务提交后,所做操作必须先持久化到此文件中。 在目录pg_xlog下,事务提交后,所做操作不必马上持久化,但checkpoint点之前的数据必须持久化到

4、数据文件中 所在目录:base/,记录每个事务的状态,是提交还是已回滚,具体见后面的多版本实现。 文件在目录pg_clog下,WAL文件名称的秘密,WAL文件的默认大小为16M。如果改变需要重新编译程序 LSN(Log Sequence Number):WAL日志的绝对位置 文件名由24字符组成 时间线:英文为timeline,是以1开始的递增数字,如1,2,3. LogId:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3.。实际为LSN的高32bit LogSeg:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3.。 LogSeg是LogSeg是LSN的低32b

5、it的字节的值再除以WAL文件大小(16M)的结果。注意:当LogId为0时,LogSeg是从1开始的。,WAL日志文件的秘密,00000001,00000000,00000086,时间线,LogId,LogSeg,具体可见:http:/ 在做一次checkpoint时,checkpoint之前的WAL日志文件会被“删除” 通常并不是真的“删除”,而是被复用,被改名成新的一个WAL文件。为什么? pg_xlog下面序号最大的文件并不是当前正在写的WAL文件,而有可能是刚被改名过来的旧WAL文件。 直接改名过来的旧WAL文件,并不会把原来的内容清零,这是否会有问题? 每条WAL记录上有LSN。

6、改名是直接rename吗? 不是,建立一个新的硬链接,然后删除旧的文件,WAL日志文件的秘密,PostgreSQL的多版本 什么?PostgreSQL没有回滚段! 是的,没有回滚段。旧数据是放在原有数据文件中的 如果放在原有的数据文件中,旧数据越来越多怎么办? 垃圾回收操作vacuum来做这个事。 有自动垃圾回收autovacuum 更新操作中新行的物理位置发生了变化,非更新列的索引是不是也要更新? 通常不会,HOT技术。如果原有的数据块之间有空间,旧行与新行之间会建一个链接,索引上仍然指向旧的数据行。 垃圾回收的代价会不会影响性能?有很多参数控制这个影响:vacuum_cost_delay,

7、vacuum_cost_limit,PostgreSQL多版本的秘密,PostgreSQL事务ID秘密 常常被称为xid 无符号的32bit的数字表示 每产生一个事务,就会加1,到达最大值后,又重新开始。 如何知道事务是提交了还是回滚了? 事务的状态记录在commitlog中,即pg_clog目录下的文件中 每个事务的状态用两个bit来表示: #define TRANSACTION_STATUS_IN_PROGRESS 0x00 #define TRANSACTION_STATUS_COMMITTED 0x01 #define TRANSACTION_STATUS_ABORTED 0x02 #

8、define TRANSACTION_STATUS_SUB_COMMITTED 0x03,PostgreSQL多版本的秘密,PostgreSQL多版本具体是如何实现的? 每行上有xmin和xmax两个系统字段 当插入一行数据时,将这行上的xmin设置为当前的事务id,而xmax设置为0 当更新一行时,实际上是插入新行,把旧行上的xmax设置为当前事务id,新插入行的xmin设置为当前事务id,新行的xmax设置为0 当删除一行时,把当前行的xmax设置为当前事务id 当读到一行时,到commitlog中查询xmin和xmax对应的事务状态是否是已提交还是回滚了,就能判断出此行对当前行是否是可见

9、。 autovacuum进程会把一些不要的旧行清理掉,PostgreSQL多版本的秘密,PostgreSQL多版本实现有几个问题 事务ID到达最大的一个数字后,又重新开始,会发生什么?如何解决? 此问题被称之为事务ID回卷问题(Transaction ID Wraparound) 记录事务的commitlog文件会不会不断的增大?,PostgreSQL多版本的秘密,事务id回卷问题的解决,事务id的范围可以认为组成了一个圆 事务id从0开始,到达最大之后又变回0. 对一个指定的事务ID,当前位置之前有231个事务比其旧,位置之后有231个比其新 由vacuum保证整个数据库中的所有表中的xmi

10、n和xmax中事务ID的值的范围小于231,太旧的事务ID值会设置为一个特殊的事务ID: FrozenXID FrozeXID认为是比所有的事务ID都旧,PostgreSQL多版本的秘密,比当前事务新的事务,事务id回卷解决的细节 有三个特殊值的事务ID 0: InvalidXID,无效事务ID 1: BootstrapXID,表示系统表初使化时的事务ID,比任务普通的事务ID都旧。 2:FrozenXID,冻结的事务ID,比任务普通的事务ID都旧。 大于2的事务ID都是普通的事务ID。 commitlog的大小 理论上,数据库中事务ID最多231个,每个事务占用2bit,所以commitlo

11、g最大512M字节 autovacuum_freeze_max_age为2亿,PostgreSQL多版本的秘密,事务id回卷解决的细节(续) 比较事务新旧的方法: 两个普通事务的比较方法:(int32) (id1 - id2) 0 表达式算出来值为真,则id1比id2更旧一些,为假则id1比id2新 例子:id1=4294967290,id2=5,id2是当事务回卷后的值,id1-id2=4294967285,而4294967285因大于231,转成int32后会变成一个负数,表过式为真,所以id1比id2更旧 BootstrapXID比所有其它事务都旧,包括FrozenXID FrozenX

12、ID比普通事务旧,PostgreSQL多版本的秘密,显示控制文件的内容,控制文件中的秘密,数据库的唯一标识串的秘密 Database system identifier: 6197591927813975882 initdb时生成的一个64bit的整数,生成过程为: gettimeofday(,控制文件中的秘密,控制文件中的秘密,为什么有 两个last checkpoint?,实例恢复时,会从上面的哪个checkpoint点开始apply redo日志? checkpoint本身也会在WAL中写一个日志,这条日志的位置为就是“Lastest checkpoint location” 当发生ch

13、eckpoint点时WAL日志的当前位置为“Latest checkpoints REDO location”,Standby库的控制文件的秘密 Standby库的控制文件与主库是否相同? 主库发生checkpoint是否会复制到Standby库? “Minimum recovery ending location”? 备库中每replay一些WAL日志后,就会做一次checkpoint点,然后把这个checkpoint点的信息记录到控制文件中。 备库replay一些日志后,会把产生脏数据的最新日志的位置记录到“Minimum recovery ending location”。 为什么要记录

14、呢?为了Standby库只读的功能。 备库异常停机后再启动,需要replay日志到超过“Minimum recovery ending location”位置后,才能对外提供只读服务,或才能激活成主库,如果没有到这个点,则数据会不致,控制文件中的秘密,Standby库的控制文件的秘密(续) 以下几个参数的意义是什么? Backup start location Backup end location End-of-backup record required 要搞清楚以上几个参数意义,需要知道热备份的过程,控制文件中的秘密,主库上执行 pg_start_backup(mybackup);,把主库数据目录拷贝到备库,编辑recovery.conf,启动备库,生成了backup_label文件,backup_label也拷贝到了备库,备库启动时,如果发现了有backup_label这个文件,就会从这个文件中记录的点开始恢复,同时备库会把此位置记录到控制文件的“Backup start location”中。,最后为QMonitor打点小广告,QMonitor的TOP SQL,Q,A,&,http:/ 沃趣科技,关注我,关注沃趣,http:/ osdba,提问&答疑,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > GRE

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报