PostgreSQL实例恢复与热备份技术内幕分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PostgreSQL实例恢复与热备 份技术内幕
唐成@大象会 2015 Postgres 用户大会
自我介绍 姓名:唐成,网名osdba 杭州沃趣网络科技有限公司首席数据库架构师 《PostgreSQL修炼之道:从小工到专家》作者 专注于数据库、存储领域 历任网易开发专家、阿里巴巴高级数据库专家 关注我
– – – – #define TRANSACTION_STATUS_IN_PROGRESS 0x00 #define TRANSACTION_STATUS_COMMITTED 0x01 #define TRANSACTION_STATUS_ABORTED 0x02 #define TRANSACTION_STATUS_SUB_COMMITTED 0x03
当数据库实例异常终止后,重启实例时会恢复到被异常终止 时的状态 • 实例能正常启动 • 已提交事务的数据还在 导致数据库实例异常终止的原因 • 被kill掉,如内存不足时被OOM Killer给kill掉了 • 操作系统崩溃 • 硬件故障导致机器停机或重启
实例恢复与热备份基础 实例恢复的原理
时间线:英文为timeline,是以1开 始的递增数字,如1,2,3... LogId:32bit长的一个数字,是以0 开始递增的数字,如0,1,2,3...。实际 为LSN的高32bit LogSeg:32bit长的一个数字,是以 0开始递增的数字,如0,1,2,3...。 LogSeg是LogSeg是LSN的低32bit的 字节的值再除以WAL文件大小( 16M)的结果。注意:当LogId为0 时,LogSeg是从1开始的。
实例恢复与热备份基础 热备份的原理
把正在运行的数据库中的数据文件直接拷贝出来,然后把拷 贝开始到结束之间的重做日志重新执行一遍,就能把数据库 推到一个一致点。 但存在以下问题? • 如果正在运行的数据库正在写一个数据块,而你正在读这 个数据块,有可能你读到的数据块的前半部分是新数据而 后半部分是旧数据。 解决办法: • 读的过程中,如果发现读出的数据块是不一致的,则再次 读。 • 重做日志中有此块的一个基础备份,即使不一致,则会用 日志中的块覆盖。
事务提交后,所做操作不必 马上持久化,但checkpoint 点之前的数据必须持久化到 数据文件中 所在目录: base/<dboid>/<relfileno de>
WAL日志文件的秘密
WAL文件名称的秘密
WAL文件的默认大小为 16M。如果改变需要重新 编译程序 LSN(Log Sequence Number):WAL日志的 绝对位置 文件名由24字符组成
每项操作记录到重做日志中,实例重新启动后,重演(replay )日志,这个动作称为“前滚” “前滚”完成后,多数数据库还会把未完成的事务取消掉, 就象这些事务从来没有执行过一样。这个动作称之为“回滚 ” 在“前滚”过程中,数据库是不能被用户访问的。 每次“前滚”时,从哪个点开始? • Checkpoint点的概念登场了:保证Checkpoint点之前的数据 已持久化了。 • 发生Checkpoint点的周期通常在几分钟
http://blog.osdba.net http://osdbablog.sinaapp.com
提纲
1 2 3 4 5
实例恢复与热备份基础 PostgreSQL实例恢复总体设计 WAL日志文件的秘密 PostgreSQL多版本的秘密 控制文件中的秘密
实例恢复与热备份基础 什么是实例恢复?
00000001 00000000 00000086 时间线 LogId LogSeg
具体可见:http://blog.osdba.net/534.html
WAL日志文件的秘密 WAL日志文件什么时候删除?
在做一次checkpoint时,checkpoint之前的WAL日志文件会被 “删除” 通常并不是真的“删除”,而是被复用,被改名成新的一个 WAL文件。为什么? pg_xlog下面序号最大的文件并不是当前正在写的WAL文件, 而有可能是刚被改名过来的旧WAL文件。 直接改名过来的旧WAL文件,并不会把原来的内容清零,这 是否会有问题? • 每条WAL记录上有LSN。 改名是直接rename吗? • 不是,建立一个新的硬链接,然后删除旧的文件
PostgreSQL多版本的秘密 PostgreSQL的多版本
什么?PostgreSQL没有回滚段!!! 是的,没有回滚段。旧数据是放在原有数据文件中的 如果放在原有的数据文件中,旧数据越来越多怎么办? • 垃圾回收操作vacuum来做这个事。 • 有自动垃圾回收autovacuum 更新操作中新行的物理位置发生了变化,非更新列的索引是 不是也要更新? • 通常不会,HOT技术。如果原有的数据块之间有空间,旧 行与新行之间会建一个链接,索引上仍然指向旧的数据行 。 垃圾回收的代价会不会影响性能? • 有很多参数控制这个影响:vacuum_cost_delay, vacuum_cost_limit
PostgreSQL多版本的秘密 PostgreSQL事务ID秘密
常常被称为xid • 无符号的32bit的数字表示 • 每产生一个事务,就会加1,到达最大值后,又重新开始 。 如何知道事务是提交了还是回滚了? • 事务的状态记录在commitlog中,即pg_clog目录下的文件 中 • 每个事务的状态用两个bit来表示:
PostgreSQL实例恢复的总体设计
记录上次checkpoint点时 WALห้องสมุดไป่ตู้志的位置。 文件为global/pg_control
记录重做日志,每次事务 提交后,所做操作必须先 持久化到此文件中。 在目录pg_xlog下
控制文件
WAL文件
数据文件
事务状态文件
记录每个事务的状态,是 提交还是已回滚,具体见 后面的多版本实现。 文件在目录pg_clog下
唐成@大象会 2015 Postgres 用户大会
自我介绍 姓名:唐成,网名osdba 杭州沃趣网络科技有限公司首席数据库架构师 《PostgreSQL修炼之道:从小工到专家》作者 专注于数据库、存储领域 历任网易开发专家、阿里巴巴高级数据库专家 关注我
– – – – #define TRANSACTION_STATUS_IN_PROGRESS 0x00 #define TRANSACTION_STATUS_COMMITTED 0x01 #define TRANSACTION_STATUS_ABORTED 0x02 #define TRANSACTION_STATUS_SUB_COMMITTED 0x03
当数据库实例异常终止后,重启实例时会恢复到被异常终止 时的状态 • 实例能正常启动 • 已提交事务的数据还在 导致数据库实例异常终止的原因 • 被kill掉,如内存不足时被OOM Killer给kill掉了 • 操作系统崩溃 • 硬件故障导致机器停机或重启
实例恢复与热备份基础 实例恢复的原理
时间线:英文为timeline,是以1开 始的递增数字,如1,2,3... LogId:32bit长的一个数字,是以0 开始递增的数字,如0,1,2,3...。实际 为LSN的高32bit LogSeg:32bit长的一个数字,是以 0开始递增的数字,如0,1,2,3...。 LogSeg是LogSeg是LSN的低32bit的 字节的值再除以WAL文件大小( 16M)的结果。注意:当LogId为0 时,LogSeg是从1开始的。
实例恢复与热备份基础 热备份的原理
把正在运行的数据库中的数据文件直接拷贝出来,然后把拷 贝开始到结束之间的重做日志重新执行一遍,就能把数据库 推到一个一致点。 但存在以下问题? • 如果正在运行的数据库正在写一个数据块,而你正在读这 个数据块,有可能你读到的数据块的前半部分是新数据而 后半部分是旧数据。 解决办法: • 读的过程中,如果发现读出的数据块是不一致的,则再次 读。 • 重做日志中有此块的一个基础备份,即使不一致,则会用 日志中的块覆盖。
事务提交后,所做操作不必 马上持久化,但checkpoint 点之前的数据必须持久化到 数据文件中 所在目录: base/<dboid>/<relfileno de>
WAL日志文件的秘密
WAL文件名称的秘密
WAL文件的默认大小为 16M。如果改变需要重新 编译程序 LSN(Log Sequence Number):WAL日志的 绝对位置 文件名由24字符组成
每项操作记录到重做日志中,实例重新启动后,重演(replay )日志,这个动作称为“前滚” “前滚”完成后,多数数据库还会把未完成的事务取消掉, 就象这些事务从来没有执行过一样。这个动作称之为“回滚 ” 在“前滚”过程中,数据库是不能被用户访问的。 每次“前滚”时,从哪个点开始? • Checkpoint点的概念登场了:保证Checkpoint点之前的数据 已持久化了。 • 发生Checkpoint点的周期通常在几分钟
http://blog.osdba.net http://osdbablog.sinaapp.com
提纲
1 2 3 4 5
实例恢复与热备份基础 PostgreSQL实例恢复总体设计 WAL日志文件的秘密 PostgreSQL多版本的秘密 控制文件中的秘密
实例恢复与热备份基础 什么是实例恢复?
00000001 00000000 00000086 时间线 LogId LogSeg
具体可见:http://blog.osdba.net/534.html
WAL日志文件的秘密 WAL日志文件什么时候删除?
在做一次checkpoint时,checkpoint之前的WAL日志文件会被 “删除” 通常并不是真的“删除”,而是被复用,被改名成新的一个 WAL文件。为什么? pg_xlog下面序号最大的文件并不是当前正在写的WAL文件, 而有可能是刚被改名过来的旧WAL文件。 直接改名过来的旧WAL文件,并不会把原来的内容清零,这 是否会有问题? • 每条WAL记录上有LSN。 改名是直接rename吗? • 不是,建立一个新的硬链接,然后删除旧的文件
PostgreSQL多版本的秘密 PostgreSQL的多版本
什么?PostgreSQL没有回滚段!!! 是的,没有回滚段。旧数据是放在原有数据文件中的 如果放在原有的数据文件中,旧数据越来越多怎么办? • 垃圾回收操作vacuum来做这个事。 • 有自动垃圾回收autovacuum 更新操作中新行的物理位置发生了变化,非更新列的索引是 不是也要更新? • 通常不会,HOT技术。如果原有的数据块之间有空间,旧 行与新行之间会建一个链接,索引上仍然指向旧的数据行 。 垃圾回收的代价会不会影响性能? • 有很多参数控制这个影响:vacuum_cost_delay, vacuum_cost_limit
PostgreSQL多版本的秘密 PostgreSQL事务ID秘密
常常被称为xid • 无符号的32bit的数字表示 • 每产生一个事务,就会加1,到达最大值后,又重新开始 。 如何知道事务是提交了还是回滚了? • 事务的状态记录在commitlog中,即pg_clog目录下的文件 中 • 每个事务的状态用两个bit来表示:
PostgreSQL实例恢复的总体设计
记录上次checkpoint点时 WALห้องสมุดไป่ตู้志的位置。 文件为global/pg_control
记录重做日志,每次事务 提交后,所做操作必须先 持久化到此文件中。 在目录pg_xlog下
控制文件
WAL文件
数据文件
事务状态文件
记录每个事务的状态,是 提交还是已回滚,具体见 后面的多版本实现。 文件在目录pg_clog下