自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(683)
  • 收藏
  • 关注

原创 PostgreSQL 逻辑复制搭建测试

查看订阅端replay进度 pg_replication_origin_status。local_lsn:本地已持久化(写入事务日志文件)的lsn。查看订阅端状态 pg_stat_subscription。其中最主要的是订阅端接收的lsn信息。已复制到订阅端的发布端 lsn。注意整句基本都是要改的。

2023-01-26 22:31:54 1632 1

翻译 postgresql 14新特性整理

如果设置了compute_query_id参数,将在pg_stat_activity, EXPLAIN VERBOSE, csvlog, log_line_prefix中展示查询id。新增idle_session_timeout参数关闭空闲连接,跟idle_in_transaction_session_timeout的区别是会话不需要开启事务,只判断空闲超时。和 pg_write_all_data,授予 所有 tables, views, sequences的读、写权限。新增了OR REPLACE 选项。

2023-01-24 21:58:52 1761 1

原创 postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数

lazy vacuum之table_relation_vacuum函数与heap_vacuum_rel函数

2023-01-23 21:54:17 803

原创 postgresql源码学习(52)—— vacuum①-准备工作与主要流程

关于vacuum的基础知识,参考,本篇从源码层继续学习vacuum相关操作在vacuum.c中,当手动执行vacuum及analyze命令,其主入口为ExecVacuum()函数——主要负责为真正执行操作的vacuum()函数做一系列准备工作(语句解析、选项设置与检查、测试设置等),核心是调用vacuum()函数。

2023-01-22 17:26:47 1556

原创 postgresql FDW概念、用法与原理小结

FDW (foreign-data wrapper,外部数据包装器),可以让我们在PG中使用SQL查询极为丰富的外部数据

2023-01-19 19:09:58 1660

原创 postgresql_internals-14 学习笔记(五)Buffer Cache

调和内存(ns级)与磁盘(ms级)间的速度差异。pg不仅用自己的,也用os cache,所以它使用了“双缓存”,这也是很多文档推荐shared_buffer参数只设为内存25%(通常不超过16G)的原因。

2023-01-01 12:23:08 966

原创 将postgresql配置为Linux服务管理 systemctl service

发行版安装的数据库在装完后会自动添加数据库服务,但编译安装的不会,需要手动添加。如果后面修改了postgresql文件,需要reload。加执行权限 chmod +x postgresql。通过下面的命令添加到服务中。相应的,可通过下述命令删除。PGCE课程《服务管理》

2022-12-17 23:02:13 198

原创 postgresql_internals-14 学习笔记(四)TOAST 超尺寸字段存储技术

pg中的每个行只能存在一个page里,不能跨page存储。因此对于一些非常长的行,就需要使用到TOAST(The OverSized Attribute Storage Technique,超尺寸字段存储技术)将大字段值压缩或者拆分为多行到单独表存储。对于用户来说,这是完全透明的。

2022-12-17 21:05:04 625

原创 postgresql_internals-14 学习笔记(三)冻结、rebuild

autovacuum_freeze_max_age参数值也会影响CLOG,因为没有必要记录已冻结事务的状态,小于datfrozenxid的事务对应的CLOG将会被autovacuum删除。(0,2) xmin_age=2,被冻结;忽略autovacuum_vacuum_cost_delay 和vacuum_cost_delay参数,跳过索引vacuum,以最快速度完成冻结操作。如上面实验,vacuum_freeze_min_age会考虑vm文件,如果这些页一直可见,其中元组事务id就一直不会被冻结。

2022-12-13 23:42:04 365

原创 postgresql_internals-14 学习笔记(二)常规vacuum

page pruning执行速度很快,但它们的作用范围毕竟只有单页、且不包含索引,因此,我们还需要更有效的清理机制。常规vacuum是最常用的一种,作用范围可以是整张表,清理过期元组及索引项,并且不阻塞读和写。为提高效率,vacuum会结合前面提到的.vm文件,跳过不需清理的页。清理之后,还会更新前面提到的fsm(空闲空间映射)文件。另外还可以用vacuum analyze顺便收集统计信息。

2022-12-11 22:02:20 706

原创 postgresql_internals-14 学习笔记(一)

梳理一下之前理解不太清楚的知识点,重点内容可能会再拆出来单独研究。原书链接:Index of /命名空间,在逻辑上相当于DB中的一个目录。pg自带以下schema: search_path变量用于设置搜索路径,pg_catalog和pg_temp 这两个schema总是包含在其中(因此所有库中都能查到系统表和临时表),但默认不显示。未完待续...

