<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Postgresql on 张同的博客</title><link>https://www.zhangblogs.cn/categories/postgresql/</link><description>Recent content in Postgresql on 张同的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 14 Jan 2026 23:07:00 +0800</lastBuildDate><atom:link href="https://www.zhangblogs.cn/categories/postgresql/index.xml" rel="self" type="application/rss+xml"/><item><title>蓝象十日谈·第三日_3.1数据库系统的关系代数</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-san-ri_3.1shu-ju-ku-xi-tong-de-guan-xi-dai-shu.md/</link><pubDate>Wed, 14 Jan 2026 23:07:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-san-ri_3.1shu-ju-ku-xi-tong-de-guan-xi-dai-shu.md/</guid><description>&lt;h1 id="数据库系统的关系代数"&gt;&lt;strong&gt;数据库系统的关系代数&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;关系代数的全部对象与运算，本质上都可以理解为：&lt;strong&gt;对元组集合做集合运算&lt;/strong&gt;。因此理解关系代数前需要先理解集合论。&lt;/p&gt;
&lt;h2 id="集合论"&gt;&lt;strong&gt;集合论&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="集合的概念和描述"&gt;&lt;strong&gt;集合的概念和描述&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;集合&lt;code&gt;set&lt;/code&gt;是一些对象的汇集，可以表示如下：&lt;/p&gt;
&lt;div content="A = \{a,b,c\}" math-display=""&gt;
&lt;p&gt;A = \a,b,c\&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;某个元素是否属于集合，用 &lt;span content="\in" math-inline=""&gt;\in&lt;/span&gt;或 &lt;span content="\notin" math-inline=""&gt;\notin&lt;/span&gt;( &lt;code&gt;in / notin&lt;/code&gt;)表示:&lt;/p&gt;</description></item><item><title>蓝象十日谈·第二日_2.5Postgresql的查询执行架构</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.5postgresqlde-cha-xun-zhi-xing-jia-gou/</link><pubDate>Sun, 28 Dec 2025 20:19:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.5postgresqlde-cha-xun-zhi-xing-jia-gou/</guid><description>&lt;h1 id="sql语句的生命周期"&gt;&lt;strong&gt;SQL语句的生命周期&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;前面的内存架构，物理架构，进程架构偏向静态系统架构，有哪些部件，长什么样子，谁负责干什么。&lt;/p&gt;
&lt;p&gt;现在可以通过描述一条SQL语句的生命周期将上面的各部分串起来，是一个偏动态的查询架构。一个SQL语句可以分为以下五部分：&lt;code&gt;Parser → Analyzer → Rewriter → Planner → Executor&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="从客户端报文到-exec_simple_query"&gt;&lt;strong&gt;从客户端报文到&lt;/strong&gt; &lt;code&gt;exec_simple_query&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;这是语句生命的起始，客户端发送一条 Simple Query（文本协议）时，大致流程是：&lt;/p&gt;</description></item><item><title>蓝象十日谈·第二日_2.4Postgresql的物理架构</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.4postgresqlde-wu-li-jia-gou.md/</link><pubDate>Tue, 16 Dec 2025 23:33:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.4postgresqlde-wu-li-jia-gou.md/</guid><description>&lt;h1 id="pg的存储和文件系统"&gt;&lt;strong&gt;PG的存储和文件系统&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id="pg的目录结构"&gt;&lt;strong&gt;PG的目录结构&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;PG的目录结构这里分为两类，一类是源代码目录结构，就是&lt;code&gt;git clone&lt;/code&gt; 下来的那棵树。还有一类就是数据目录结构（&lt;code&gt;PGDATA&lt;/code&gt;）,就是在初始化实例的时候生成的。&lt;/p&gt;
&lt;h3 id="源代码目录结构"&gt;&lt;strong&gt;源代码目录结构&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;官方仓库 &lt;code&gt;postgres/&lt;/code&gt;,其顶层大致如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postgres/
 configure      # 配置脚本
 src/           # 所有代码的主战场
 doc/           # 文档
 contrib/       # 扩展、示例模块
 config/        # 各种模板配置
 ...
