- 浏览: 232267 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
Pg XLOG 文件(常说的 REDOLOG )名字的命名方法是在 XLogFileName 宏里定义的,分别由时间线 ID 、日志 ID 、段 ID 的八位 16 进制数依次构成。例如 00000001000000010000008F 。
#define XLogFileName (fname, tli, log, seg) \
snprintf(fname, MAXFNAMELEN, "%08X%08X%08X" , tli, log, seg)
不同的段 ID 对应不同的物理 XLOG 日志文件,日志 ID 是逻辑概念,有多个物理 XLOG 日志文件组成。
Pg XLOG 文件(常说的 REDOLOG )的大小初始值是在 configure.in 和 configure 文件里设置的,默认大小是 16M 。大小设置形式如下
wal_segsize=16
XLOG_SEG_SIZE (${wal_segsize} * 1024 * 1024)=16M
这个 XLOG_SEG_SIZE 是 XLOG 日志文件的段大小,就是一个物理的日志文件的大小。一个逻辑的 XLOG 日志文件大小是 4Gb 。
Pg XLOG 文件的存储格式大致如下:
< PageHeaderData >
<XLogRecord>
<rmgr-specific data>
<BkpBlock>
<XLogRecData> 里面包括 <CheckPoint> 等
<BkpBlock>
<XLogRecData>
<BkpBlock>
<XLogRecData>
……
1
先看 < PageHeaderData > ,这个根据不同情况对应 XLogLongPageHeaderData 或 XLogPageHeaderData 结构。 XLOG 文件头用 XLogLongPageHeaderData 结构和一些合适场合, XLogPageHeaderData 用在文件里的页面头。结构 XLogLongPageHeaderData 的第一个成员是结构 XLogPageHeaderData 。下面是这两个结构定义:
typedef struct XLogLongPageHeaderData
{
XLogPageHeaderData std ; /* 页头结构 */
uint64 xlp_sysid ; /* 控制文件 pg_control 里的系统标识符 */
uint32 xlp_seg_size ; /* XLOG 文件大小 */
uint32 xlp_xlog_blcksz ; /* XLOG 文件页面大小 */
} XLogLongPageHeaderData ;
XLOG 文件里的页面头结构
typedef struct XLogPageHeaderData
{
uint16 xlp_magic ; /* WAL 版本指示器 */
uint16 xlp_info ; /* flag bits, see below */
TimeLineID xlp_tli ; /* 本页第一个记录的时间线 */
XLogRecPtr xlp_pageaddr ; /* 本页 XLOG 位置 */
} XLogPageHeaderData ;
XLOG 文件里的页面头结构 XLogPageHeaderData 的成员 xlp_magic 表示 WAL 版本号。成员 xlp_tli 表示本页第一个记录的时间线,成员 xlp_pageaddr 表示本页的 XLOG 位置。成员 xlp_info 表示紧跟页头的记录是否是跨页记录的一部分,或者该页头结构 XLogPageHeaderData 是否在文件头结构 XLogLongPageHeaderData 里。其值定义见下面:
当记录跨页时,在后面的页头里设置标志
#define XLP_FIRST_IS_CONTRECORD 0x0001
这个指明是长页头(多用于文件第一页)
#define XLP_LONG_HEADER 0x0002
在 xlp_info 中定义的所有标志位(用于头的有效性检查)
#define XLP_ALL_FLAGS 0x0003
如果成员 xlp_info 的值是 XLP_FIRST_IS_CONTRECORD ,表示页头后面跟的是一个跨页结构的一部分。
XLOG 文件头结构 XLogLongPageHeaderData 的成员 xlp_seg_size 表示 XLOG 文件大小,默认是 16M 。在 configure.in 和 configure 文件里设置形式如下
wal_segsize=16
XLOG_SEG_SIZE (${wal_segsize} * 1024 * 1024)=16M
成员 xlp_xlog_blcksz 表示文件里的页面大小,默认是 8k 。
2
<XLogRecord> 根据情况不同,可能是 XLogRecord 或 XLogContRecord 结构,只有在上一个页面最后一个记录是跨页的情况下,页面头的记录前面才用 XLogContRecord 结构,表示该记录不是一个新记录,而是上一个记录的一部分。 XLogRecord 结构代表一个新的 XLOG/REDOLOG 记录,其后跟着实际的 XLOG 数据, XLogRecord 结构定义如下:
typedef struct XLogRecord
{
pg_crc32 xl_crc ; /* 该记录的 CRC */
XLogRecPtr xl_prev ; /* xlog 里前一个 XLogRecord 的指针 */
TransactionId xl_xid ; /* 该记录事务 ID */
uint32 xl_tot_len ; /* 整个记录长度 */
uint32 xl_len ; /* XLOG 资源管理器数据长度 */
uint8 xl_info ; /* 标志位 */
RmgrId xl_rmid ; /* 本记录的资源管理器 ID */
} XLogRecord ;
XLOG 资源管理器时,其成员 xl_info 值可以是:
#define XLOG_CHECKPOINT_SHUTDOWN 0x00
#define XLOG_CHECKPOINT_ONLINE 0x10
#define XLOG_NOOP 0x20
#define XLOG_NEXTOID 0x30
#define XLOG_SWITCH 0x40
#define XLOG_BACKUP_END 0x50
#define XLOG_PARAMETER_CHANGE 0x60
#define XLOG_RESTORE_POINT 0x70
XACT 资源管理器时,其成员 xl_info 高 4 位储存如下信息:
#define XLOG_XACT_COMMIT 0x00
#define XLOG_XACT_PREPARE 0x10
#define XLOG_XACT_ABORT 0x20
#define XLOG_XACT_COMMIT_PREPARED 0x30
#define XLOG_XACT_ABORT_PREPARED 0x40
#define XLOG_XACT_ASSIGNMENT 0x50
XLOG 仅使用 xl_info 的低 4 位,高 4 为由资源管理器 rmgr 使用
#define XLR_INFO_MASK 0x0F
如果用 XLOG 记录备份任一磁盘块(数据文件块吧),用其成员 xl_info 标志位记录,支持每个 XLOG 记录 3 个磁盘块的备份,使用 xl_info 标志的低 1 、 2 、 3 位
#define XLR_BKP_BLOCK_1 XLR_SET_BKP_BLOCK(0) /* 0x08 */
#define XLR_BKP_BLOCK_2 XLR_SET_BKP_BLOCK(1) /* 0x04 */
#define XLR_BKP_BLOCK_3 XLR_SET_BKP_BLOCK(2) /* 0x02 */
如果已备份块能从 XLOG 的压缩版本中被安全删除,设置 Xl_info 的 0 位(这就是,备份它们仅是为了防止写部分页( partial-page-write )问题,并且不保证 PITR 恢复的一致性)。压缩算法将需要从这些块中解析出数据以创建一个相同的非全页 XLOG 记录。
#define XLR_BKP_REMOVABLE 0x01
成员 xl_rmid 记录资源管理器 ID ,就是资源种类 ID ,资源管理器的资源种类包括如下 16 种(不包含最后一个 RM_MAX_ID ,这个只是记录最大资源种类数):
#define RM_XLOG_ID 0
#define RM_XACT_ID 1
#define RM_SMGR_ID 2
#define RM_CLOG_ID 3
#define RM_DBASE_ID 4
#define RM_TBLSPC_ID 5
#define RM_MULTIXACT_ID 6
#define RM_RELMAP_ID 7
#define RM_STANDBY_ID 8
#define RM_HEAP2_ID 9
#define RM_HEAP_ID 10
#define RM_BTREE_ID 11
#define RM_HASH_ID 12
#define RM_GIN_ID 13
#define RM_GIST_ID 14
#define RM_SEQ_ID 15
#define RM_MAX_ID RM_SEQ_ID
当页头记录是跨页记录的一部分时,在 XLogLongPageHeaderData 结构的后面跟着 XLogContRecord 结构。原则 是 XLogRecord 记录 头从不被分到多个页,如果页尾空间小于 SizeOfXLogRecord ,就弃之不用,直接使用下一个页面。如果在一个记录在一个页面没写完,在下一个页头的 XLogLongPageHeaderData 结构后面用 XLogContRecord 结构,此时 XLogLongPageHeaderData 结构的成员 xlp_info 的值是 XLP_FIRST_IS_CONTRECORD 。
typedef struct XLogContRecord
{
uint32 xl_rem_len ; /* 记录剩余数据总长度 */
} XLogContRecord ;
3
<rmgr-specific data> 可能是事务状态定义等,例如结构 xl_xact_commit 、 xl_xact_abort 等
typedef struct xl_xact_commit
{
TimestampTz xact_time ; /* 提交时间 */
uint32 xinfo ; /* 信息位 */
int nrels ; /* 关系文件数 */
int nsubxacts ; /* 子事务 XID 数 */
int nmsgs ; /* 共享失效信息数 */
Oid dbId ; /* 数据库 ID */
Oid tsId ; /* 数据库表空间 ID */
/* 提交时要 drop 的关系文件节点数组 */
RelFileNode xnodes [1]; /* 变长数组 */
/* 后面跟已提交子事务 ID 数组 */
/* 后面跟共享失效消息数组 */
} xl_xact_commit ;
typedef struct xl_xact_abort
{
TimestampTz xact_time ; /* 退出时间 */
int nrels ; /* 关系文件节点数 */
int nsubxacts ; /* 子事务 XID 数 */
/* 退出时要 drop 的关系文件节点数组 */
RelFileNode xnodes [1]; /* 变长数组 */
/* 后面跟以退出的子事务 XID 数组 */
} xl_xact_abort ;
4
<BkpBlock> 表示 BkpBlock 结构,是 跟在 XLOG 记录 XLogRecord 后面的备份块头信息。 XLOG 代码知道 PG 数据页面中间常常包含一个无用的“洞”(“ hole ”——未使用的空间),其只包含值是 0 的字节。如果这个洞的长度大于 0 ( hole_length > 0 ),实际的跟在结构 BkpBlock 后面的块数据量是 BLCKSZ - hole_length 个字节
typedef struct BkpBlock
{
RelFileNode node ; /* 包含该块的关系文件 */
ForkNumber fork ; /* 关系分支 */
BlockNumber block ; /* 块数 */
uint16 hole_offset ; /* "hole" 前字节数 */
uint16 hole_length ; /* "hole" 的字节数 */
/* 实际的块数据跟在结构后面 */
} BkpBlock ;
5
<XLogRecData> 表示 XLogRecData 结构。要写入 XLOG 日志文件的资源管理器数据, 由一或多个 XLogRecData 结构定义。
typedef struct XLogRecData
{
char * data ; /* 资源管理器包含数据的开始 */
uint32 len ; /* 资源管理器包含数据的长度 */
Buffer buffer ; /* 有相应数据的 buffer ,如果有的话 */
bool buffer_std ; /* buffer 是否有标准 pd_lower/pd_upper 头 */
struct XLogRecData * next ; /* 链里的下一个结构 */
} XLogRecData ;
pd_lower 页面开始位置与未分配空间开头的字节偏移, pd_upper 与未分配空间结尾的字节偏移, LSN: 最后修改这个页面的 xlog 记录最后一个字节后面第一个字节。
XLogRecData 结构里记录各种数据库操作数据,其中典型的,数据是一个检查点( CheckPoint struct )。根据 XLogRecord 的成员 xl_rmid 是否等于 RM_XLOG_ID 以及的成员 xl_info 是否等于 XLOG_CHECKPOINT_SHUTDOWN 或 XLOG_CHECKPOINT_ONLINE 来判定数据是检查点。检查点的定义见下面。
typedef struct CheckPoint
{
XLogRecPtr redo ; /* 开始创建一个检查点时下一个 XLOG 记录的位置 */
TimeLineID ThisTimeLineID ; /* 当前时间线 */
uint32 nextXidEpoch ; /* 下一个事务 ID 的高排序位 */
TransactionId nextXid ; /* 下一个空闲事务 ID */
Oid nextOid ; /* 下一个空闲 OID */
MultiXactId nextMulti ; /* 下一个空闲多事务 ID */
MultiXactOffset nextMultiOffset ; /* next free MultiXact offset */
TransactionId oldestXid ; /* cluster-wide minimum datfrozenxid */
Oid oldestXidDB ; /* database with minimum datfrozenxid */
pg_time_t time ; /* 检查点时间戳 */
/*
仍在运行的最早的事务 ID ( XID )。只有在从一个在线检查点初始化热备模式时才需要,以使在 GUC 参数 wal_level 是 hot_standby 时我们不用为在线检查点计算运行最早的 XID 。否则设置为常量 InvalidTransactionId 。
*/
TransactionId oldestActiveXid ;
} CheckPoint ;
------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2074题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1851话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1753话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1440话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1410Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1765话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1558话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1900在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1810话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1643话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1873话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1327话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1266话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15843 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5717到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13873 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1628话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14403 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1658话说 main()->Postm ...
相关推荐
在PostgreSQL中,WAL文件的具体实现可以由一些关键结构来描述,例如: - WAL(Write-Ahead Log):这是事务日志文件的上下文,确保了事务日志条目在描述的数据页变更之前必须达到稳定的存储介质。 - Xlog(事务日志...
在PostgreSQL数据库系统中,日志管理是核心功能之一,它确保了数据库的稳定性和可靠性。本文将深入探讨PostgreSQL的日志体系,包括XLOG(事务日志)、CLOG(事务提交日志)和SUBTRANS(子事务日志)。 1. **XLOG...
- **日志缓冲区(Redo log Buffer)**:用于短期存储重做日志(redo log)。 - **共享池(Shared Pool)**:用于缓存所有频繁执行的代码和频繁访问的对象定义。共享池内有下列几种数据结构: - 库缓冲(library cache):...
7. 日志系统:包括redo log(重做日志)和binlog(二进制日志)。InnoDB的redo log用于恢复未提交的事务,binlog则用于主从复制。 8. 索引:MySQL支持B-Tree、Hash、R-Tree等多种索引类型,索引的创建、查询和维护...
- **日志缓冲区(Redo Log Buffer)**:暂时存储重做日志(redo log),以便在系统故障后可以恢复数据。 - **共享池(Shared Pool)**:缓存最近执行的SQL语句及其解析结果等。 - **库缓冲(Library Cache)**:...
5. **日志系统**:InnoDB存储引擎有redo log(重做日志)和undo log(回滚日志),用于事务的持久性和回滚。另外,还有binlog(二进制日志),用于复制和备份。 6. **查询优化**:MySQL的查询优化器(Optimizer)会...
其独特的“日志即数据库”设计,将Redo LOG下沉到存储层,通过分布式存储系统自动管理数据的多副本,实现了自动扩缩容、故障检测和修复,有效降低了网络IO,提升了系统效率。此外,CynosDB的架构充分利用了腾讯云的...
1. **从逻辑复制到物理复制**:利用InnoDB redo日志进行复制,共享datafile、redo log和undo log,确保只读节点数据一致性。 2. **读写分离与负载均衡**:通过智能代理实现透明的读写分离,根据Applied LSN删除内存...
Oracle数据库由多个组件组成,如数据库实例(Instance)、数据库文件(Data Files)、控制文件(Control Files)、重做日志文件(Redo Log Files)等。实例是运行在操作系统上的内存结构,用于处理对数据库的请求,...
它以低级别日志或redo log的形式跟踪这些变化。 2. **Replicat**:在目标数据库上运行,接收并应用由Extract生成的数据变更。它将源数据库上的变更同步到目标数据库,确保数据的一致性。 3. **Trail Files**:存储...
18. OceanBase的存储结构是基于LSM-Tree(Log-Structured Merge Tree),这种结构特别适合写入密集型的工作负载。 19. OceanBase通过COLA(Column-Oriented Local Area)架构实现写入高性能,结合LSM-Tree优化了...
2. **数据复制技术**:Golden Gate采用日志解析技术,直接读取数据库的日志文件(redo log files),提取其中的数据变化,然后将这些变化复制到目标数据库。这种基于日志的复制方式确保了数据的一致性和完整性。 3....
Flink CDC通过监听数据库的binlog或redo log,实时捕获并传输数据库的插入、更新和删除操作,实现高效且无损的数据迁移。 Flink SQL是Flink提供的SQL接口,使得非程序员也能方便地编写流处理任务。它支持标准的SQL...
传统的数据库系统如Oracle、DB2、SQL Server、MySQL和PostgreSQL提供了稳定且成熟的关系型数据库解决方案,适合处理结构化数据。而分布式数据库如Google Spanner、BigTable、MegaStore以及OceanBase、Hbase则适用于...
值得注意的是,除了MySQL,其他数据库也有类似的机制,例如Oracle的Redo Log、PostgreSQL的Logical Replication等,可以根据实际需求选择合适的技术栈。 总结来说,基于Java实现增量数据的收集,主要是通过Spring ...
- **ACID属性** 的实现包括使用MVCC机制实现隔离性、通过redo log实现持久性等。 3. **什么是数据库的正规化(Normalization)以及它的优缺点是什么?** - **优点** 包括减少数据冗余、简化数据维护等。 - **...
Oracle的归档日志模式配合redo log,确保了完整的事务恢复能力。 六、性能优化 Oracle的SQL优化器分析查询执行计划,选择最优路径。通过索引、分区、物化视图等手段可以提升查询性能。另外,通过AWR和ASH报告,DBA...