2022-12-05 18:47:24 739

原创 postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数

提交日志CLOG 原理 用途 管理函数

2022-11-30 15:11:19 423

原创 postgresql源码学习(50)—— 小白学习Dtrace追踪源码函数调用

业务任意执行的一条语句、出现了某些怪异的现象,如何能知道它究竟调用了pg中的哪些函数?而哪些函数是不符合我们预期的?Dtrace就能解决这个问题。

2022-11-26 16:39:25 683 2

原创 postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断

cmin与cmax 同事务内的可见性判断

2022-11-20 23:02:23 287

原创 ansible DBA常用场景命令小集

这个小工具真的好用,运维方便了很多。随着慢慢用的变多,整个单独的文档记录一些平时需要批量处理的小场景和命令。因为场景通常比较简单,基本都是用的 Linux命令和shell脚本,也没什么学习成本。理论上只要能写好shell脚本、传到目标库、执行,足够干n多事情了。

2022-11-13 12:41:08 477

原创 大结果集SQL引发的ClickHouse空闲超时

业务反馈查询遇到java报错,并且反复尝试都在同一个语句遇到相同报错检查当时DB负载很低,尝试手动该查询不报错,但数据量很大,将近3000万行。由于影响到生产业务,联系阿里云后台共同排查。

2022-11-12 16:53:34 742

原创 Oracle RMAN 口令加密测试

业务希望对一些不由DBA运维的数据库配置备份设置加密,密码仅由业务同事保存,必须输入密码才能进行数据恢复。考虑业务同事需要保存密码,而基于wallet的加密配置较复杂、DBA又难以接触到相关服务器,。设置方法口令务必要记得,否则后续无法会恢复数据。

2022-11-08 15:46:38 476

原创 postgresql源码学习(48)—— 流复制冲突(备库锁阻塞与Vacuum冲突)

当hot_standby参数设置为on时,备库可以支持读操作。但有时你会发现,查询执行着突然遇到 terminating connection due to conflict with recovery 报错,这就是所谓的流复制冲突。

2022-10-23 22:08:18 550

原创 postgresql源码学习(十九)—— MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数

回顾一下前面提到的SNAPSHOT_MVCC类型快照的可见性判断条件:

2022-10-16 11:08:06 599 3

原创 postgresql源码学习(47)—— PostmasterMain(4) 启动数据库与主循环

以下代码也在postmaster.c文件中,可以看到这个函数其实就是启动了StartupProcess进程。|->BackendStartup() ConnFree() ConnCreate()

2022-10-08 21:44:40 627

原创 postgresql源码学习(46)—— PostmasterMain(3) 监听套接字与客户端认证

调用load_hba()函数和load_ident()函数读取客户端认证文件pg_hba.conf和pg_ident.conf。

2022-10-05 21:22:52 454

原创 postgresql源码学习(45)—— PostmasterMain(2) GUC参数简介及设置

对于解析到的每个参数及其参数值,调用SetConfigOption函数完成参数修改。GUC(Grand Unified Configuration)参数,其实指的就是pg中的各类参数。铺垫了这么多,终于又回到PostmasterMain函数上,我们接着上次的代码继续往下看。解析postmaster命令行参数,并用于设置GUC参数值。每种类型的GUC参数都有两部分组成:共性部分+特性部分。,如果一切合法,则将当前目录转入数据目录。,相同参数优先级更高的来源值会生效。数据库内核分析》第二章。

2022-10-03 21:48:23 894

原创 postgresql源码学习(44)—— PostmasterMain(1) —— 内存初始化与信号处理函数设置

信号是os响应某些状况而产生的事件,它可以明确由一个进程发给另一个进程,用这种方法传递信息或协调操作。进程可以自定义信号处理函数来处理信号,pg就是充分利用了这一点。

2022-10-02 23:58:28 741

原创 clickhouse 中 ReplicasMaxAbsoluteDelay 的计算

主要是调用该函数,并给absolute_delay和relative_delay变量赋值,这里我们只看absolute_delay。可以看到ReplicasMaxAbsoluteDelay的时间,随着告警发送的日期在增长,但是始终是52年左右。因此大致可以猜测这个值是currenttime减去unix起始时间的秒数,表示一个无穷大而不是真正的延迟。然后是主要的,执行getAbsoluteDelay函数,获取延迟值。52年前刚好是1970年,即unix的起始时间附近。

2022-09-30 18:44:34 594