​
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方使用&lt;a href="https://www.doxygen.nl/"&gt;doxygen&lt;/a&gt; 工具把 &lt;code&gt;src/&lt;/code&gt; 列成了一个目录树。核心子目录包括：&lt;code&gt;backend/、bin/、common/、fe_utils/、include/、interfaces/、pl/、port/、test/、tools/、timezone/、tutorial/&lt;/code&gt; 等。&lt;/p&gt;</description></item><item><title>蓝象十日谈·第二日_2.3Postgresql的内存架构</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.3postgresqlde-nei-cun-jia-gou/</link><pubDate>Tue, 16 Dec 2025 21:15:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.3postgresqlde-nei-cun-jia-gou/</guid><description>&lt;h1 id="postgresql的内存架构"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;Postgresql的内存架构&lt;/strong&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;内存作为磁盘和CPU之间的中间层，是系统性能的重要部分，了解PG的内存架构，有助于数据库的性能分析。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;一个PG实例的内存主要分为两大部分，共享内存及每个后端进程的专有内存。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;img src="https://www.zhangblogs.cn/upload/image-fjrs.png" style="display: inline-block;width:100.0%;height:100.0%" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="后端进程的内存"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;后端进程的内存&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;需要注意的是，上面图中的 &lt;/span&gt;&lt;code&gt;temp_buffers&lt;/code&gt;&lt;span fontsize="" color=""&gt;,&lt;/span&gt;&lt;code&gt;work_mem&lt;/code&gt;&lt;span fontsize="" color=""&gt;,&lt;/span&gt;&lt;code&gt;maintaince_work_mem&lt;/code&gt;&lt;span fontsize="" color=""&gt;,这些都是参数（GUNS）,是每个后端进程中都有可能使用到的按照任务类型进行分类的内存使用种类，它们之间并没有物理隔离。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在操作系统看来，一个 backend 本质就是一个 Linux 进程，典型内存布局大概是：&lt;/span&gt;&lt;/p&gt;
&lt;img src="https://www.zhangblogs.cn/upload/image-razt.png" style="display: inline-block;width:100.0%;height:100.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;上面几个内存概念都是&lt;strong&gt;同一个 backend 进程的虚拟地址空间里的不同区域&lt;/strong&gt;。在OS看来，后端进程的内存就是进程+映射进来的共享内存+其他内存种类。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;PG后端进程有自己的内存上下文结构，这意味着和其他程序可以随意&lt;/span&gt;&lt;code&gt;malloc/free&lt;/code&gt;&lt;span fontsize="" color=""&gt;不同，PG里的内存操作，就要按照PG的规则来，具体而言，PG提供了MemoryContext 层次结构，一棵树状的内存池。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;其核心的头文件有两个 &lt;/span&gt;&lt;a href="https://doxygen.postgresql.org/memutils_8h.html"&gt;&lt;span fontsize="" color=""&gt;memutils.h&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;和&lt;/span&gt;&lt;a href="https://doxygen.postgresql.org/palloc_8h.html"&gt;&lt;span fontsize="" color=""&gt;palloc.h&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;。而实现则主要在&lt;/span&gt;&lt;a href="https://doxygen.postgresql.org/mcxt_8c.html"&gt;&lt;span fontsize="" color=""&gt;mcxt.c&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;（MemoryContext 通用框架）和&lt;/span&gt;&lt;a href="https://doxygen.postgresql.org/aset_8c.html"&gt;&lt;span fontsize="" color=""&gt;aset.c&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;(申请内存)&lt;/span&gt;&lt;/p&gt;</description></item><item><title>蓝象十日谈·第二日_2.2Postgresql的进程架构</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.2postgresqlde-jin-cheng-jia-gou/</link><pubDate>Mon, 15 Dec 2025 20:02:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.2postgresqlde-jin-cheng-jia-gou/</guid><description>&lt;h1 id="postgresql进程架构"&gt;&lt;strong&gt;Postgresql进程架构&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;进程作为操作系统中的重要概念，包含了程序代码以及相关的运行环境。每个进程在操作系统中都是独立的，具有自己的地址空间，并可以运行。Postgresql采用多进程架构，进程之间相互隔离，提高了安全性和稳定性。下面逐一介绍各种进程。&lt;/p&gt;
&lt;h2 id="主进程postmaster"&gt;&lt;strong&gt;主进程（Postmaster）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Postgresql的主进程传统上被称作&lt;code&gt;Postmaster&lt;/code&gt;。就像这个形象的名称一样，作为PG的大boss，该进程是绝对不会干刷脏，复制这类蓝领工作的。postmaster主要负责以下工作:&lt;/p&gt;</description></item><item><title>蓝象十日谈·第二日_2.1Postgresql逻辑架构</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.1postgresqlluo-ji-jia-gou/</link><pubDate>Wed, 10 Dec 2025 06:40:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-er-ri_2.1postgresqlluo-ji-jia-gou/</guid><description>&lt;h2 id="posgresql逻辑架构"&gt;&lt;strong&gt;Posgresql逻辑架构&lt;/strong&gt;&lt;/h2&gt;
&lt;img src="https://www.zhangblogs.cn/upload/image-gxsn.png" style="display: inline-block;width:100.0%;height:100.0%" /&gt;
&lt;h3 id="database-cluster"&gt;&lt;strong&gt;database cluster&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;与oracle的多租户等不同，Postgresql允许你通过监听端口来区别数据库簇（database cluster）实例。一个数据库簇，或者叫数据库集群下面可以存放各种数据库（database）,数据库簇之间是物理隔离的，即base目录是严格区分的，而一个数据库簇下的各个数据库的物理文件则是按照编号存放在&lt;code&gt;$PGDATA/base&lt;/code&gt;目录下的，这个后面的物理架构会详细描述。数据库之间的逻辑是隔离的，也就是说，即使是在同一个数据库簇下，彼此是不能直接调用的，这点和MYSQL不太一样。&lt;/p&gt;</description></item><item><title>蓝象十日谈·第一日_1.3Postgresql客户端工具</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-yi-ri_1.3postgresqlke-hu-duan-gong-ju/</link><pubDate>Wed, 10 Dec 2025 06:37:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-yi-ri_1.3postgresqlke-hu-duan-gong-ju/</guid><description>&lt;h1 id="客户端"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;客户端&lt;/strong&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Postgresql的客户端工具有很多种，DataGrid，pgAdmin,Navicate等等。比起更人性化，返回结果更容易操作，编写sql有高亮有自动提示的这些工具，作为DBA的我，更推荐原生的psql。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;psql - 最好的客户端工具&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;psql采用的是双命令行工具设计（Dual-mode Command-line Interface）。&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;连接数据库：&lt;/span&gt;&lt;code&gt;psql -h localhost -p 5432 database_name&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;获得psql的帮助：\&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;获得语法的帮助：\h STATEMENT&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在shell中执行命令：psql -c &amp;ldquo;STATEMENT&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;通过psql执行sql文件：psql &amp;lt; f.sql&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="psql用法_"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;psql用法_转储&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;psql的轻便和易用往往超乎你的想象，比如你需要将某个节点上的表同步到其他节点上，如果用其他工具，你需要打开同步界面-选择节点信息-然后再在可视化页面里面寻找表格，然后再一直下一步直到同步完成。而上述这些操作，在psql这里只需要一行命令&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pg_dump -h SRC -p &lt;span class="m"&gt;5432&lt;/span&gt; -U USR -d SRCDB -t sch.tbl --no-owner --no-privileges &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; psql -h DST -p &lt;span class="m"&gt;5432&lt;/span&gt; -U USR -d DSTDB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="psql用法_-1"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;psql用法_自定义psqlrc文件&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;除此之外，你可以创建&lt;/span&gt;&lt;code&gt;.psqlrc&lt;/code&gt;&lt;span fontsize="" color=""&gt;文件来定义命令行环境和快捷命令。&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;vim ~.psqlrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;\set activeprocess &amp;#39;select pid,usename,query from pg_stat_activity where state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;active&amp;#39;&amp;#39;;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span fontsize="" color=""&gt;然后你就可以在命令行中调用它了&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;# :activeprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;   pid   &lt;span class="p"&gt;|&lt;/span&gt; usename &lt;span class="p"&gt;|&lt;/span&gt;                                 query                                  
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------+----------+------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2942409&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; pid,usename,query from pg_stat_activity where &lt;span class="nv"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span fontsize="" color=""&gt;类似的，你可以在&lt;/span&gt;&lt;code&gt;.psqlrc&lt;/code&gt;&lt;span fontsize="" color=""&gt;中定义输出配置，常用的元信息查询等等。&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="psql用法_-2"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;psql用法_批量执行查询结果&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;作为DBA，有些操作需要拼接元信息形成新的操作命令，然后再进行操作。通常我们只是复制这些结果，再进行粘贴执行一次操作。在psql中，被&lt;/span&gt;&lt;code&gt;\gexec&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令简化。把查询结果当成 SQL 执行，做批量 DDL 神器。&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 批量重建 bloated 索引（只是示例）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;REINDEX INDEX %I.%I;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;schemaname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;indexrelname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pg_stat_all_indexes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;idx_scan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;gexec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="psql用法_-3"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;psql用法_监控&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;我们直到linux中有watch命令进行定义监控，一样的，pg也有这样的watch命令。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>蓝象十日谈·第一日_1.2Postgresql数据库的安装</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-yi-ri_1.2postgresqlshu-ju-ku-de-an-zhuang/</link><pubDate>Sun, 07 Dec 2025 12:44:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-yi-ri_1.2postgresqlshu-ju-ku-de-an-zhuang/</guid><description>&lt;h1 id="postgresql数据库的安装"&gt;&lt;strong&gt;Postgresql数据库的安装&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id="仓库安装"&gt;&lt;strong&gt;仓库安装&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;仓库安装可以参考官方的&lt;a href="https://www.postgresql.org/download/"&gt;download页面&lt;/a&gt;。在这里可以选择操作系统，需要安装的Postgresql版本号，快捷的进行安装和部署。&lt;/p&gt;
&lt;p&gt;如果需要离线安装，那么推荐首先进行创建离线仓库，包括base,update,epel,pgdg等等的分类仓库创建，方便日后升级和扩展。如果是容器部署可以参考&lt;a href="https://hub.docker.com/_/postgres"&gt;Postgres offical image&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;大型项目除了数据库本身，还需要安装数据库周边的一些软件，依赖复杂度高，所以推荐仓库安装。&lt;/p&gt;</description></item><item><title>蓝象十日谈·第一日_1.1数据库的发展历程</title><link>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-01ri_shu-ju-ku-de-fa-zhan-li-cheng/</link><pubDate>Sun, 07 Dec 2025 11:36:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/lan-xiang-shi-ri-tan-di-01ri_shu-ju-ku-de-fa-zhan-li-cheng/</guid><description>&lt;h3 id="蓝象十日谈第01日_"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;蓝象十日谈·第01日_数据库的发展历程&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id="数据库的发展历程"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;数据库的发展历程&lt;/strong&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;img src="https://www.zhangblogs.cn/upload/image-ilgq.png" style="display: inline-block;width:100.0%;height:100.0%" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;滚滚长江东逝水，浪花淘尽英雄。数据库系统的发展历程波澜壮阔，血脉丛横交错。每个年代都有各自的佼佼者和里程碑。主线脉络我这里分为8条：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;IBM 系统 R → DB2&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;1970s 的 System R 奠定了 SQL 与商用 RDBMS 的起点，随后发展为 DB2，并衍生出多条企业级分支（如 OS/400、Mainframe 等）。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;Ingres/POSTGRES → PostgreSQL&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;伯克利 Ingres 一脉演化到 POSTGRES、Postgres95，最终成为 &lt;strong&gt;PostgreSQL&lt;/strong&gt;。这条线上你会看到：&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Postgresql应急手册-膨胀</title><link>https://www.zhangblogs.cn/archives/postgresqlying-ji-shou-ce-peng-zhang/</link><pubDate>Fri, 09 May 2025 11:25:43 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/postgresqlying-ji-shou-ce-peng-zhang/</guid><description>&lt;p&gt;&lt;strong&gt;Postgresql应急手册结构性内容来自xiongcc的pg应急一图&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="postgresql-膨胀问题技术指南"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;PostgreSQL 膨胀问题技术指南&lt;/strong&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;摘要：&lt;/strong&gt; PostgreSQL 数据库在长时间运行、频繁更新的情况下，容易出现“膨胀（Bloat）”问题。膨胀指的是表、索引、WAL 日志或系统目录占用了不必要的大量空间，可能导致性能下降。本文将分别讨论 &lt;strong&gt;表膨胀&lt;/strong&gt;、&lt;strong&gt;索引膨胀&lt;/strong&gt;、&lt;strong&gt;WAL 日志膨胀&lt;/strong&gt; 和 &lt;strong&gt;系统表膨胀&lt;/strong&gt;，分析成因、检测方法，并提供解决方案和示例脚本。通过合理的监控和维护，可有效控制膨胀现象，提高数据库性能和稳定性。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Postgresql应急手册-事务ID回卷</title><link>https://www.zhangblogs.cn/archives/postgresqlying-ji-shou-ce-shi-wu-idhui-juan/</link><pubDate>Fri, 09 May 2025 11:23:10 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/postgresqlying-ji-shou-ce-shi-wu-idhui-juan/</guid><description>&lt;p&gt;postgresql应急手册骨干内容源自xiongcc的应急脑图，结合GPT深入研究得出结果。本人校核。&lt;/p&gt;
&lt;img src="https://www.zhangblogs.cn/upload/postgresql应急流程-emgl.jpg" style="display: inline-block;width:100.0%;height:100.0%" /&gt;
&lt;hr&gt;
&lt;h1 id="postgresql-事务id回卷异常及处理方案"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;PostgreSQL 事务ID回卷异常及处理方案&lt;/strong&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id="1-事务id回卷异常的表现"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;1. 事务ID回卷异常的表现&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;概念说明：&lt;/strong&gt; PostgreSQL使用32位事务ID（Transaction ID, XID）标识事务，每个新事务都会消耗一个XID (&lt;/span&gt;&lt;a href="https://www.postgresql.fastware.com/blog/how-to-fix-transaction-wraparound-in-postgresql#:~:text=The%20issue%20with%20transaction%20wraparound,32%7D"&gt;&lt;span fontsize="" color=""&gt;How to fix transaction wraparound in PostgreSQL?&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt; possible Txids))。由于32位整数最大约为42亿，XID会在约21亿（2^31）时触发“回卷”（wraparound）机制，从0重新计数。为了防止旧事务的数据可见性错误，PostgreSQL要求在接近XID耗尽时冻结（freeze）老事务ID。如果未及时冻结，数据库将采取保护措施，包括强制只读甚至停止服务，以避免数据丢失 (&lt;/span&gt;&lt;a href="https://www.percona.com/blog/overcoming-vacuum-wraparound/#:~:text=,ONLY%20mode"&gt;&lt;span fontsize="" color=""&gt;Overcoming VACUUM WRAPAROUND&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;)。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Postgresql IO</title><link>https://www.zhangblogs.cn/archives/1733887299274/</link><pubDate>Wed, 11 Dec 2024 11:30:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1733887299274/</guid><description>&lt;h1 id="io-patterns"&gt;&lt;strong&gt;I/O Patterns&lt;/strong&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dinesh &amp;amp; Rakesh&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;March 1, 2024&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="演讲人介绍"&gt;&lt;strong&gt;演讲人介绍&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="dinesh-kumar"&gt;&lt;strong&gt;Dinesh Kumar&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Principal Architect @ Tessell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Active contributor to Opensource tools around PostgreSQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Author of two PostgreSQL books&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rakesh"&gt;&lt;strong&gt;Rakesh&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Solutions Architect @ Tessell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extensively built products &amp;amp; platforms with PostgreSQL&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-io"&gt;&lt;strong&gt;What is I/O?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;从高层次来看，I/O 操作是请求从磁盘读取数据（“输入”）或向磁盘写入数据（“输出”)的操作，通常以&lt;strong&gt;每秒操作数&lt;/strong&gt;来衡量。&lt;/p&gt;
&lt;img src="https://www.zhangblogs.cn/upload/image-ktws.png" style="display: inline-block" /&gt;
&lt;p&gt;这张图是关于 PostgreSQL 数据库中的 I/O（输入/输出）流程的高级视图。下面是每个部分的分析：&lt;/p&gt;</description></item><item><title>Postgresql MVCC -2 锁</title><link>https://www.zhangblogs.cn/archives/1722588159084/</link><pubDate>Mon, 05 Aug 2024 11:36:03 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1722588159084/</guid><description>&lt;img src="https://www.zhangblogs.cn/upload/DALL·E%202024-08-05%2011.25.01%20-%20A%20detailed%20diagram%20illustrating%20PostgreSQL%20locks.%20The%20diagram%20should%20include%20different%20types%20of%20locks%20such%20as%20row-level%20locks,%20table-level%20locks,%20and%20-1722828322094-2.webp" style="display: inline-block" /&gt;
&lt;h2&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Postgresql MVCC -2 锁&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;了解完postgresql中的事务隔离级别，剩下的就是锁机制了。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;显式锁 Explicit Locking&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;PostgreSQL提供了多种锁模式来控制对表中数据的并发访问。在MVCC未提供所需行为的情况下，这些模式可用于应用程序控制的锁定。此外，大多数PostgreSQL命令会自动获取适当模式的锁，以确保在命令执行时不会以不兼容的方式删除或修改引用的表。 （例如， &lt;/span&gt;&lt;code&gt;TRUNCATE&lt;/code&gt;&lt;span fontsize="" color=""&gt;不能安全地与同一表上的其他操作同时执行，因此它会在表上获取&lt;/span&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁来强制执行。）&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Table-Level Locks&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ACCESS SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt; (&lt;/span&gt;&lt;code&gt;AccessShareLock&lt;/code&gt;&lt;span fontsize="" color=""&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令在引用的表上获取此模式的锁。一般来说，任何只&lt;/span&gt;&lt;em&gt;&lt;span fontsize="" color=""&gt;读取&lt;/span&gt;&lt;/em&gt;&lt;span fontsize="" color=""&gt;表而不修改表的查询都会获取这种锁模式。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ROW SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt; (&lt;/span&gt;&lt;code&gt;RowShareLock&lt;/code&gt;&lt;span fontsize="" color=""&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令在指定了&lt;/span&gt;&lt;code&gt;FOR UPDATE&lt;/code&gt;&lt;span fontsize="" color=""&gt; 、 &lt;/span&gt;&lt;code&gt;FOR NO KEY UPDATE&lt;/code&gt;&lt;span fontsize="" color=""&gt; 、 &lt;/span&gt;&lt;code&gt;FOR SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;或&lt;/span&gt;&lt;code&gt;FOR KEY SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;选项之一的所有表上获取此模式的锁（除了在没有引用的任何其他表上的&lt;/span&gt;&lt;code&gt;ACCESS SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁之外）任何显式的&lt;/span&gt;&lt;code&gt;FOR ...&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁定选项）。&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span fontsize="" color=""&gt;注意，虽然名字中含有row，但是这类锁不是还是表锁，不是行锁&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关于select for 锁定子句&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FOR UPDATE&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;锁定选定的行以进行更新。这些行不能被其他事务修改，直到当前事务完成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 这里，你可以对结果集中的行进行更新操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FOR NO KEY UPDATE&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Postgresql MVCC -1 隔离级别</title><link>https://www.zhangblogs.cn/archives/1722507705382/</link><pubDate>Thu, 01 Aug 2024 18:31:13 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1722507705382/</guid><description>&lt;h2 id="postgresql-mvcc--1-隔离级别"&gt;&lt;strong&gt;Postgresql MVCC -1 隔离级别&lt;/strong&gt;&lt;/h2&gt;
&lt;img src="https://www.zhangblogs.cn/upload/DALL·E%202024-08-01%2018.27.24%20-%20An%20illustration%20of%20PostgreSQL%20MVCC%20(Multi-Version%20Concurrency%20Control)%20focusing%20on%20Read%20Committed%20and%20Serializable%20isolation%20levels.%20The%20image%20should%20.webp" style="display: inline-block" /&gt;
&lt;h3 id="mvcc是什么"&gt;&lt;strong&gt;MVCC是什么&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;MVCC,英文&lt;em&gt;Multi-Version Concurrency Control&lt;/em&gt; ，多版本并发控制。&lt;/p&gt;
&lt;p&gt;这是目前所有主流关系型数据库都具备的并发控制机制。&lt;/p&gt;
&lt;p&gt;本文不深入讨论二段锁机制，MVCC机制等，只阐述postgresql的MVCC实现和特性。（深入部分会单开一篇具体讨论）&lt;/p&gt;</description></item><item><title>Postgresql数据库维护须知</title><link>https://www.zhangblogs.cn/archives/1722417807914/</link><pubDate>Wed, 31 Jul 2024 17:28:06 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1722417807914/</guid><description>&lt;h2&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Postgresql数据库维护须知&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;img src="https://www.zhangblogs.cn/upload/FNO%252BR9kpGnclGXgQ%253D.webp" style="display: inline-block" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;本文翻译自&lt;/span&gt;&lt;a href="https://www.ashnik.com/everything-you-need-to-know-about-postgresql-database-maintenance/" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;strong&gt;&lt;span data-fontsize="" color=""&gt;Everything you need to know about PostgreSQL Database Maintenance&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;作者 &lt;/span&gt;&lt;a href="https://www.ashnik.com/author/nishchaykothari/" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;Nishchay Kothari&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;介绍&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;我们经常听到“数据库维护”这个术语。那么它到底是什么呢？所有事物都需要有效的维护，包括您的数据库。定期维护有助于数据库正常运行并高效执行，以满足您的业务期望。数据库维护描述了一组旨在改进数据库的任务。这些常规任务旨在提高性能、释放磁盘空间、检查数据错误、硬件故障、更新内部统计数据以及许多其他不明显（但通常重要）的事项。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数据库维护在日常PostgreSQL操作中是一个高度被忽视的话题。虽然人们普遍认为数据库备份需要定期和基本地进行，但只有少数用户意识到额外的工作。一种主要的原因是，许多人没有深入了解SQL本身，并且无法有效地执行这些任务。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;有时，数据库维护如果做得不当可能不会引起注意，但当数据库性能受到影响时，就会变成一个真正的问题。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;这本白皮书将带您了解常见的Postgresql数据库维护任务&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;关键要点：&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Vacuum 过程&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color="inherit" style="color: inherit"&gt; &lt;/span&gt;&lt;span fontsize="" color=""&gt;在 PostgreSQL 中，vacuum 负责清理死行或死元组的工作。这类似于对死行/元组进行碎片整理的活动，通常被称为膨胀&lt;/span&gt;&lt;code&gt;bloat&lt;/code&gt;&lt;span fontsize="" color=""&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;版本控制&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color="inherit" style="color: inherit"&gt; &lt;/span&gt;&lt;span fontsize="" color=""&gt;PostgreSQL 通过 MVCC（多版本并发控制）维护旧元组的版本控制，以在事务中实现可见性。因此，它不会立即删除这些数据版本，而是保持这些版本，除非有人指示其删除。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>postgresql HA框架对比</title><link>https://www.zhangblogs.cn/archives/1717063008323/</link><pubDate>Thu, 30 May 2024 17:57:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1717063008323/</guid><description>&lt;p&gt;&lt;span fontsize="" color=""&gt;文章内容来自&lt;/span&gt;&lt;a href="https://scalegrid.io/blog/managing-high-availability-in-postgresql-part-3/" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;Managing High Availability in PostgreSQL® – Part III: Patroni&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;Patroni 对于 PostgreSQL 数据库管理员（DBA）来说是一个宝贵的工具，因为它执行 PostgreSQL 集群的端到端设置和监控。选择分布式一致性服务（DCS）和备用创建的灵活性对最终用户来说是一个优势，因为他们可以选择自己熟悉的方法。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Postgresql数据库调优</title><link>https://www.zhangblogs.cn/archives/1705564776986/</link><pubDate>Thu, 18 Jan 2024 16:03:07 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1705564776986/</guid><description>&lt;p&gt;&lt;span fontsize="" color=""&gt;参考连接:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.enterprisedb.com/postgres-tutorials/introduction-postgresql-performance-tuning-and-optimization" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;An Introduction to PostgreSQL Performance Tuning and Optimization&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;本文档介绍如何调整 &lt;/span&gt;&lt;code&gt;PostgreSQL&lt;/code&gt;&lt;span fontsize="" color=""&gt; 和 &lt;/span&gt;&lt;code&gt;EDB Postgres Advanced Server (EPAS)&lt;/code&gt;&lt;span fontsize="" color=""&gt;（版本 10 至 13）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;所使用的系统是 &lt;/span&gt;&lt;code&gt;RHEL&lt;/code&gt;&lt;span fontsize="" color=""&gt; 系列 &lt;/span&gt;&lt;code&gt;linux&lt;/code&gt;&lt;span fontsize="" color=""&gt; &lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;version 8&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;。这些只是一般指南，实际调整细节会因工作负载而异，但它们应能为大多数部署提供一个良好的起点。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;调优时,我们从硬件开始，然后逐级向上，最后完成应用程序的 SQL 查询。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;随着堆栈的不断升级，与工作负载相关的调优方面也会越来越高，因此我们会从最普通的方面开始，然后再到与工作负载最相关的方面&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;1. 规划机器&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数据库部署的服务器类型如下：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;bare metal&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt; 裸金属服务器&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;virtualized machines&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt; 虚拟机&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;containerized&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt; 容器化&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span fontsize="" color=""&gt;本文档侧重裸金属和虚拟机&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;1.1 裸金属&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在为 PostgreSQL 设计裸机服务器时，需要考虑一些因素。这些因素包括 CPU、内存、磁盘，少数情况下还包括网卡&lt;/span&gt;&lt;/p&gt;</description></item></channel></rss>