自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux 内存回收,思维导图记录

最近天天跟内存斗智斗勇,整理下学习的记录。

2023-04-09 12:03:25 2680 1

原创 PostgreSQL定位函数中最耗时的SQL(2)—— plProfiler插件图形化展示耗时语句

plProfiler插件使用C和python语言共同开发,可以收集PL/pgSQL语言(不支持SQL语言)的函数和存储过程的profile信息,并生成html报表。报表以火焰图形式展示函数调用堆栈、耗时占比,还可以查看函数中每个SQL的位置、执行次数、最长执行时间、总时间,清晰明了。由于依赖于python环境,安装、排错较复杂,对python小白不友好。同时,它也并非旁路监控,必须要手动执行对应函数。

2023-04-05 23:57:51 2271 1

原创 从无法创建的索引看 PostgreSQL的create index concurrently(CIC)过程

CREATE INDEX CONCURRENTLY (CIC)大概是DBA们最常用的语句之一,创建索引时只加4级锁,不阻塞DML。听上去非常美好,但在大事务、长事务较多的系统,可能被阻塞得一个中午也建不上一个索引。本篇就从这个无法创建的索引开始,学习CIC的过程、原理以及注意事项。

2023-04-04 22:53:31 3213

原创 PostgreSQL定位函数中最耗时的SQL

开发反馈pg中某函数执行时间很长,超过30分钟,想看看慢在其中哪一段SQL。但是如果直接通过pg_stat_activity查询,只能看到上层执行函数的语句,而不像oracle和SqlServer能看到当前在执行什么。咨询群友们得到了几种方法,下面测试和对比一下。执行函数查看运行情况。

2023-03-12 22:49:35 2879 1

原创 一图搞懂 PG流复制的各种LAG

关于write_lag,flush_lag,replay_lag 以及 send_lsn,write_lsn,flush_lsn,replay_lsn

2023-02-15 00:24:38 2455

原创 PostgreSQL 通过 tds_fdw 访问 SQL Server数据,常见报错分析及处理

PostgreSQL 通过 tds_fdw 访问 SQL Server数据,常见报错分析及处理

2023-02-07 17:08:08 4802 2

原创 《PostgreSQL面试题集锦》学习与回答

《PostgreSQL面试题集锦》学习与回答

2023-02-04 21:28:53 8879 1

原创 postgresql源码学习(54)—— HotStandby从库必须设置大于等于主库的参数

HotStandby从库必须设置大于等于主库的参数

2023-01-28 11:38:44 1882 2

原创 PostgreSQL 逻辑复制搭建测试

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

2023-01-26 22:31:54 3517 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 4072 1

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

lazy vacuum之table_relation_vacuum函数与heap_vacuum_rel函数

2023-01-23 21:54:17 1748

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

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

2023-01-22 17:26:47 2637

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

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

2023-01-19 19:09:58 10260

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

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

2023-01-01 12:23:08 2242

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

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

2022-12-17 23:02:13 1988 1

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

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

2022-12-17 21:05:04 2114

原创 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 2408 1

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

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

2022-12-11 22:02:20 2983

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

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

2022-12-05 18:47:24 2035

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

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

2022-11-30 15:11:19 1681

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

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

2022-11-26 16:39:25 1963 3

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

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

2022-11-20 23:02:23 1380

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

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

2022-11-13 12:41:08 921

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

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

2022-11-12 16:53:34 4029

原创 Oracle RMAN 口令加密测试

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

2022-11-08 15:46:38 1357

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

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

2022-10-23 22:08:18 2505

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

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

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

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

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

2022-10-08 21:44:40 1546

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

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

2022-10-05 21:22:52 1227

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

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

2022-10-03 21:48:23 2992

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

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

2022-10-02 23:58:28 1994

原创 clickhouse 中 ReplicasMaxAbsoluteDelay 的计算

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

2022-09-30 18:44:34 1258

翻译 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 1489

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

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

2022-09-21 00:23:29 1290

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

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

2022-09-18 00:40:28 1407

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

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

2022-09-17 17:32:57 2167

原创 PostgreSQL回滚TRUNCATE操作的原理

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

2022-08-31 22:31:53 5194 2

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

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

2022-08-28 23:28:13 2005 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 1472

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

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

2022-08-23 23:41:41 1639

空空如也

空空如也

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

TA关注的人

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