翻译 clickhouse系统表 官方文档翻译

系统表提供以下信息:系统日志表可以通过/etc/clickhouse-server/config.xml文件配置,或者在/etc/clickhouse-server/config.d/目录下创建一个与表同名的配置文件可以配置信息如下:一个例子:asynchronous_metrics:包含在后台定期计算的指标columns:表中的列信息detached_parts:MergeTree引擎表分离part的信息,reson字段指定detach的原因dictionaries:保存外部字典(External

2022-09-28 18:32:17 425

原创 postgresql源码学习(43)—— main函数主要流程

main函数的主要作用是确定当前操作系统平台,根据平台做一些环境变量和内存初始化,然后通过对postgres命令的参数解析,调用对应函数,进入对应流程。跟大多数程序一样,pg的入口函数也是main.c文件中的main函数。其中最核心的就是PostmasterMain程序,我们后面再看。《PostgreSQL数据库内核分析》第二章。

2022-09-21 00:23:29 433

原创 postgresql源码学习(十五)—— 行锁③-死锁检测

假设等待图中有环,且环全部由实边构成,那么此时只能中断某个事务来打破这个环,这就是死锁。若环还有虚边,说明有事务尚未真正持有锁,此时还可以通过调整事务顺序来避免死锁。假设事务A持有表的共享锁,事务B申请表的排他锁被阻塞,事务C又想申请该表共享锁。此时事务C需要等待事务B,于是BC都在等待队列中,pg称这种等待的边为“虚边”。在查找环的过程中,它会优先从waitOrders数组中选择等待队列,如果没有,才会使用锁本身的等待队列。假设事务A持有表的共享锁或排它锁,当事务B申请表的排他锁时,就要进入等待。

2022-09-18 00:40:28 599

原创 postgresql源码学习(十四)—— 行锁②-update操作与行锁

本篇以最简单的update操作为例,来看更新过程中的行锁添加、冲突检测、元组状态判断、可见性判断等。heapam_visibility.c 文件中)根据不同的元组状态,决定继续执行何种操作。例如元组是否能被更新取决于是否可见,不可见的元组显然是无需更新的。元组对当前快照根本不可见,自然无法处理。技术内幕:事务处理深度探索》第2章。元组被已提交事务更新过。元组被已提交事务删除过。函数内容如下(有删减)

2022-09-17 17:32:57 789

原创 PostgreSQL回滚TRUNCATE操作的原理

下午大家在讨论pg可以回滚truncate操作,好奇原理是怎么样的,搜到的大部分文章只提到了“事务DDL”的概念,没有详细介绍。后来找到了这篇文章,翻译时有删改,原文参考一、 回滚原理与 Oracle 和 MySQL 等 RDB 不同,PostgreSQL 采用追记型架构(追記型アーキテクチャ)。简单来说,当更新行数据时,不会更新原始数据,而是将原始数据标记为已删除,并插入更新的数据。即使10列中只有1列要更新,也会插入10列数据。虽然可能会带来更新的性能问题,但它也更容易实现读一致性。.........

2022-08-31 22:31:53 1309

原创 postgresql 格式化查询树为图片 —— pgNodeGraph 与 pg_node2graph

postgresql 中提供了一些debug参数,将SQL的查询树和执行计划树打印在错误日志中,并提供了简单的格式化(缩进),但实际上依旧是非常难分析的。其中 pg_node2graph 是执行脚本,nodes目录存放待分析文件,images存放格式化后的图片。pg_node2graph工具是在pgNodeGraph的基础上做了些加强,这里我们以它进行测试。github中的文档没有写,但是如果不按以下处理执行时会报错。我们看一个例子,查询树的默认输出是什么样的。已经很复杂,肉眼难以直接分析。......

2022-08-28 23:28:13 838 1

原创 postgresql源码学习(42)—— 崩溃恢复④ - 日志应用

确定日志来源之后,就可以开始应用WAL日志。在Rmgr中,每种类型的WAL日志都有startup,redo,cleanup等函数,其中最重要的就是redo函数。以最常见的insert为例,假如每个事务执行了插入并提交,此时数据还在buffer没有落盘,恰逢数据库宕机。在db下次启动时,就会读取到XLOG_HEAP_INSERT类型的WAL记录(对应Rmgr类型为RM_HEAP_ID),因此会进入heap_redo函数(在heapam.c文件)。

2022-08-24 00:00:47 689

原创 postgresql源码学习(41)—— 崩溃恢复③ - 日志来源

pg会根据当前状态确定初始日志源,当日志源读取发生错误,或者状态发生改变时,会切换到其他日志源。这个功能对应函数是 WaitForWALToBecomeAvailable(在xlog.c文件)前篇中获取到了恢复起点,即开始回放日志的位置,后面我们就可以开始读取并应用日志了。不过在此之前还有一个问题,从哪里获取WAL日志呢?用于在不同时段,从不同的日志源获取WAL日志。,对于不同的用途,也有不同的日志来源。技术内幕:事务处理深度探索》第4章。崩溃恢复、从库日志应用、)表示待应用日志的来源,

2022-08-23 23:41:41 695

原创 postgresql源码学习(40)—— 崩溃恢复② - 恢复起点

从if (InRecovery) 部分开始,真正开始日志应用。首先会更新控制文件,说明当前进入了Recovery模式,并将读到的检查点信息也保存到控制文件。如果有backup_label文件,但又无法获取到检查点或者redo点信息,数据库启动会报错。通常,崩溃恢复的起点是最近一次检查点,这个位置保存在控制文件中。在之前创建检查点的函数中我们也看到,每次检查点创建时都会刷新控制文件中的信息。文件,如果该文件存在,则优先从该文件获取检查点信息,作为故障恢复起点。技术内幕:事务处理深度探索》第。

2022-08-20 00:21:46 372

原创 postgresql源码学习(39)—— 崩溃恢复① - Startup进程的三大作用

如果数据库宕机或者服务器故障,缓存中的脏页可能尚未被刷入磁盘,磁盘中的数据处于不一致状态。在数据库重新启动时,需要借助WAL日志将数据库恢复到一致的状态。崩溃恢复的核心进程是Startup进程,核心函数是StartupXLOG函数,它在pg启动时就会被调用,读取配置信息,应用WAL日志。下一篇,我们正式学习StartupXLOG函数,看不同场景下如何进行日志应用。《PostgreSQL技术内幕:事务处理深度探索》第4章。大功能——崩溃恢复、从库日志应用、(基于时间点的恢复)。日志应用都是分不开的。...

2022-08-14 12:18:17 923

原创 postgresql源码学习(38)—— 备份还原② - do_pg_stop_backup函数

在执行pg_start_backup函数开启备份模式后,务必要执行pg_stop_backup函数结束备份 (详细参考下方源码)。确保如果PG_ENSURE_ERROR_CLEANUP中的代码运行失败,则将排他备份状态改回运行中。在源码中,pg_stop_backup实际对应的是do_pg_stop_backup函数。三、 pg_stop_backup_callback。二、 do_pg_stop_backup。技术内幕:事务处理深度探索》第。......

2022-08-13 16:29:00 906

原创 postgresql源码学习(37)—— 备份还原① - do_pg_start_backup函数

关于pg备份的基础知识,参考 https://blog.csdn.net/Hehuyi_In/article/details/102641959pg的备份本质是是通过直接复制磁盘数据实现的,在全页写机制的文章中我们提到过,这可能会导致数据不一致。因此,在复制数据前必须做一些准备工作。pg_start_backup函数进行创建基础备份的准备工作(详细参考下方源码)。注意这里指的是pg中pg_start_backup函数的参数,而不是源码中的函数参数。非排他备份。......

2022-08-13 16:19:53 865

原创 postgresql源码学习(36)—— 事务日志11 - 日志归档

上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......

2022-08-09 23:26:03 1343

原创 postgresql源码学习(35)—— 检查点⑤-检查点中的XLog清理机制

前篇我们提到,检查点的工作之一是删除无用的日志文件,本篇我们来看看其中具体的计算和删除函数。前文中相关代码如下(在6. 删除无用的日志文件):postgresql源码学习(32)—— 检查点④-核心函数CreateCheckPoint_Hehuyi_In的博客-CSDN博客主要函数和宏定义如下 估算两次checkpoint之间产生的xlog量,主要用于后面XLOGfileslop函数的日志预分配。 如果上次估算量比这次实际产生的要小,则将估算值更新为这次产生的量。否则,按照

2022-08-07 12:30:47 904 2

原创 记录一些 PostgreSQL问题分析思路

原文来自微信公众号文章本文主要学习记录一些其中的问题分析思路和方法。

2022-08-06 16:06:49 1004

原创 postgresql源码学习(34)—— 事务日志⑩ - 全页写机制

前几天看了阿里云关于全页写的直播,打算重新再整理下关于全页写的内容。

2022-07-30 18:01:53 1000

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除