<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Kernel Notes</title><link>https://my-blog.j8465383071.workers.dev/posts/</link><description>Recent content in Posts on Kernel Notes</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><lastBuildDate>Fri, 11 Sep 2026 18:12:00 +0800</lastBuildDate><atom:link href="https://my-blog.j8465383071.workers.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgresInternal</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/postgresinternal/</link><pubDate>Fri, 11 Sep 2026 15:06:30 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/postgresinternal/</guid><description>&lt;h1 id="postgres-internals-14-阅读笔记">Postgres Internals 14 阅读笔记&lt;/h1>
&lt;p>Egor Rogov 的 &lt;em>PostgreSQL 14 Internals&lt;/em> 读书笔记入口。中文在线版方便查阅，英文 PDF 方便离线精读。&lt;/p>
&lt;h2 id="资料">资料&lt;/h2>
&lt;ul>
&lt;li>中文在线版：&lt;a href="https://postgres-internals.cn/docs/chapter01/">PostgreSQL 14 Internals（中文）&lt;/a>&lt;/li>
&lt;li>英文 PDF（本站电子书库）：&lt;a href="https://my-blog.j8465383071.workers.dev/ebooks/postgresql_internals-14_parts1-3_en.pdf">postgresql_internals-14_parts1-3_en.pdf&lt;/a>&lt;/li>
&lt;/ul>
&lt;figure class="pdf-embed">
&lt;div class="pdf-embed__bar">
&lt;span class="pdf-embed__title">PostgreSQL 14 Internals (EN, Parts 1–3)&lt;/span>
&lt;a class="pdf-embed__link" href="https://my-blog.j8465383071.workers.dev/ebooks/postgresql_internals-14_parts1-3_en.pdf" target="_blank" rel="noopener">新窗口打开&lt;/a>
&lt;a class="pdf-embed__link" href="https://my-blog.j8465383071.workers.dev/ebooks/postgresql_internals-14_parts1-3_en.pdf" download>下载&lt;/a>
&lt;/div>
&lt;iframe
class="pdf-embed__frame"
src="https://my-blog.j8465383071.workers.dev/ebooks/postgresql_internals-14_parts1-3_en.pdf"
title="PostgreSQL 14 Internals (EN, Parts 1–3)"
height="720"
loading="lazy"
>&lt;/iframe>
&lt;/figure>
&lt;hr>
&lt;h2 id="数据组织">数据组织&lt;/h2>
&lt;h3 id="数据库">数据库&lt;/h3>
&lt;p>当初始化一个 PG 实例之后，PGDATA 会自动创建以下三种基础数据库：&lt;/p>
&lt;ul>
&lt;li>template0: 用来通过逻辑复制，或创建不同编码数据库的原型/样板；&lt;/li>
&lt;li>template1: 用户在此实例下创建所有其他数据库的模版，新建库都基于它；&lt;/li>
&lt;li>postgres: 自带的一个常规库；&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="image" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/uploads/image.png">&lt;/p></description></item><item><title>安全架构</title><link>https://my-blog.j8465383071.workers.dev/posts/security/1-security-architecture/</link><pubDate>Thu, 11 Jun 2026 10:50:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/1-security-architecture/</guid><description>&lt;h1 id="4-安全架构">4 安全架构&lt;/h1>
&lt;h2 id="41-威胁模型">4.1 威胁模型&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">| STRIDE类别 | 威胁描述 | 针对的生命周期阶段 | 对应安全功能（章节） |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|------------|----------|------------------|----------------------|
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **S** 欺骗 | 攻击者伪造合法用户/系统身份 | 访问、传输 | 身份认证、安全传输（TLS/TLCP） |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **T** 篡改 | 攻击者修改数据或代码 | 传输、计算、存储 | 安全传输、数据防篡改（账本表）、全密态加密、审计日志防篡改 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **R** 否认 | 用户否认执行过某操作 | 所有阶段 | 安全审计（不可否认记录） |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **I** 信息泄露 | 敏感数据被未授权读取 | 访问、传输、计算、存储 | 访问控制、安全传输、透明加密、全密态加密、机密计算、数据脱敏 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **D** 拒绝服务 | 攻击者使系统不可用 | 访问、网络 | 网络ACL、SQL防火墙（阻断异常大查询） |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| **E** 权限提升 | 普通用户获得更高权限 | 访问、计算 | 访问控制（三权分立、最小权限）、数据库防火墙 |
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">角色&lt;/th>
&lt;th style="text-align: left">动机&lt;/th>
&lt;th style="text-align: left">目标&lt;/th>
&lt;th style="text-align: left">技术&lt;/th>
&lt;th style="text-align: left">分类&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">黑客&lt;/td>
&lt;td style="text-align: left">售卖获利&lt;/td>
&lt;td style="text-align: left">鉴别数据&lt;/td>
&lt;td style="text-align: left">不可信IP登录&lt;/td>
&lt;td style="text-align: left">欺骗&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">内部运维人员&lt;/td>
&lt;td style="text-align: left">勒索获利&lt;/td>
&lt;td style="text-align: left">用户表&lt;/td>
&lt;td style="text-align: left">暴力破解&lt;/td>
&lt;td style="text-align: left">篡改&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">内部研发人员&lt;/td>
&lt;td style="text-align: left">情报窃取&lt;/td>
&lt;td style="text-align: left">系统表&lt;/td>
&lt;td style="text-align: left">凭证重放&lt;/td>
&lt;td style="text-align: left">否认&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">系统维护人员&lt;/td>
&lt;td style="text-align: left">蓄意报复&lt;/td>
&lt;td style="text-align: left">事务日志&lt;/td>
&lt;td style="text-align: left">默认账户攻击&lt;/td>
&lt;td style="text-align: left">信息泄露&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">供应链&lt;/td>
&lt;td style="text-align: left">规避审计&lt;/td>
&lt;td style="text-align: left">审计日志&lt;/td>
&lt;td style="text-align: left">过期账号攻击&lt;/td>
&lt;td style="text-align: left">拒绝服务&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">网络中间人&lt;/td>
&lt;td style="text-align: left">炫耀技能&lt;/td>
&lt;td style="text-align: left">内存数据&lt;/td>
&lt;td style="text-align: left">弱口令攻击&lt;/td>
&lt;td style="text-align: left">权限提升&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">机房管理人员&lt;/td>
&lt;td style="text-align: left">人为过失&lt;/td>
&lt;td style="text-align: left">配置文件&lt;/td>
&lt;td style="text-align: left">内存凭证残留&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">认证耗尽&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">密码泄露&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">数据泄露&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">流量伪造&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">流量重放&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">密钥泄露&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">证书伪造&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">身份伪造&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">未授权访问&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">越权访问&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">权限提升&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">权限滥用&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">磁盘窃取&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">恶意软件&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">系统隔离失效&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">文件篡改&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">日志伪造&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">特权窥探&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">供应链后门&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">内存嗅探&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">调试工具滥用&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">操作抵赖&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">攻击隐匿&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">合规证据缺失&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>攻击者画像&lt;/th>
&lt;th>攻击动机&lt;/th>
&lt;th>攻击阶段&lt;/th>
&lt;th>攻击类型&lt;/th>
&lt;th>攻击目标&lt;/th>
&lt;th>攻击技术（ATT&amp;amp;CK）&lt;/th>
&lt;th>影响的安全域（GB/T 20273）&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>安全功能与标准映射&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>外部渗透测试者&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>欺骗(S)&lt;/td>
&lt;td>认证凭据&lt;/td>
&lt;td>暴力破解(T1110)&lt;/td>
&lt;td>身份鉴别(4.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>身份认证；GB/T 20273 4.1；ISO 27001 A.9；NIST IA-5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>数据篡改&lt;/td>
&lt;td>武器化&lt;/td>
&lt;td>篡改(T)&lt;/td>
&lt;td>会话令牌&lt;/td>
&lt;td>中间人攻击(T1557)&lt;/td>
&lt;td>传输数据保密性(4.8.2)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>TLS双向认证；GB/T 20273 4.8.2；ISO 27001 A.13.2；NIST SC-8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部开发人员&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>投递&lt;/td>
&lt;td>否认(R)&lt;/td>
&lt;td>数据字典&lt;/td>
&lt;td>账户操纵(T1098)&lt;/td>
&lt;td>安全审计(4.6)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>统一审计；GB/T 20273 4.6；ISO 27001 A.12.4；NIST AU-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>第三方运维人员&lt;/td>
&lt;td>拒绝服务&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>信息泄露(I)&lt;/td>
&lt;td>用户表数据&lt;/td>
&lt;td>SQL注入(T1190)&lt;/td>
&lt;td>自主访问控制(4.2)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>数据脱敏；GB/T 20273 4.2；PCI DSS 3.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>安装&lt;/td>
&lt;td>拒绝服务(D)&lt;/td>
&lt;td>审计日志&lt;/td>
&lt;td>日志清除(T1070)&lt;/td>
&lt;td>用户数据完整性(4.7)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>审计日志防篡改；GB/T 20273 4.7；ISO 27001 A.12.4；NIST AU-9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户（恶意）&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>命令与控制&lt;/td>
&lt;td>权限提升(E)&lt;/td>
&lt;td>存储过程/函数&lt;/td>
&lt;td>服务器软件组件劫持(T1505)&lt;/td>
&lt;td>强制访问控制(4.4)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>最小权限原则；GB/T 20273 4.4；NIST AC-6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意应用程序&lt;/td>
&lt;td>报复&lt;/td>
&lt;td>目标达成&lt;/td>
&lt;td>-&lt;/td>
&lt;td>备份集&lt;/td>
&lt;td>数据加密（防御绕过）(T1022)&lt;/td>
&lt;td>存储数据保密性(4.8.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>透明加密(TDE)；GB/T 20273 4.8.1；ISO 27001 A.10.1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意OS管理员&lt;/td>
&lt;td>间谍活动&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>内存中的明文&lt;/td>
&lt;td>进程注入(T1055)&lt;/td>
&lt;td>标记(4.3)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>机密计算(TEE)；NIST SC-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>误操作&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>配置文件&lt;/td>
&lt;td>系统信息发现(T1082)&lt;/td>
&lt;td>可信路径(4.9)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>网络ACL；GB/T 20273 4.9；ISO 27001 A.13.1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>身份伪造&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据导出文件&lt;/td>
&lt;td>数据破坏(T1485)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>低&lt;/td>
&lt;td>备份加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>会话劫持&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库链接&lt;/td>
&lt;td>服务停止(T1489)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SQL防火墙&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>索引/分区&lt;/td>
&lt;td>通过API攻击(T1559)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>行级安全(RLS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>物化视图&lt;/td>
&lt;td>客户端连接劫持(T1184)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>列级加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>同义词&lt;/td>
&lt;td>网络嗅探(T1040)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>三权分立&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>触发器等对象&lt;/td>
&lt;td>创建账户(T1136)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>密钥管理(KMS/HSM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>临时表空间&lt;/td>
&lt;td>数据从本地拉取(T1213)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>全密态执行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>Undo日志&lt;/td>
&lt;td>禁用安全工具(T1562)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>权限分析工具&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>控制文件&lt;/td>
&lt;td>受信关系利用(T1199)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>监听器/端口&lt;/td>
&lt;td>反向工程(T1598)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SSL证书私钥&lt;/td>
&lt;td>数据加密(自身通讯)(T1573)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库参数&lt;/td>
&lt;td>域策略修改(T1484)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库进程内存&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据快照&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库服务端口&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="gemini">gemini&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">攻击者画像&lt;/th>
&lt;th style="text-align: left">攻击动机&lt;/th>
&lt;th style="text-align: left">攻击阶段 (Kill Chain)&lt;/th>
&lt;th style="text-align: left">攻击类型 (STRIDE)&lt;/th>
&lt;th style="text-align: left">攻击目标 (数据库资产)&lt;/th>
&lt;th style="text-align: left">攻击技术（MITRE ATT&amp;amp;CK）&lt;/th>
&lt;th style="text-align: left">ISO 15408 (CC) 功能组件映射&lt;/th>
&lt;th style="text-align: left">商业标杆对标 (Oracle企业版组件)&lt;/th>
&lt;th style="text-align: left">本内核架构防御机制基线&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">外部黑客/APT组织&lt;/td>
&lt;td style="text-align: left">经济利益(勒索/售卖)&lt;/td>
&lt;td style="text-align: left">侦察 (Recon)&lt;/td>
&lt;td style="text-align: left">欺骗(Spoofing)&lt;/td>
&lt;td style="text-align: left">认证凭据 (Hash/密码)&lt;/td>
&lt;td style="text-align: left">T1190 利用面向公众的应用&lt;/td>
&lt;td style="text-align: left">FIA_UAU.2 (用户鉴别)&lt;/td>
&lt;td style="text-align: left">Oracle Centrally Managed Users (CMU)&lt;/td>
&lt;td style="text-align: left">统一身份认证与多因素(MFA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">内部恶意超管/DBA&lt;/td>
&lt;td style="text-align: left">商业间谍(数据窃密)&lt;/td>
&lt;td style="text-align: left">武器化 (Weaponization)&lt;/td>
&lt;td style="text-align: left">篡改(Tampering)&lt;/td>
&lt;td style="text-align: left">数据文件(MDF/PGDATA)&lt;/td>
&lt;td style="text-align: left">T1110 暴力破解&lt;/td>
&lt;td style="text-align: left">FCS_COP.1 (密码运算)&lt;/td>
&lt;td style="text-align: left">Oracle Advanced Security (TDE)&lt;/td>
&lt;td style="text-align: left">透明数据加密 (TDE)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">内部研发/测试人员&lt;/td>
&lt;td style="text-align: left">蓄意破坏(报复社会)&lt;/td>
&lt;td style="text-align: left">投递 (Delivery)&lt;/td>
&lt;td style="text-align: left">否认(Repudiation)&lt;/td>
&lt;td style="text-align: left">WAL/Redo/Undo日志&lt;/td>
&lt;td style="text-align: left">T1098 账户操纵&lt;/td>
&lt;td style="text-align: left">FAU_GEN.1 (审计数据产生)&lt;/td>
&lt;td style="text-align: left">Oracle Audit Vault and DB Firewall (AVDF)&lt;/td>
&lt;td style="text-align: left">高性能异步统一审计与防篡改日志&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">供应链/第三方运维&lt;/td>
&lt;td style="text-align: left">掩盖罪行(规避审计)&lt;/td>
&lt;td style="text-align: left">漏洞利用 (Exploitation)&lt;/td>
&lt;td style="text-align: left">信息泄露(Info Disclosure)&lt;/td>
&lt;td style="text-align: left">系统目录/数据字典&lt;/td>
&lt;td style="text-align: left">T1078 有效账户(默认/后门)&lt;/td>
&lt;td style="text-align: left">FDP_ACC.1 (子集访问控制)&lt;/td>
&lt;td style="text-align: left">Oracle Database Vault (Realm特权隔离)&lt;/td>
&lt;td style="text-align: left">强三权分立与安全堡垒(Realm)隔离&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">网络中间人(MITM)&lt;/td>
&lt;td style="text-align: left">炫耀技能(黑客主义)&lt;/td>
&lt;td style="text-align: left">安装/植入 (Installation)&lt;/td>
&lt;td style="text-align: left">拒绝服务(DoS)&lt;/td>
&lt;td style="text-align: left">业务表核心数据&lt;/td>
&lt;td style="text-align: left">T1059 命令行解释器提权&lt;/td>
&lt;td style="text-align: left">FDP_DAU.1 (基本数据鉴别)&lt;/td>
&lt;td style="text-align: left">Oracle Blockchain Tables / Immutable Tables&lt;/td>
&lt;td style="text-align: left">数据防篡改内核账本 (Ledger Hash)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">恶意云租户/邻居&lt;/td>
&lt;td style="text-align: left">误操作(配置失误)&lt;/td>
&lt;td style="text-align: left">命令与控制 (C2)&lt;/td>
&lt;td style="text-align: left">特权提升(Elevation)&lt;/td>
&lt;td style="text-align: left">审计日志记录&lt;/td>
&lt;td style="text-align: left">T1552 访问非安全凭据&lt;/td>
&lt;td style="text-align: left">FMT_SMR.1 (安全管理角色)&lt;/td>
&lt;td style="text-align: left">Oracle Label Security (OLS)&lt;/td>
&lt;td style="text-align: left">强制访问控制 (MAC 安全标签)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">恶意OS管理员&lt;/td>
&lt;td style="text-align: left">资源盗用(挖矿)&lt;/td>
&lt;td style="text-align: left">横向移动 (Lateral Move)&lt;/td>
&lt;td style="text-align: left">侧信道探测(Side-Channel)&lt;/td>
&lt;td style="text-align: left">密钥/证书/Keystore&lt;/td>
&lt;td style="text-align: left">T1040 网络嗅探&lt;/td>
&lt;td style="text-align: left">FDP_RIP.1 (残余信息保护)&lt;/td>
&lt;td style="text-align: left">Oracle Advanced Security (Data Redaction)&lt;/td>
&lt;td style="text-align: left">动态数据脱敏 (DDM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">物理机房入侵者&lt;/td>
&lt;td style="text-align: left">合规性破坏(名誉打击)&lt;/td>
&lt;td style="text-align: left">目标达成 (Actions)&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">存储过程/UDF/扩展插件&lt;/td>
&lt;td style="text-align: left">T1557 中间人攻击&lt;/td>
&lt;td style="text-align: left">FCS_CKM.1 (密码密钥产生与管理)&lt;/td>
&lt;td style="text-align: left">Oracle Key Vault (OKV)&lt;/td>
&lt;td style="text-align: left">两级密钥管理架构 (KMS/HSM对接)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">失陷的业务程序&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">数据库进程内存 (SGA)&lt;/td>
&lt;td style="text-align: left">T1070 清除审计日志&lt;/td>
&lt;td style="text-align: left">FPT_ITT.1 (内部TOE传输保护)&lt;/td>
&lt;td style="text-align: left">Oracle Virtual Private Database (VPD)&lt;/td>
&lt;td style="text-align: left">行级安全 / 列级安全 (RLS / CLS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">离职/僵尸账号&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">监听器/暴露网络端口&lt;/td>
&lt;td style="text-align: left">T1486 影响数据加密(勒索)&lt;/td>
&lt;td style="text-align: left">FTA_TSE.1 (TOE会话建立)&lt;/td>
&lt;td style="text-align: left">Oracle Data Safe (合规评估与发现)&lt;/td>
&lt;td style="text-align: left">敏感数据发现与分类分级扫描&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">会话令牌/Session&lt;/td>
&lt;td style="text-align: left">T1485 数据破坏(删库)&lt;/td>
&lt;td style="text-align: left">FPT_PHP.3 (抗物理攻击的TSF)&lt;/td>
&lt;td style="text-align: left">Always Encrypted (SQL Server标杆)&lt;/td>
&lt;td style="text-align: left">硬件级机密计算 (TEE/SGX 内核隔离)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">DBLink/跨库链接&lt;/td>
&lt;td style="text-align: left">T1005 收集本地系统数据&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">全密态执行引擎 (内存密态运算)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">物理备份集/快照&lt;/td>
&lt;td style="text-align: left">T1565 数据逻辑操纵&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">全链路 TLS 1.3 / 国密 TLCP 加密通道&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">视图/物化视图/触发器&lt;/td>
&lt;td style="text-align: left">T1184 客户端连接劫持&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">细粒度网络准入 (IP/用户元组控制)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">数据库配置文件&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">内核级 SQL 防火墙 (基于AST白名单)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">临时表空间(Temp)&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;td style="text-align: left">-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="deepseek">deepseek&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>攻击者画像&lt;/th>
&lt;th>攻击动机&lt;/th>
&lt;th>攻击阶段&lt;/th>
&lt;th>攻击类型 (STRIDE)&lt;/th>
&lt;th>攻击目标&lt;/th>
&lt;th>攻击技术 (ATT&amp;amp;CK)&lt;/th>
&lt;th>影响的安全域 (GB/T 20273-2019)&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>安全功能与标准映射（示例）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>外部渗透测试者&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>欺骗 (S)&lt;/td>
&lt;td>认证凭据&lt;/td>
&lt;td>暴力破解 (T1110)&lt;/td>
&lt;td>身份鉴别 (4.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>多因素认证；GB/T 20273 4.1；ISO 27001 A.8.5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>武器化&lt;/td>
&lt;td>篡改 (T)&lt;/td>
&lt;td>会话令牌&lt;/td>
&lt;td>SQL注入 (T1190)&lt;/td>
&lt;td>自主访问控制 (4.2)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>TLS双向认证；GB/T 20273 4.7.2；NIST SC-8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部开发人员&lt;/td>
&lt;td>数据篡改&lt;/td>
&lt;td>投递&lt;/td>
&lt;td>否认 (R)&lt;/td>
&lt;td>数据字典&lt;/td>
&lt;td>中间人攻击 (T1557)&lt;/td>
&lt;td>强制访问控制 (4.4)&lt;/td>
&lt;td>低&lt;/td>
&lt;td>统一审计；GB/T 20273 4.5；ISO 27001 A.8.15&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>第三方运维人员&lt;/td>
&lt;td>拒绝服务&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>用户表数据&lt;/td>
&lt;td>账户操纵 (T1098)&lt;/td>
&lt;td>安全审计 (4.5)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据脱敏；PCI DSS 3.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>安装&lt;/td>
&lt;td>拒绝服务 (D)&lt;/td>
&lt;td>审计日志&lt;/td>
&lt;td>日志清除 (T1070)&lt;/td>
&lt;td>用户数据完整性 (4.6)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>审计日志防篡改；NIST AU-9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意应用程序&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>命令与控制&lt;/td>
&lt;td>权限提升 (E)&lt;/td>
&lt;td>存储过程/函数&lt;/td>
&lt;td>进程注入 (T1055)&lt;/td>
&lt;td>存储数据保密性 (4.7.1)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>最小权限原则；GB/T 20273 4.4；NIST AC-6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意OS管理员&lt;/td>
&lt;td>报复&lt;/td>
&lt;td>目标达成&lt;/td>
&lt;td>-&lt;/td>
&lt;td>备份集&lt;/td>
&lt;td>服务器软件组件劫持 (T1505)&lt;/td>
&lt;td>传输数据保密性 (4.7.2)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>透明加密 (TDE)；ISO 27001 A.8.24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>间谍活动&lt;/td>
&lt;td>持久化&lt;/td>
&lt;td>-&lt;/td>
&lt;td>内存中的明文&lt;/td>
&lt;td>数据加密（影响）(T1485)&lt;/td>
&lt;td>可信路径 (4.8)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>机密计算 (TEE)；NIST SC-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户（恶意）&lt;/td>
&lt;td>误操作&lt;/td>
&lt;td>收集&lt;/td>
&lt;td>-&lt;/td>
&lt;td>配置文件&lt;/td>
&lt;td>系统信息发现 (T1082)&lt;/td>
&lt;td>网络安全 (4.9)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>网络ACL；GB/T 20273 4.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意内部员工&lt;/td>
&lt;td>身份伪造&lt;/td>
&lt;td>渗出&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据导出文件&lt;/td>
&lt;td>服务停止 (T1489)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>备份加密；DLP&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外部攻击者&lt;/td>
&lt;td>会话劫持&lt;/td>
&lt;td>物理访问&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库链接&lt;/td>
&lt;td>数据破坏 (T1485)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SQL防火墙；连接限制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部运维人员&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>索引/分区&lt;/td>
&lt;td>通过API攻击 (T1559)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>行级安全 (RLS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部用户&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>物化视图&lt;/td>
&lt;td>客户端连接劫持 (T1184)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>列级加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>同义词&lt;/td>
&lt;td>网络嗅探 (T1040)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>三权分立&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>触发器等对象&lt;/td>
&lt;td>创建账户 (T1136)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>密钥管理 (KMS/HSM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>临时表空间&lt;/td>
&lt;td>数据从本地拉取 (T1213)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>全密态执行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>Undo日志&lt;/td>
&lt;td>禁用安全工具 (T1562)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>权限分析工具&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>控制文件&lt;/td>
&lt;td>受信关系利用 (T1199)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>不可变备份&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>监听器/端口&lt;/td>
&lt;td>反向工程 (T1598)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>配置基线检查&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SSL证书私钥&lt;/td>
&lt;td>数据加密(自身通信) (T1573)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>端口隐藏&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库参数&lt;/td>
&lt;td>域策略修改 (T1484)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>内存加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库进程内存&lt;/td>
&lt;td>内存刮削 (T1535)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>快照加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据快照&lt;/td>
&lt;td>数据泄露 (T1213)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>文件系统权限&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库服务端口&lt;/td>
&lt;td>端口扫描 (T1046)&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>攻击者画像&lt;/th>
&lt;th>攻击动机&lt;/th>
&lt;th>攻击阶段 (Kill Chain)&lt;/th>
&lt;th>攻击类型 (STRIDE)&lt;/th>
&lt;th>攻击目标 (数据库资产)&lt;/th>
&lt;th>攻击技术 (ATT&amp;amp;CK)&lt;/th>
&lt;th>影响的安全域 (GB/T 20273-2019)&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>安全功能与标准映射（含商业组件 &amp;amp; 内核防御）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>外部黑客/APT组织&lt;/td>
&lt;td>经济利益（勒索/售卖）&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>欺骗 (S)&lt;/td>
&lt;td>认证凭据（密码Hash/票据）&lt;/td>
&lt;td>暴力破解 (T1110)&lt;/td>
&lt;td>身份鉴别 (4.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>多因素认证；Oracle CMU；ISO 27001 A.8.5；NIST IA-5 → 统一身份认证与MFA内核模块&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>会话劫持&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>篡改 (T)&lt;/td>
&lt;td>会话令牌/Cookie&lt;/td>
&lt;td>中间人攻击 (T1557)&lt;/td>
&lt;td>传输数据保密性 (4.7.2)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>TLS双向认证；Oracle Advanced Security；GB/T 20273 4.7.2；NIST SC-8 → 全链路TLS 1.3/国密TLCP加密通道&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>商业间谍（数据窃密）&lt;/td>
&lt;td>武器化&lt;/td>
&lt;td>否认 (R)&lt;/td>
&lt;td>数据字典/系统编目&lt;/td>
&lt;td>账户操纵 (T1098)&lt;/td>
&lt;td>安全审计 (4.5)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>统一审计+防篡改日志；Oracle Audit Vault；GB/T 20273 4.5；ISO 27001 A.8.15 → 高性能异步审计与只读日志内核&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>第三方运维人员&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>投递&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>业务核心表数据&lt;/td>
&lt;td>SQL注入 (T1190)&lt;/td>
&lt;td>自主访问控制 (4.2)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>SQL防火墙+静态脱敏；Oracle AVDF；PCI DSS 3.2 → 内核级AST白名单SQL防火墙&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意内部员工&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>安装&lt;/td>
&lt;td>篡改 (T)&lt;/td>
&lt;td>审计日志记录&lt;/td>
&lt;td>日志清除 (T1070)&lt;/td>
&lt;td>用户数据完整性 (4.6)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>审计日志防篡改（只读表空间）；Oracle Blockchain Table；NIST AU-9 → 内核防篡改账本（Ledger Hash）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户（恶意邻居）&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>命令与控制&lt;/td>
&lt;td>权限提升 (E)&lt;/td>
&lt;td>存储过程/函数/包&lt;/td>
&lt;td>服务器软件组件劫持 (T1505)&lt;/td>
&lt;td>强制访问控制 (4.4)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>最小权限+代码签名；Oracle Database Vault；NIST AC-6 → 强三权分立与Realm特权隔离&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意应用程序&lt;/td>
&lt;td>报复&lt;/td>
&lt;td>目标达成&lt;/td>
&lt;td>拒绝服务 (D)&lt;/td>
&lt;td>物理备份集/快照&lt;/td>
&lt;td>数据破坏 (T1485)&lt;/td>
&lt;td>存储数据保密性 (4.7.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>不可变备份+离线存储；Oracle RMAN；ISO 27001 A.8.13 → 备份加密与防删除兜底策略&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意OS管理员&lt;/td>
&lt;td>间谍活动&lt;/td>
&lt;td>横向移动&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>数据库进程内存(SGA/PGA)&lt;/td>
&lt;td>进程注入/内存刮削 (T1055/T1535)&lt;/td>
&lt;td>用户数据保密性 (4.7.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>机密计算(TEE/SGX)；Oracle Database 23ai Secure Enclaves；NIST SC-3 → 内存密态运算引擎&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>误操作/物理破坏&lt;/td>
&lt;td>物理访问&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>配置文件(spfile/pg_hba)&lt;/td>
&lt;td>系统信息发现 (T1082)&lt;/td>
&lt;td>可信路径 (4.8)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>文件系统权限+配置加密；Oracle Data Safe；GB/T 20273 4.8；ISO 27001 A.8.1 → 内核可信路径与完整性校验&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>离职/僵尸账号&lt;/td>
&lt;td>身份伪造&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>欺骗 (S)&lt;/td>
&lt;td>数据库链接(DBLink)&lt;/td>
&lt;td>有效账户滥用 (T1078)&lt;/td>
&lt;td>身份鉴别 (4.1)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>账户生命周期管理；Oracle CMU；ISO 27001 A.8.2 → 动态权限回收与实时拦截&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>失陷的业务程序&lt;/td>
&lt;td>数据泄露&lt;/td>
&lt;td>渗出&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>敏感数据列（身份证/手机号）&lt;/td>
&lt;td>通过API攻击 (T1559)&lt;/td>
&lt;td>存储数据保密性 (4.7.1)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>动态数据脱敏+行级安全；Oracle VPD/OLS；ISO 27001 A.8.26 → 列级加密(CLS)与行级安全(RLS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部运维人员&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>索引/分区/物化视图&lt;/td>
&lt;td>网络嗅探 (T1040)&lt;/td>
&lt;td>网络安全 (4.9)&lt;/td>
&lt;td>低&lt;/td>
&lt;td>加密通信+网络ACL；Oracle CMAN；GB/T 20273 4.9；ISO 27001 A.8.20 → 细粒度网络准入控制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>供应链/第三方开发&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>持久化&lt;/td>
&lt;td>权限提升 (E)&lt;/td>
&lt;td>触发器/UDF/扩展插件&lt;/td>
&lt;td>创建账户 (T1136)&lt;/td>
&lt;td>强制访问控制 (4.4)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>权限分析+代码审查；Oracle Database Vault；NIST AC-6 → 插件签名验证与默认拒绝策略&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>掩盖罪行&lt;/td>
&lt;td>目标达成&lt;/td>
&lt;td>篡改 (T)&lt;/td>
&lt;td>Undo/Redo/WAL日志&lt;/td>
&lt;td>禁用安全工具 (T1562)&lt;/td>
&lt;td>用户数据完整性 (4.6)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>防篡改日志+权限分析；Oracle Audit Vault；ISO 27001 A.8.15 → 写入只读日志流与篡改即报警&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户（恶意）&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>欺骗 (S)&lt;/td>
&lt;td>控制文件/密码文件&lt;/td>
&lt;td>受信关系利用 (T1199)&lt;/td>
&lt;td>身份鉴别 (4.1)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>网络隔离+强认证；Oracle MFA；GB/T 20273 4.1；NIST IA-5 → 基于TEE的密钥保护&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外部攻击者&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>拒绝服务 (D)&lt;/td>
&lt;td>数据库监听器/服务端口&lt;/td>
&lt;td>服务停止 (T1489)&lt;/td>
&lt;td>网络安全 (4.9)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>端口隐藏+SQL防火墙；Oracle CMAN；ISO 27001 A.8.22 → 内核级连接限流与抗DDoS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>SSL证书私钥/Keystore&lt;/td>
&lt;td>数据加密(自身通信) (T1573)&lt;/td>
&lt;td>传输数据保密性 (4.7.2)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>HSM/KMS保护私钥；Oracle Key Vault；NIST SC-12 → 两级密钥管理架构&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>安装&lt;/td>
&lt;td>篡改 (T)&lt;/td>
&lt;td>数据库参数(init.ora)&lt;/td>
&lt;td>域策略修改 (T1484)&lt;/td>
&lt;td>安全审计 (4.5)&lt;/td>
&lt;td>高&lt;/td>
&lt;td>配置基线检查+变更审计；Oracle AVDF；CIS 基线 → 参数修改自动回滚与告警&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意内部员工&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>收集&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>临时表空间/临时文件&lt;/td>
&lt;td>数据从本地拉取 (T1213)&lt;/td>
&lt;td>存储数据保密性 (4.7.1)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>全密态执行+临时文件加密；Always Encrypted；ISO 27001 A.8.24 → 全密态查询处理引擎&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>渗出&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>数据快照/克隆副本&lt;/td>
&lt;td>数据泄露 (T1213)&lt;/td>
&lt;td>存储数据保密性 (4.7.1)&lt;/td>
&lt;td>中&lt;/td>
&lt;td>快照加密+访问审计；Oracle RMAN；ISO 27001 A.8.12 → 存储级加密与快照防激活&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外部渗透测试者&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>信息泄露 (I)&lt;/td>
&lt;td>数据库服务端口/监听器&lt;/td>
&lt;td>端口扫描 (T1046)&lt;/td>
&lt;td>网络安全 (4.9)&lt;/td>
&lt;td>低&lt;/td>
&lt;td>防火墙策略+IPS；Oracle CMAN；GB/T 20273 4.9 → 端口敲门与隐身技术&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="chatgpt">chatgpt&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>攻击者画像&lt;/th>
&lt;th>攻击动机&lt;/th>
&lt;th>攻击阶段&lt;/th>
&lt;th>攻击类型&lt;/th>
&lt;th>攻击目标&lt;/th>
&lt;th>攻击技术&lt;/th>
&lt;th>影响安全域（GB/T 20273）&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>安全功能与标准映射&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>外部攻击者&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>机密性攻击&lt;/td>
&lt;td>用户凭据&lt;/td>
&lt;td>暴力破解（T1110）&lt;/td>
&lt;td>身份鉴别（4.1）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>身份认证；GB/T 20273 4.1；ISO 27001 A.9；ISO 15408 FIA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>数据篡改&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>完整性攻击&lt;/td>
&lt;td>会话令牌&lt;/td>
&lt;td>中间人攻击（T1557）&lt;/td>
&lt;td>传输数据保密性（4.8.2）&lt;/td>
&lt;td>中&lt;/td>
&lt;td>TLS双向认证；GB/T 20273 4.8.2；ISO 27001 A.13.2；NIST SC-8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部开发人员&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>执行&lt;/td>
&lt;td>否认攻击&lt;/td>
&lt;td>数据字典&lt;/td>
&lt;td>账户操纵（T1098）&lt;/td>
&lt;td>安全审计（4.6）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>统一审计；GB/T 20273 4.6；ISO 27001 A.12.4；NIST AU-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>第三方运维人员&lt;/td>
&lt;td>拒绝服务&lt;/td>
&lt;td>利用&lt;/td>
&lt;td>信息泄露攻击&lt;/td>
&lt;td>用户表数据&lt;/td>
&lt;td>SQL注入（T1190）&lt;/td>
&lt;td>自主访问控制（4.2）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>数据脱敏；GB/T 20273 4.2；PCI DSS 3.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>安装&lt;/td>
&lt;td>可用性攻击&lt;/td>
&lt;td>审计日志&lt;/td>
&lt;td>日志清除（T1070）&lt;/td>
&lt;td>用户数据完整性（4.7）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>审计日志防篡改；GB/T 20273 4.7；ISO 27001 A.12.4；NIST AU-9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>命令与控制&lt;/td>
&lt;td>权限提升攻击&lt;/td>
&lt;td>存储过程/函数&lt;/td>
&lt;td>服务器组件劫持（T1505）&lt;/td>
&lt;td>强制访问控制（4.4）&lt;/td>
&lt;td>中&lt;/td>
&lt;td>最小权限原则；GB/T 20273 4.4；NIST AC-6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意应用程序&lt;/td>
&lt;td>报复&lt;/td>
&lt;td>目标达成&lt;/td>
&lt;td>机密性攻击&lt;/td>
&lt;td>备份集&lt;/td>
&lt;td>数据加密防绕过（T1022）&lt;/td>
&lt;td>存储数据保密性（4.8.1）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>透明加密(TDE)；GB/T 20273 4.8.1；ISO 27001 A.10.1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意操作系统管理员&lt;/td>
&lt;td>间谍活动&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>内存明文&lt;/td>
&lt;td>进程注入（T1055）&lt;/td>
&lt;td>标记（4.3）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>机密计算(TEE)；NIST SC-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>误操作&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>配置文件&lt;/td>
&lt;td>系统信息发现（T1082）&lt;/td>
&lt;td>可信路径（4.9）&lt;/td>
&lt;td>中&lt;/td>
&lt;td>网络ACL；GB/T 20273 4.9；ISO 27001 A.13.1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>身份伪造&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据导出文件&lt;/td>
&lt;td>数据破坏（T1485）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>低&lt;/td>
&lt;td>备份加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>会话劫持&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库链接&lt;/td>
&lt;td>服务停止（T1489）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SQL防火墙&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>索引/分区&lt;/td>
&lt;td>通过API攻击（T1559）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>行级安全(RLS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>物化视图&lt;/td>
&lt;td>客户端连接劫持（T1184）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>列级加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>同义词&lt;/td>
&lt;td>网络嗅探（T1040）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>三权分立&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>触发器等对象&lt;/td>
&lt;td>创建账户（T1136）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>密钥管理(KMS/HSM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>临时表空间&lt;/td>
&lt;td>数据从本地拉取（T1213）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>全密态执行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>Undo日志&lt;/td>
&lt;td>禁用安全工具（T1562）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>权限分析工具&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>控制文件&lt;/td>
&lt;td>受信关系利用（T1199）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>监听器/端口&lt;/td>
&lt;td>反向工程（T1598）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SSL证书私钥&lt;/td>
&lt;td>数据加密（自身通讯）（T1573）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库参数&lt;/td>
&lt;td>域策略修改（T1484）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库进程内存&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据快照&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库服务端口&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h1 id="关系数据库安全威胁维度字典多维去重--结构化版">关系数据库安全威胁维度字典（多维去重 · 结构化版）&lt;/h1>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>攻击者画像&lt;/th>
&lt;th>攻击动机&lt;/th>
&lt;th>攻击阶段&lt;/th>
&lt;th>攻击类型&lt;/th>
&lt;th>攻击目标&lt;/th>
&lt;th>攻击技术&lt;/th>
&lt;th>影响安全域（GB/T 20273 / ISO 15408）&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>安全功能与标准映射&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>外部攻击者&lt;/td>
&lt;td>数据窃取&lt;/td>
&lt;td>侦察&lt;/td>
&lt;td>机密性攻击&lt;/td>
&lt;td>用户凭据&lt;/td>
&lt;td>暴力破解（T1110）&lt;/td>
&lt;td>身份鉴别（4.1）&lt;/td>
&lt;td>高&lt;/td>
&lt;td>身份认证 / MFA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部恶意DBA&lt;/td>
&lt;td>数据篡改&lt;/td>
&lt;td>初始访问&lt;/td>
&lt;td>完整性攻击&lt;/td>
&lt;td>会话令牌&lt;/td>
&lt;td>SQL注入（T1190）&lt;/td>
&lt;td>自主访问控制（4.2）&lt;/td>
&lt;td>中&lt;/td>
&lt;td>访问控制（RBAC/RLS）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内部开发人员&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>执行&lt;/td>
&lt;td>可用性攻击&lt;/td>
&lt;td>数据字典&lt;/td>
&lt;td>中间人攻击（T1557）&lt;/td>
&lt;td>标记（4.3）&lt;/td>
&lt;td>低&lt;/td>
&lt;td>三权分立&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>第三方运维人员&lt;/td>
&lt;td>拒绝服务&lt;/td>
&lt;td>持久化&lt;/td>
&lt;td>不可否认性攻击&lt;/td>
&lt;td>用户表数据&lt;/td>
&lt;td>账户操纵（T1098）&lt;/td>
&lt;td>强制访问控制（4.4）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>最小权限&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络中间人&lt;/td>
&lt;td>勒索&lt;/td>
&lt;td>权限提升&lt;/td>
&lt;td>-&lt;/td>
&lt;td>索引/分区&lt;/td>
&lt;td>日志清除（T1070）&lt;/td>
&lt;td>安全审计（4.6）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>审计日志防篡改&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>云租户&lt;/td>
&lt;td>报复&lt;/td>
&lt;td>防御规避&lt;/td>
&lt;td>-&lt;/td>
&lt;td>物化视图&lt;/td>
&lt;td>进程注入（T1055）&lt;/td>
&lt;td>用户数据完整性（4.7）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>统一审计&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意应用程序&lt;/td>
&lt;td>间谍活动&lt;/td>
&lt;td>凭据获取&lt;/td>
&lt;td>-&lt;/td>
&lt;td>同义词&lt;/td>
&lt;td>服务器组件劫持（T1505）&lt;/td>
&lt;td>存储数据保密性（4.8.1）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>透明加密（TDE）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>恶意操作系统管理员&lt;/td>
&lt;td>规避审计&lt;/td>
&lt;td>内部侦察&lt;/td>
&lt;td>-&lt;/td>
&lt;td>存储过程/函数&lt;/td>
&lt;td>数据加密防绕过（T1022）&lt;/td>
&lt;td>传输数据保密性（4.8.2）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TLS / 双向认证&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>物理入侵者&lt;/td>
&lt;td>误操作&lt;/td>
&lt;td>横向移动&lt;/td>
&lt;td>-&lt;/td>
&lt;td>触发器等对象&lt;/td>
&lt;td>系统信息发现（T1082）&lt;/td>
&lt;td>可信路径（4.9）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>网络ACL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>离职/僵尸账号&lt;/td>
&lt;td>身份伪造&lt;/td>
&lt;td>数据收集&lt;/td>
&lt;td>-&lt;/td>
&lt;td>临时表空间&lt;/td>
&lt;td>通过API攻击（T1559）&lt;/td>
&lt;td>FIA / FDP / FAU / FMT / FCS / FPT&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SQL防火墙&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>自动化攻击工具&lt;/td>
&lt;td>会话劫持&lt;/td>
&lt;td>数据外传&lt;/td>
&lt;td>-&lt;/td>
&lt;td>Undo日志&lt;/td>
&lt;td>客户端连接劫持（T1184）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>行级安全（RLS）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>影响/破坏&lt;/td>
&lt;td>-&lt;/td>
&lt;td>控制文件&lt;/td>
&lt;td>创建账户（T1136）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>列级安全（CLS）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>监听器/端口&lt;/td>
&lt;td>数据从本地拉取（T1213）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据脱敏&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>SSL证书私钥&lt;/td>
&lt;td>禁用安全工具（T1562）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>密钥管理（KMS/HSM）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库参数&lt;/td>
&lt;td>受信关系利用（T1199）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>全密态执行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库进程内存&lt;/td>
&lt;td>反向工程（T1598）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>机密计算（TEE）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据快照&lt;/td>
&lt;td>数据加密（自身通讯）（T1573）&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据分类分级&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>数据库服务端口&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>配置基线检查&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="42-防御模型">4.2 防御模型&lt;/h2>
&lt;h3 id="一访问安全">一、访问安全&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>威胁ID&lt;/th>
&lt;th>威胁描述&lt;/th>
&lt;th>STRIDE&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>缓解的安全功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>T-ACS-01&lt;/td>
&lt;td>弱口令爆破或默认账户攻击&lt;/td>
&lt;td>S&lt;/td>
&lt;td>高&lt;/td>
&lt;td>身份认证（密码策略、账户锁定、MFA）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-02&lt;/td>
&lt;td>重放攻击（抓取认证报文后重放）&lt;/td>
&lt;td>S&lt;/td>
&lt;td>中&lt;/td>
&lt;td>身份认证（Challenge-Response、Kerberos时间戳）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-03&lt;/td>
&lt;td>从不可信IP或恶意主机连接&lt;/td>
&lt;td>S/D&lt;/td>
&lt;td>中&lt;/td>
&lt;td>网络ACL（IP白名单）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-04&lt;/td>
&lt;td>SQL注入攻击绕过权限检查&lt;/td>
&lt;td>E&lt;/td>
&lt;td>高&lt;/td>
&lt;td>SQL防火墙（SQL白名单）、最小权限原则&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-05&lt;/td>
&lt;td>内部人员滥用合法权限（如DBA偷看数据）&lt;/td>
&lt;td>I/E&lt;/td>
&lt;td>高&lt;/td>
&lt;td>访问控制（三权分立、行级安全）、数据脱敏&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-06&lt;/td>
&lt;td>权限过度授予导致横向越权&lt;/td>
&lt;td>E&lt;/td>
&lt;td>高&lt;/td>
&lt;td>访问控制（RBAC、最小权限）、权限分析工具&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-ACS-07&lt;/td>
&lt;td>用户否认执行了某项敏感操作&lt;/td>
&lt;td>R&lt;/td>
&lt;td>高&lt;/td>
&lt;td>安全审计（统一审计、细粒度审计）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="二传输安全">二、传输安全&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>威胁ID&lt;/th>
&lt;th>威胁描述&lt;/th>
&lt;th>STRIDE&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>缓解的安全功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>T-TRP-01&lt;/td>
&lt;td>网络嗅探窃听数据库通信&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>安全传输（TLS 1.3、国密TLCP）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-TRP-02&lt;/td>
&lt;td>中间人攻击（MITM）篡改或劫持会话&lt;/td>
&lt;td>T/S&lt;/td>
&lt;td>高&lt;/td>
&lt;td>安全传输（证书双向验证、防降级攻击）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-TRP-03&lt;/td>
&lt;td>会话劫持后模拟合法用户&lt;/td>
&lt;td>S&lt;/td>
&lt;td>高&lt;/td>
&lt;td>安全传输（会话加密、绑定认证）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="三计算安全">三、计算安全&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>威胁ID&lt;/th>
&lt;th>威胁描述&lt;/th>
&lt;th>STRIDE&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>缓解的安全功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>T-CPT-01&lt;/td>
&lt;td>数据库管理员或恶意进程在内存中读取敏感数据&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>全密态加密、机密计算（TEE）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-CPT-02&lt;/td>
&lt;td>通过侧信道攻击（如Cache时间）推断数据&lt;/td>
&lt;td>I&lt;/td>
&lt;td>中-高&lt;/td>
&lt;td>机密计算（恒定时间执行）、全密态加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-CPT-03&lt;/td>
&lt;td>SQL执行计划中泄露敏感值（如错误消息、执行计划）&lt;/td>
&lt;td>I&lt;/td>
&lt;td>中&lt;/td>
&lt;td>数据脱敏（返回结果遮盖）、错误消息泛化&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-CPT-04&lt;/td>
&lt;td>攻击者调用加密函数进行暴力破解或穷举&lt;/td>
&lt;td>I/D&lt;/td>
&lt;td>中&lt;/td>
&lt;td>加密函数（密钥强度限制、防暴力调用策略）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-CPT-05&lt;/td>
&lt;td>云环境下虚拟机管理器直接读取数据库进程内存&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>机密计算（TEE内执行、加密内存）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-CPT-06&lt;/td>
&lt;td>已授权用户通过脱敏绕过机制看到原始数据&lt;/td>
&lt;td>I&lt;/td>
&lt;td>中&lt;/td>
&lt;td>数据脱敏（权限校验、防绕过）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="四存储安全">四、存储安全&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>威胁ID&lt;/th>
&lt;th>威胁描述&lt;/th>
&lt;th>STRIDE&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>缓解的安全功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>T-STR-01&lt;/td>
&lt;td>攻击者窃取磁盘或备份介质，绕过数据库直接读取数据文件&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>透明加密（TDE）、备份加密&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-STR-02&lt;/td>
&lt;td>攻击者或恶意OS篡改数据文件中的数据块&lt;/td>
&lt;td>T&lt;/td>
&lt;td>高&lt;/td>
&lt;td>数据防篡改（哈希链、账本表）、块级校验&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-STR-03&lt;/td>
&lt;td>未授权用户通过文件系统直接拷贝数据文件&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>透明加密（TDE）+ 文件权限保护&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-STR-04&lt;/td>
&lt;td>备份介质丢失导致数据泄露&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>透明加密（备份加密）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-STR-05&lt;/td>
&lt;td>密钥管理不当（硬编码、弱密钥、不轮换）导致加密失效&lt;/td>
&lt;td>I/T&lt;/td>
&lt;td>高&lt;/td>
&lt;td>密钥管理（KMS、HSM、自动轮换）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-STR-06&lt;/td>
&lt;td>敏感数据未被识别（未分类分级）导致保护缺失&lt;/td>
&lt;td>I&lt;/td>
&lt;td>高&lt;/td>
&lt;td>数据发现（自动扫描、分类分级）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="五合法合规">五、合法合规&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>威胁ID&lt;/th>
&lt;th>威胁描述&lt;/th>
&lt;th>STRIDE&lt;/th>
&lt;th>风险等级&lt;/th>
&lt;th>缓解的安全功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>T-AUD-01&lt;/td>
&lt;td>攻击者或恶意管理员删除/篡改审计日志以掩盖痕迹&lt;/td>
&lt;td>T/R&lt;/td>
&lt;td>高&lt;/td>
&lt;td>审计日志防篡改（只写一次、WORM存储、加密）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-AUD-02&lt;/td>
&lt;td>审计日志被未授权读取（泄露用户行为）&lt;/td>
&lt;td>I&lt;/td>
&lt;td>中&lt;/td>
&lt;td>审计日志加密存储、访问控制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-AUD-03&lt;/td>
&lt;td>审计数据量过大导致性能下降或日志溢出&lt;/td>
&lt;td>D&lt;/td>
&lt;td>中&lt;/td>
&lt;td>统一审计（条件审计、采样审计）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>T-AUD-04&lt;/td>
&lt;td>合规性检查时无法证明对敏感数据的控制措施&lt;/td>
&lt;td>R&lt;/td>
&lt;td>高&lt;/td>
&lt;td>合规对标（等保、ISO、GDPR）、审计记录完整性&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="43-安全功能">4.3 安全功能&lt;/h2>
&lt;h3 id="一访问安全-1">一、访问安全&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">身份认证、访问控制（自主访问控制、强制访问控制、角色访问控制（三权分立）、行级访问控制）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="二传输安全-1">二、传输安全&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">SSL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="三计算安全-1">三、计算安全&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">加密函数、全密态、机密计算、动态脱敏
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="四存储安全-1">四、存储安全&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">透明加密、防篡改
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="五合法合规-1">五、合法合规&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">安全审计、密钥管理
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一、接入安全&lt;br>
1. 网络防火墙&lt;br>
- 不可信IP登录&lt;br>
2. 身份认证&lt;br>
暴力破解&lt;br>
凭证重放&lt;br>
默认账户攻击&lt;br>
过期账号攻击&lt;br>
弱口令攻击&lt;br>
内存凭证残留&lt;br>
认证耗尽&lt;br>
密码泄露&lt;br>
二、传输安全&lt;br>
3. 安全传输&lt;br>
数据泄露&lt;br>
流量伪造&lt;br>
流量重放&lt;br>
会话密钥泄露&lt;br>
证书伪造&lt;br>
身份伪造&lt;br>
三、访问安全&lt;br>
4. 访问控制&lt;br>
未授权访问&lt;br>
越权访问&lt;br>
权限提升&lt;br>
权限滥用&lt;br>
权限提升&lt;/p></description></item><item><title>海量 1 用例 oracle加密函数</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-testcase-oracle-crypto-func/</link><pubDate>Tue, 25 Feb 2025 15:31:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-testcase-oracle-crypto-func/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto_2_text&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">search_path&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto_2_text&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/* ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * part 0: create some utils functions
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">utl_raw&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">cast_to_raw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rawdata&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">utl_raw&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">cast_to_varchar2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rawdata&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- get data type name
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oidgettype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">typeoid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">OID&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURNS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typeoid&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LANGUAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">plpgsql&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oidgettype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">typeoids&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">OIDVECTOR&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURNS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DECLARE&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">result&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;{}&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">typoid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">OID&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">typename&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">FOREACH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typoid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">ARRAY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typeoids&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOOP&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typename&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_type&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">typoid&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">result&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">array_append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">result&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">COALESCE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">typename&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;Unknown OID&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOOP&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">result&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LANGUAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">plpgsql&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- find all functions from dbms_obfuscation_toolkit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VIEW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allfuncs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">proname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">pronargs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">oidgettype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prorettype&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">output&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">oidgettype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proargtypes&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">input&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_proc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pronamespace&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_namespace&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">nspname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dbms_obfuscation_toolkit&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/* ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * part 1: install pgcrypt with different versions
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- available version
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_available_extension_versions&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2.0 (default version)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allfuncs&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1.2 (old version)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VERSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1.2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allfuncs&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2.0 --&amp;gt; 1.2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1.2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allfuncs&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1.2 --&amp;gt; 2.0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VERSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1.2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;2.0&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_extension&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allfuncs&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/* ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * part 2: core functions
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 desencrypt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111111111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 desdecrypt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desdecrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;655EA628CF62585F&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desdecrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;655EA628CF62585F20D3B8A6E657876B&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 des3encrypt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111111111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 des3decrypt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;0D28E17571051319&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;0D28E17571051319ACCE2D19D9AED5C8&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 des3encrypt -- without iv
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111111111111&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 6 des3decrypt -- without iv
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;7934131269E334A2&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;7934131269E334A2BCC64878CC5A075A&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111122222222&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/* ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * part 3: different args
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 des
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different plain
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">14&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">34&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">38&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">38&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">14&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">34&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">35&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">36&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">38&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desdecrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 3des
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different plain
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">14&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different keymod
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">34&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">35&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">36&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">51&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">52&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">53&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">54&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">55&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">56&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">57&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">58&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">59&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;272727272727272727272727272&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">61&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">62&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">63&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">64&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">65&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">66&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">67&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">68&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">69&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;272727272727272727272727272&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- different iv
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">82&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">83&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">84&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;7777777&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">85&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;88888888&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">86&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;999999999&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">87&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17171717171717171&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">88&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">89&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1616161616161616&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;242424242424242422424242&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;272727272727272727272727272&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CIPHER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">13&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">14&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">34&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">35&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">36&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">51&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">52&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">53&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">54&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">55&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">56&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">57&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">58&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">59&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">61&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">62&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">63&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">66&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">67&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">68&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">69&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">82&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">83&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">84&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">85&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">86&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">87&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">88&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">89&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtostr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">keymod&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">iv&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tplain&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tcipher&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/* ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * part 4: other functions
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * ------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desgetkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3getkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3getkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">md5&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1111111111111111&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">deskey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key0&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">deskey&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate_series&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desgetkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key0&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate_series&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3getkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate_series&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">des3getkey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">strtoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">deskey&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key0&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cnt&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cnt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- test (need to spend too much time)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- CREATE TABLE moretime(id INT, key RAW);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO moretime SELECT generate_series(1, 100000),
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- dbms_obfuscation_toolkit.desgetkey(strtoraw(&amp;#39;11111111112222222222333333333344444444445555555555666666666677777777778888888888&amp;#39;));
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- -- 预期 key列重复的字符不多
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT * FROM moretime ORDER BY key ASC LIMIT 10;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT * FROM moretime ORDER BY key DESC LIMIT 10;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- DROP TABLE moretime;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">deskey&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">des3key1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">allcnt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RESET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">search_path&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgcrypto_2_text&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CASCADE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>海量 1 设计 oracle加密函数</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-design-oracle-crypto-func/</link><pubDate>Tue, 25 Feb 2025 09:49:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-design-oracle-crypto-func/</guid><description>&lt;h1 id="1">1&lt;/h1>
&lt;ol>
&lt;li>
&lt;p>设置默认版本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">contrib/pgcrypto/pgcrypto.control
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">defaultl_version&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;2.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">dbcompatibilities&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;A, B, PG&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>生成同名的sql文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">touch contrib/pgcrypto/pgcrypto-2.0.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>安装sql文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># pgcrypto.control与pgcrypt.*.sql文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ll &lt;span class="nv">$GAUSSHOME&lt;/span>/share/postgresql/extension &lt;span class="p">|&lt;/span> grep pgcrypto
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>加载插件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 执行：CREATE EXTENSION pgcrypto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateExtension&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_valild_extension_name&lt;/span> &lt;span class="c1"># 检查插件名：要求不含 &amp;#39;-&amp;#39;、不含&amp;#39;..&amp;#39;等路径字符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_extension_oid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pg_extension&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">systable_beginscan&lt;/span> &lt;span class="c1"># 遍历系统表 pg_extension：确保插件存在&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">read_extension_control_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parse_extension_control_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_extension_control_filename&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sprintf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{share}&lt;/span>&lt;span class="s2">/extension/&lt;/span>&lt;span class="si">{extension_name}&lt;/span>&lt;span class="s2">.control&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ParreConfigFp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 获取 directory, default_version, module_pathname, dbcompatibilities 等参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_extension_script_filename&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_extension_script_direcotry&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="s1">&amp;#39;pgcrypto&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sprintf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{script_dir}&lt;/span>&lt;span class="s2">/crypto-a.sql&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">read_extension_script_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InsertExtensionTuple&lt;/span> &lt;span class="c1"># 插入系统表 pg_extension&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">execute_extension_script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ApplyExtensionUpdates&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol></description></item><item><title>海量 1 需求 oracle加密函数</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-requirement-oracle-crypto-func/</link><pubDate>Wed, 19 Feb 2025 16:20:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/1-requirement-oracle-crypto-func/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>早期版本的oracle提供一个包含多个加密函数的包，用户可通过SQL语法调用加密函数，实现数据加密功能。本文主要介绍以下几点：&lt;/p>
&lt;ol>
&lt;li>oracle加密包的功能与使用方法&lt;/li>
&lt;li>vastbase实现oracle加密包&lt;/li>
&lt;li>vastbase加密包的功能与使用方法&lt;/li>
&lt;/ol>
&lt;p>本文档可指导开发者、测试者熟悉vastbase加密包特性的功能场景。&lt;/p>
&lt;p>本文档的内容已被上传至tapd，tapd上，排版更好看，测试用例更方便复制。建议直接从tapd上查看本文档原文： &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007194">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007194&lt;/a>&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>vastbase 3.0.8及之后版本。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>DES：Data Encryption Standard，数据加密标准，一种早期通用的加密算法&lt;/li>
&lt;li>3DES：Triple DES，基于DES演进的一种早期通用的加密算法&lt;/li>
&lt;li>MD5：Message-Digest Algorithm，一种早期通用的数据摘要算法&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>oracle dbms_obfuscation_toolkit 函数介绍：&lt;a href="https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm">https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm&lt;/a>&lt;/li>
&lt;li>oracle dbms_obfuscation_toolkit 函数参数：&lt;a href="https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm">https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm&lt;/a>&lt;/li>
&lt;li>tapd上，本需求文档： &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007194">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007194&lt;/a>&lt;/li>
&lt;li>tapd上，本需求的测试用例： &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007197">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007197&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-支持oracle加密插件dbms_obfuscation_toolkit">2 支持oracle加密插件dbms_obfuscation_toolkit&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;p>早期版本oracle提供7个内置加密函数。早在4年或更早之前的旧版本vastbase中，也提供7个与oracle一致的加密函数，这7个函数，函数名、函数入参与oracle一致，但是，6个函数输出、15个函数参数约束与oracle不一致，本特性将重构这些加密函数，确保函数的输出、约束等与oracle一致。&lt;/p>
&lt;h3 id="一基础知识">一、基础知识&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>加密的原理&lt;br>
加密算法有很多种，不同场景中，适合的加密算法类型不同。对存储数据加密，通常采用对称密码算法，此处主要介绍对称密码算法：&lt;/p>
&lt;ul>
&lt;li>加密原理：输入1个明文，输入1个密钥，对明文和密钥进行一些可逆的运算（比如异或，代换），可得到1个密文。密钥通常是随机生成的&lt;/li>
&lt;li>加密算法：DES算法，发布于1977年，已确定为不安全加密算法。3DES算法，调用3次DES算法，生成3个密钥，安全性与DES差别不大，也属于不安全的加密算法。AES算法，发布于2001年，通用的国际标准，替代不安全的DES算法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>数据库加密函数&lt;br>
几乎所有数据库，都提供内置加密函数，让用户通过SQL语句调用。最典型的场景如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 假设，数据库提供函数encrypt(明文，密钥，加密算法)，输出为密文
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 用户想表&amp;#39;t1&amp;#39;中存储数据&amp;#39;shenkun&amp;#39;，则存储的语法如下：（用户自己保管密钥）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;shenkun&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;一串随机的密钥&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aes&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="二oracle加密包">二、Oracle加密包&lt;/h3>
&lt;p>早期版本的oracle中，包含1个名为dbms_obfuscation_toolkit的包，提供7个函数，主要实现加密、解密等功能：&lt;/p>
&lt;ul>
&lt;li>版本信息：oracle 8i版本开始提供，oracle 10g版本开始不被推荐使用，由dbms_crypto代替，oracle 21c版本正式移除&lt;/li>
&lt;li>函数列表：
&lt;ul>
&lt;li>生成随机数：desgetkey(seed) -&amp;gt; key&lt;/li>
&lt;li>加密：desencrypt(input, key) -&amp;gt; encrypted_data&lt;/li>
&lt;li>解密：descdecrypt(input, key) -&amp;gt; decrypted_data&lt;/li>
&lt;li>生成随机数：des3getkey(which=&amp;gt;0, seed) -&amp;gt; key&lt;/li>
&lt;li>加密：des3encrypt(input, key, which=&amp;gt;0, iv=&amp;gt;012345678abcdef) -&amp;gt; encrypted_data&lt;/li>
&lt;li>解密：des3decrypt(input, key, which=&amp;gt;0, iv=&amp;gt;012345678abcdef) -&amp;gt; decrypted_data&lt;/li>
&lt;li>哈希：md5(input) -&amp;gt; checksum&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>函数参数：函数参数有2种数据类型：varchar2, raw。与raw类型相比，如果是varchar2类型，参数名需加上_string后缀。比如，raw类型的入参名为input，则varcha2类型入参名为input_string&lt;/li>
&lt;li>函数限制：
&lt;ul>
&lt;li>desgetkey：seed长度最短为80字节&lt;/li>
&lt;li>desencrypt：input长度是8字节的整数倍；key最短为8字节，超过8字节的部分被丢弃&lt;/li>
&lt;li>descdecrypt：input长度是8字节的整数倍；key最短为8字节，超过8字节的部分被丢弃&lt;/li>
&lt;li>des3getkey: seed长度最短为80字节&lt;/li>
&lt;li>des3encrypt：input长度是8字节的整数倍；which为0时，key最短为16字节，超过16字节的部分被丢弃；which为1时，key最短为24字节，超过24字节的部分被丢弃&lt;/li>
&lt;li>des3dencrypt：input长度是8字节的整数倍；which为0时，key最短为16字节，超过16字节的部分被丢弃；which为1时，key最短为24字节，超过24字节的部分被丢弃&lt;/li>
&lt;li>md5：无&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>参考文档
&lt;ul>
&lt;li>函数介绍：函数背景、注意事项等：&lt;a href="https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm">https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm&lt;/a>&lt;/li>
&lt;li>函数参数：参数类型、调用示例等：&lt;a href="https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm">https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下是上述函数的调用示例：&lt;/p></description></item><item><title>数据结构与算法 1 总结</title><link>https://my-blog.j8465383071.workers.dev/posts/algorithm/1-summary/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/algorithm/1-summary/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-%E6%A6%82%E8%BF%B0">1 概述&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84">1.1 数据结构&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%95%B0%E7%BB%84">数组&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%93%BE%E8%A1%A8">链表&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E5%8F%89%E6%A0%91">二叉树&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%A0%91">树&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%A0%88">栈&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%98%9F%E5%88%97">队列&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%9B%BE">图&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#1-2-%E7%AE%97%E6%B3%95">1.2 算法&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%97%AE%E9%A2%98">问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E8%A7%A3%E6%B3%95">1.2 解法&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E6%95%B0%E7%BB%84">2 数组&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E6%89%80%E6%9C%890%E7%A7%BB%E5%8A%A8%E5%88%B0%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%AB%E5%B0%BE">2.1 所有0移动到数组的末尾&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E7%A7%BB%E9%99%A4%E6%95%B0%E7%BB%84%E6%8C%87%E5%AE%9A%E5%85%83%E7%B4%A0">2.2 移除数组指定元素&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E7%A7%BB%E9%99%A4%E6%95%B0%E7%BB%84%E9%87%8D%E5%A4%8D%E5%85%83%E7%B4%A0">2.3 移除数组重复元素&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E7%A7%BB%E9%99%A4%E6%95%B0%E7%BB%84%E6%95%B0%E9%87%8F%E5%A4%A7%E4%BA%8E2%E7%9A%84%E5%85%83%E7%B4%A0">2.4 移除数组数量大于2的元素&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-5-%E6%95%B0%E7%BB%84%E9%87%8D%E5%A4%8D%E5%85%83%E7%B4%A0%E6%8E%92%E5%BA%8F">2.5 数组重复元素排序&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-6-%E7%AC%ACK%E4%B8%AA%E6%9C%80%E5%A4%A7%E6%95%B0">2.6 第K个最大数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-7-%E6%9C%80%E5%A4%A7%E7%9A%84K%E4%B8%AA%E6%95%B0">2.7 最大的K个数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-8-%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C">2.8 两数之和&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83">参考&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-数据结构">1.1 数据结构&lt;/h2>
&lt;h3 id="数组">数组&lt;/h3>
&lt;ul>
&lt;li>排序&lt;/li>
&lt;li>滑动窗口&lt;/li>
&lt;li>去重&lt;/li>
&lt;li>碰撞指针：回文串&lt;/li>
&lt;/ul>
&lt;h3 id="链表">链表&lt;/h3>
&lt;ul>
&lt;li>反转链表&lt;/li>
&lt;/ul>
&lt;h3 id="二叉树">二叉树&lt;/h3>
&lt;ul>
&lt;li>递归&lt;/li>
&lt;/ul>
&lt;h3 id="树">树&lt;/h3>
&lt;ul>
&lt;li>b树：一个节点存多个值
&lt;ul>
&lt;li>降低树高度，结和IO机制，降低IO次数&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>b+树：只有叶子节点存数据
&lt;ul>
&lt;li>高效：中间节点不存数据，可存更多节点&lt;/li>
&lt;li>稳定：查找次数一致&lt;/li>
&lt;li>有序：叶子节点组成链表，方便批量查询&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>b-link树：节点指向右兄弟；每个节点存储High-key
&lt;ul>
&lt;li>并发：根据High-key，并发场景下，可判断节点是否发生分裂，无需加锁&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="栈">栈&lt;/h3>
&lt;h3 id="队列">队列&lt;/h3>
&lt;h3 id="图">图&lt;/h3>
&lt;h2 id="12-算法">1.2 算法&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>动态规划&lt;/p>
&lt;ul>
&lt;li>功能：用表记录所有结果，避免重复计算（斐波那契、最长公共子序列）&lt;/li>
&lt;li>
&lt;h2 id="问题">问题&lt;/h2>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>回溯：枚举 + 剪枝&lt;/p>
&lt;/li>
&lt;li>
&lt;p>分治&lt;/p>
&lt;/li>
&lt;li>
&lt;p>贪心&lt;/p></description></item><item><title>PostgreSQL 1-1 源码安装 (linux / macos)</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-1-install-postgresql/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-1-install-postgresql/</guid><description>&lt;p>&lt;strong>摘要&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>本文介绍介绍如何在2种个人PC中，使用源码安装PostgreSQL，包括：&lt;/p>
&lt;ul>
&lt;li>在Windows操作系统中，如何基于VwWare虚拟机，搭建Linux环境。并在Linux中，通过postgreSQL源码进行编译安装。&lt;/li>
&lt;li>在MacOS操作系统中，如何使用云服务器中的Linux操作系统，搭建postgreSQL源码编译与学习环境。&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>&lt;strong>目录&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-%E5%9C%A8Windows%E4%B8%AD%E5%AE%89%E8%A3%85PostgreSQL">1 在Windows中安装PostgreSQL&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E7%9B%AE%E7%9A%84">1.1 目的&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E5%87%86%E5%A4%87">1.2 准备&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E7%BC%96%E8%AF%91%E6%BA%90%E7%A0%81">1.3 编译源码&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-%E9%85%8D%E7%BD%AE%E5%BF%AB%E6%8D%B7%E5%91%BD%E4%BB%A4">1.4 配置快捷命令&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E5%9C%A8MacOS%E4%B8%AD%E5%AE%89%E8%A3%85PostgreSQL">2 在MacOS中安装PostgreSQL&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E9%97%AE%E9%A2%98">2.1 问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E8%B0%83%E7%A0%94%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%95%86">2.2 调研云服务商&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E9%80%89%E6%8B%A9%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8">2.3 选择云服务器&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E9%85%8D%E7%BD%AE%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8">2.4 配置云服务器&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-5-%E4%B8%8B%E8%BD%BDpostgreSQL%E6%BA%90%E7%A0%81">2.5 下载postgreSQL源码&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h1 id="1-在windows中安装postgresql">1 在Windows中安装PostgreSQL&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>通过postgreSQL源码进行编译安装，主要目的是：&lt;/p>
&lt;ol>
&lt;li>方便通过源码调试跟踪&lt;/li>
&lt;li>直接修改以增加调试信息或新功能&lt;/li>
&lt;/ol>
&lt;h2 id="12-准备">1.2 准备&lt;/h2>
&lt;p>首先，介绍如何准备centOS虚拟机，并安装git、VSCode、gdb等工具&lt;/p>
&lt;ol>
&lt;li>
&lt;p>已有windows 10/11 x86物理机&lt;/p>
&lt;/li>
&lt;li>
&lt;p>window 10中，安装vmware&lt;/p>
&lt;/li>
&lt;li>
&lt;p>vmware中，安装centOS虚拟机&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="http://mirrors.huaweicloud.com/centos/8.4.2105/isos/x86_64/">http://mirrors.huaweicloud.com/centos/8.4.2105/isos/x86_64/&lt;/a>&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>centOS中，安装git，以及中文输入法&lt;/p>
&lt;/li>
&lt;li>
&lt;p>centOS中，安装VSCode&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions">https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions&lt;/a>&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>centOS中，安装PostgresSQL依赖的第三方开源软件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y readline readline-devel openssl openssl-devel zlib zlib-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 但是，部分linux可能会裁剪应用，因此可能需要安装如下软件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum install -y bison bison-devel flex flex-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#[参考](https://blog.csdn.net/Linjingke32/article/details/80393576)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>安装调试工具&lt;/p></description></item><item><title>传统安全 1 密码学</title><link>https://my-blog.j8465383071.workers.dev/posts/security/1-1-cryptography/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/1-1-cryptography/</guid><description>&lt;h1 id="1-密码学综述">1 密码学综述&lt;/h1>
&lt;p>本文主要总结常见的密码算法与协议，并不详细介绍原理&lt;/p>
&lt;ul>
&lt;li>密码算法
&lt;ul>
&lt;li>对称密码算法&lt;/li>
&lt;li>非对称密码算法&lt;/li>
&lt;li>哈希算法&lt;/li>
&lt;li>完整性校验算法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>其他算法
&lt;ul>
&lt;li>随机数生成算法&lt;/li>
&lt;li>密钥派生算法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h1 id="2-密码算法">2 密码算法&lt;/h1>
&lt;h2 id="21-对称加密算法">2.1 对称加密算法&lt;/h2>
&lt;p>对称加密算法的基本原理是，输入明文、密钥，对明文进行分组，对每组明文进行多轮线性、非线性运算，比如异或、代换等，得到密文。&lt;br>
常见的对称加密算法如下：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>算法&lt;/th>
&lt;th>发布时间&lt;/th>
&lt;th>分组长度&lt;/th>
&lt;th>密钥长度&lt;/th>
&lt;th>算法&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DES&lt;/td>
&lt;td>1977&lt;/td>
&lt;td>64&lt;/td>
&lt;td>64&lt;/td>
&lt;td>16 x 置换（E扩展、异或、代换、P置换）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3DES&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>IDEA&lt;/td>
&lt;td>1990&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AES&lt;/td>
&lt;td>2001&lt;/td>
&lt;td>128&lt;/td>
&lt;td>128/192/256&lt;/td>
&lt;td>10/12/14 x 矩阵运算(字节代换、行移位、列混合、异或)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SM4&lt;/td>
&lt;td>2012&lt;/td>
&lt;td>128&lt;/td>
&lt;td>128&lt;/td>
&lt;td>32 x 分组运算（异或、代换、移位）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SM1&lt;/td>
&lt;td>-&lt;/td>
&lt;td>128&lt;/td>
&lt;td>128&lt;/td>
&lt;td>未公开&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SM7&lt;/td>
&lt;td>-&lt;/td>
&lt;td>128&lt;/td>
&lt;td>128&lt;/td>
&lt;td>未公开&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>在实现加密的过程中，还有几个基础知识：&lt;/p>
&lt;ul>
&lt;li>密钥扩展：加密时，会迭代很多轮，每一轮都用1个轮密钥。1个原始密钥，扩展为多个的轮密钥。&lt;/li>
&lt;li>加密模式：一个原始明文，分为多个明文组，组与组之间的组合方式如下：
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>模式&lt;/th>
&lt;th>中文&lt;/th>
&lt;th>描述&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>ECB&lt;/td>
&lt;td>电子密码本&lt;/td>
&lt;td>不同的明文块，用相同的密钥&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CBC&lt;/td>
&lt;td>密码分组链接&lt;/td>
&lt;td>上1密文块，与下一明文块异或&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CTR&lt;/td>
&lt;td>计数器模式&lt;/td>
&lt;td>密钥加密计数器生成密钥流，密文块与密钥流异或&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CFB&lt;/td>
&lt;td>密码反馈模式&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OFB&lt;/td>
&lt;td>输出反馈模式&lt;/td>
&lt;td>与CFB类似&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;/ul>
&lt;p>常见算法的具体实现原理如下：&lt;/p></description></item><item><title>PostgreSQL 1-2 进程架构</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-2-postgresql-struct/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-2-postgresql-struct/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-%E8%BF%9B%E7%A8%8B%E6%9E%B6%E6%9E%84">1 进程架构&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E8%BF%9B%E7%A8%8B%E6%9E%B6%E6%9E%84">1.1 进程架构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8">1.2 进程启动&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1">1.3 进程通信&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E8%BF%9B%E7%A8%8B%E5%8A%9F%E8%83%BD">2 进程功能&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-postgres%E7%BA%BF%E7%A8%8B">2.1 postgres线程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-2-1-postmaster%E8%BF%9B%E7%A8%8B">1.2.1 postmaster进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-2-postgres%E8%BF%9B%E7%A8%8B">1.2.2 postgres进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-3-wal-writer%E8%BF%9B%E7%A8%8B">1.2.3 wal writer进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-4-background-writer%E8%BF%9B%E7%A8%8B">1.2.4 background writer进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-5-checkpointer%E8%BF%9B%E7%A8%8B">1.2.5 checkpointer进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-6-autovacuum%E8%BF%9B%E7%A8%8B">1.2.6 autovacuum进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-7-statistics-collector%E8%BF%9B%E7%A8%8B">1.2.7 statistics collector进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-8-archiver%E8%BF%9B%E7%A8%8B">1.2.8 archiver进程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-9-logging-collertor%E8%BF%9B%E7%A8%8B">1.2.9 logging collertor进程&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#1-3-%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1-1">1.3 进程通信&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E8%BF%9B%E7%A8%8B%E6%8E%A7%E5%88%B6">3 进程控制&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-进程架构">1 进程架构&lt;/h1>
&lt;h2 id="11-进程架构">1.1 进程架构&lt;/h2>
&lt;p>postgresql 采用1+n+7的进程架构，包括：&lt;/p>
&lt;ul>
&lt;li>1个postmaster进程&lt;/li>
&lt;li>n个postgres进程&lt;/li>
&lt;li>7个辅助进程：包括：
&lt;ol>
&lt;li>bg writer进程：&lt;/li>
&lt;li>checkpointer进程：&lt;/li>
&lt;li>walwriter进程：&lt;/li>
&lt;li>autovacuum进程：&lt;/li>
&lt;li>archiver进程：&lt;/li>
&lt;li>statistics collector进程：&lt;/li>
&lt;li>log collectoer进程：&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;p>进程架构图如下图所示：&lt;/p>
&lt;p>&lt;img alt="pg-all-process" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/1-2-postgresql-struct/pg-all-process.png">&lt;/p>
&lt;h2 id="12-进程启动">1.2 进程启动&lt;/h2>
&lt;p>先启动postmaster进程，再由poastermaster启动n+7进程。&lt;br>
在postmaster主函数中，进程启动顺序如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [主进程] 启动postmaster进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostmasterMain&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqsignal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SIGUSR1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sigusr1_handler&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1"># 注册信号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SysLogger_Start&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程7] 启动log collector进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartupDataBase&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">StartupProcessMain&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 进行故障恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SysLogger_Start&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程n] 启动posters进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartCheckpointer&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">CheckpointerMain&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程2] 启动heckpointer进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartBackgroundWriter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">BackgroundWriterMain&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程1] 启动bg writer进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartWalWriter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">InitXLOGAccess&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="n">WalWriterMain&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程3] 启动walwriter进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartAutoVacLauncher&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程4] 启动autovacuum进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pgstat_start&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程6] 启动 statistics collector进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pgarch_start&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># [进程5] 启动归档进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">maybe_start_bgworker&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-进程通信">1.3 进程通信&lt;/h2>
&lt;h1 id="2-进程功能">2 进程功能&lt;/h1>
&lt;p>本章介绍各进程的主要功能。&lt;/p></description></item><item><title>PostgreSQL 1-3 执行模块</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-3-execute/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-3-execute/</guid><description>&lt;h1 id="1-整体流程">1 整体流程&lt;/h1>
&lt;h2 id="11-执行流程">1.1 执行流程&lt;/h2>
&lt;ol>
&lt;li>应用-&amp;gt;驱动：通过驱动的api建立连接，并执行SQL语句&lt;/li>
&lt;li>驱动-&amp;gt;服务端：通过libpq协议封装SQL语句，发送至服务端&lt;/li>
&lt;li>服务端 postgres线程：接收SQL语句，调用exec_siple_query()开始处理SQL语句&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>SQL引擎&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>解析器：通过flex进行词法解析，通过yacc进行语法分析，生成解析树&lt;/li>
&lt;li>分析器：对解析树进行语义分析：包括检查表是否存在等，生成查询树&lt;/li>
&lt;li>重写器：&lt;/li>
&lt;li>计划期：根据查询树生成执行计划&lt;/li>
&lt;li>执行器：自顶向下执行各个算子，执行过程中会调用存储引擎统一接口
&lt;ul>
&lt;li>
&lt;p>INSERT / UPDATE / DELETE&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ExecModifyTable&lt;/span> &lt;span class="err">算子：&lt;/span>&lt;span class="n">EexecInsert&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">ExecUpdate&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">ExecDelete&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EexecInsert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecMaterializeSlot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecBRInsertTriggers&lt;/span> &lt;span class="cm">/* ROW INSERT 触发器 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecWithCheckOptions&lt;/span> &lt;span class="cm">/* 检查约束 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_insert&lt;/span> &lt;span class="cm">/* 存储引擎统一接口 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInsertIndexTuples&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecARInsertTriggers&lt;/span> &lt;span class="cm">/* AFTER ROW 触发器 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecProcessReturning&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>SELECT&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ExecIndexScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">IndexNext&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">index_getnext&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">index_getnext_tid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scan&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">index_fetch_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scan&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_hot_search_buffer&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageGetItem&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></description></item><item><title>传统安全 3 网络安全</title><link>https://my-blog.j8465383071.workers.dev/posts/security/1-3-network-attack/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/1-3-network-attack/</guid><description>&lt;h4 id="网络欺骗---50">网络欺骗 - 50%&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>概述：局域网内，结合数据传播特点，伪造数据，欺骗机器网卡&lt;/p>
&lt;/li>
&lt;li>
&lt;p>模型：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>主机：维护ARP缓存，内容为 [IP:MAC]&lt;/p>
&lt;/li>
&lt;li>
&lt;p>协议：ARP：Address Resolution Protol：根据IP获取MAC&lt;/p>
&lt;/li>
&lt;li>
&lt;p>主机网卡：&lt;/p>
&lt;ul>
&lt;li>网卡工作模式：
&lt;ul>
&lt;li>混杂：接收所有数据&lt;/li>
&lt;li>广播：接收dest_addr为广播地址的数据&lt;/li>
&lt;li>多播：接收dest_addr为多播地址的数据&lt;/li>
&lt;li>单播：接收dest_addr为本机地址的数据&lt;/li>
&lt;li>链路层：需要MAC地址&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>交换机&lt;/p>
&lt;ul>
&lt;li>分类：二层、三层、四层交换机&lt;/li>
&lt;li>二层交换机：根据MAC，找到端口，发送数据，维护MAC缓存，内容为 [MAC:端口]&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>示意图&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> 帧&lt;span class="o">[&lt;/span>mac&lt;span class="o">][&lt;/span>ip&lt;span class="o">]&lt;/span> 帧&lt;span class="o">[&lt;/span>mac&lt;span class="o">][&lt;/span>ip&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>主机1&lt;span class="o">]&lt;/span> -----------&amp;gt; &lt;span class="o">[&lt;/span>交换机&lt;span class="o">]&lt;/span> -------------&amp;gt; &lt;span class="o">[&lt;/span>主机2&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> IP &lt;span class="p">|&lt;/span> MAC &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> 端口 &lt;span class="p">|&lt;/span> MAC &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> IP &lt;span class="p">|&lt;/span> MAC &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> 端口 &lt;span class="p">|&lt;/span> MAC &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>攻击方式：&lt;/p>
&lt;ul>
&lt;li>1 攻击机：发送大量 虚假MAC 的帧，占满交换机缓存，让交换机广播数据&lt;/li>
&lt;li>2 攻击机：发送虚假的ARP：欺骗局域网内的主机&lt;/li>
&lt;li>3 受害机：把数据发到错误的地方，比如攻击机&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>解决：&lt;/p>
&lt;ul>
&lt;li>预防：主机静态ARP表、进制ARP&lt;/li>
&lt;li>检测：看某台主机的ARP缓存，判断是否有主机发送大量ARP包&lt;/li>
&lt;li>检测：看无通信主机的ARP缓存，检测是否缓存了ARP包&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="信息收集---ok">信息收集 - ok&lt;/h4>
&lt;ul>
&lt;li>概述：在进行攻击之前，收集受害者的信息&lt;/li>
&lt;li>攻击方式：
&lt;ul>
&lt;li>主机状态
&lt;ol>
&lt;li>ICMP Echo攻击：发送ICMP Echo包，如果回复，则主机开启&lt;/li>
&lt;li>Non-Echo ICMP：发送其他类型的ICMP包，如果回复，则主机开启&lt;/li>
&lt;li>IP异常包头：发送异常IP包（无效字段、错误分片、静止分片），判断主机返回信息&lt;/li>
&lt;li>TCP扫描&lt;/li>
&lt;li>UDP扫描&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>操作系统版本
&lt;ol>
&lt;li>被动栈指纹识别：嗅探，收集网络中数据包，判断IP的TTL、TOS、DF和TCP 的Windows-size等特征&lt;/li>
&lt;li>主动栈指纹识别：TCP三次握手，ACK序号相等还是加一&lt;/li>
&lt;li>TCP ISN取样：向目标主机多次握手，多次取样返回的ISN&lt;/li>
&lt;li>ICMP包错误信息发送速率：向目标主机连续发送大量icmp错误包&lt;/li>
&lt;li>ICP消息引用：向目标主机发送ICMP错误包，判断返回的错误引用长度&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>端口
&lt;ol>
&lt;li>TCP 连接（开放）：tcp三次握手后，tcp反向ident协议可查看：对方进程pid和角色&lt;/li>
&lt;li>TCP SYN（半开放）：发送tcp syn包，端口关闭：返回rst，开启：返回syn+ack&lt;/li>
&lt;li>TCP FIN（隐蔽）：发送fin包，关闭：返回rst，开启：无返回&lt;/li>
&lt;li>TCP Xmax（隐蔽）：发送fin、urg、push标记的包，关闭：返回rst，开启：返回&lt;/li>
&lt;li>TCP NULL （隐蔽）：发送关闭无标记包&lt;/li>
&lt;li>FTP PROXY （隐藏）：请求ftp服务向目标主机建立连接&lt;/li>
&lt;li>UDP：发送UDP包，关闭：ICMP port unreachable，开启：无返回&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>软件版本&lt;/li>
&lt;li>漏洞
&lt;ol>
&lt;li>操作系统漏洞：基于漏洞库，扫描CGI漏洞、POP3漏洞、FTP漏洞、SSH漏洞等&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="拒绝服务---ok">拒绝服务 - ok&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>概述：合法用户无法访问服务&lt;/p></description></item><item><title>PostgreSQL 1-4 存储模块</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-4-storage/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-4-storage/</guid><description>&lt;h1 id="摘要">摘要&lt;/h1>
&lt;blockquote>
&lt;p>本博客以循序渐进的方式，依次简要介绍PostgreSQL存储模块的各个子模块的基础功能，提及内容适合数据库内核初学者。本博客旨在介绍核心原理，以便于理解为首，部分内容可能不会100%准确与具体，针对每个提及的子模块，之后会分别单独写博客详细介绍&lt;/p>&lt;/blockquote>
&lt;h1 id="目录">目录&lt;/h1>
&lt;ol>
&lt;li>&lt;a href="#%E6%91%98%E8%A6%81">摘要&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-%E6%A6%82%E8%BF%B0">1 概述&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-PostgreSQL%E7%9A%84%E4%BD%BF%E7%94%A8%E6%B5%81%E7%A8%8B">1.1 PostgreSQL的使用流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-PostgreSQL%E7%9A%84%E5%9F%BA%E7%A1%80%E6%9E%B6%E6%9E%84">1.2 PostgreSQL的基础架构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-PostgreSQL%E7%9A%84%E5%8A%9F%E8%83%BD%E5%9C%BA%E6%99%AF">1.3 PostgreSQL的功能场景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-PostgreSQL%E5%AD%98%E5%82%A8%E6%A8%A1%E5%9D%97%E7%9A%84%E4%BB%8B%E7%BB%8D%E6%B5%81%E7%A8%8B">1.4 PostgreSQL存储模块的介绍流程&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%9D%97">2 执行模块&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-%E5%AD%98%E5%82%A8%E6%A8%A1%E5%9D%97">3 存储模块&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84">3.1 存储结构&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-data-directory">(1) data_directory&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-oid">(2) oid&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-data-file">(3) data-file&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-page">(4) page&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-tuple">(5) tuple&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-2-%E5%85%B3%E9%94%AE%E6%9C%BA%E5%88%B6">3.2 关键机制&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-mvcc">(1) mvcc&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-delete">(2) delete&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-3-%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B">3.3 执行流程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-input">(1) input&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-heapam">(2) heapam&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-trancation">(3) trancation&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-fsm">(4) fsm&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-buffer">(5) buffer&lt;/a>&lt;/li>
&lt;li>&lt;a href="#6-smgr">(6) smgr&lt;/a>&lt;/li>
&lt;li>&lt;a href="#7-vfd">(7) vfd&lt;/a>&lt;/li>
&lt;li>&lt;a href="#8-vm">(8) vm&lt;/a>&lt;/li>
&lt;li>&lt;a href="#9-wal">(9) wal&lt;/a>&lt;/li>
&lt;li>&lt;a href="#10-wal-buffer">(10) wal-buffer&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-4-%E5%85%B3%E9%94%AE%E8%BF%9B%E7%A8%8B">3.4 关键进程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-bgwriter">(1) bgwriter&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-walwriter">(2) walwriter&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-checkpointer">(3) checkpointer&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-walsender">(5) walsender&lt;/a>&lt;/li>
&lt;li>&lt;a href="#6-autovacuum">(6) autovacuum&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-5-%E5%85%B3%E9%94%AE%E6%B5%81%E7%A8%8B">3.5 关键流程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-heap-insert">(1) heap_insert&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-heap-delete">(2) heap_delete&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-heap-update">(3) heap_update&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-heap-scan">(4) heap_scan&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-6-%E8%BE%85%E5%8A%A9%E6%9C%BA%E5%88%B6">3.6 辅助机制&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-index">(1) index&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-recovery">(2) recovery&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-backup">(3) backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-toast">(4) toast&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-logical">(5) logical&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-postgresql的使用流程">1.1 PostgreSQL的使用流程&lt;/h2>
&lt;p>本博客仅讨论存储模块的关键原理。简而言之，PostgreSQL将数据合理地组织并存储在磁盘上，并向用户提供SQL接口，让其读写磁盘上的指定数据。以下是PostgreSQL简单工作流程：&lt;/p></description></item><item><title>传统安全 4 防火墙</title><link>https://my-blog.j8465383071.workers.dev/posts/security/1-4-firewall/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/1-4-firewall/</guid><description>&lt;h1 id="1-netfilter">1 netfilter&lt;/h1>
&lt;h2 id="11-netfilter-架构">1.1 netfilter 架构&lt;/h2>
&lt;h2 id="12-netfilter-编程">1.2 netfilter 编程&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">nf_hook_state&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">hook&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">thresh&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">u_int8_t&lt;/span> &lt;span class="n">pf&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">net_device&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">in&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">net_device&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">sock&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">sk&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">net&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">net&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">list_head&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">hook_list&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">okfn&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="nc">net&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">sock&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">sk_buff&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 回调函数 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="nf">nf_hookfn&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">priv&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">sk_buff&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">skb&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">nf_hook_state&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 回调函数返回值 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_DROP 0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_ACCEPT 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_STOLEN 2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_QUEUE 3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_REPEAT 4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define NF_STOP 5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 向内核注册回调函数 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">nf_hook_ops&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">list_head&lt;/span> &lt;span class="n">list&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 链表成员 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nf_hookfn&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">hook&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 回调函数 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">module&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">owner&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">pf&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 协议簇 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">hooknum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* NF_ARP_IN, NF_ARP_OUT */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">priority&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 优先级 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 协议簇 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_UNSPEC 0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_UNIX 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_LOCAL 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_INET 2 &lt;/span>&lt;span class="cm">/* IP */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_INET6 10 &lt;/span>&lt;span class="cm">/* IPV6 */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AF_LLC 26
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 注册 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">nf_register_hooks&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="nc">nf_hook_ops&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">ops_arr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">arr_len&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">module_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">arp_hook_init&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>参考：netfilter结构体：&lt;a href="https://www.cnblogs.com/ink-white/p/16818769.html">https://www.cnblogs.com/ink-white/p/16818769.html&lt;/a>&lt;/li>
&lt;li>参考：netfilter构造报文：&lt;a href="https://www.cnblogs.com/ink-white/p/16816464.html">https://www.cnblogs.com/ink-white/p/16816464.html&lt;/a>&lt;/li>
&lt;li>参考：netfilter捕获arp：&lt;a href="https://blog.csdn.net/fuyuande/article/details/79772134">https://blog.csdn.net/fuyuande/article/details/79772134&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-iptables">2 iptables&lt;/h1>
&lt;h2 id="21-iptables-命令">2.1 iptables 命令&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 查看所有规则&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables --list -n
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables --list -t &lt;span class="o">[&lt;/span>filter/mangle/nat/raw&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2 规则管理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables &lt;span class="o">[&lt;/span>操作&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>链名&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>动作&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>过滤条件&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 操作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -A : 新增规则，添加至末尾
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -I : 新增规则，添加到指定位置
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -D : 删除规则
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -R : 替换规则
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 链名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PREROUTING
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> INPUT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> OUTPT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> FORWARD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 动作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -j ACCEPT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -j DROP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -j REJECT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -j SNAT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 过滤条件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -s 0.0.0.0 : 源IP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -sport &lt;span class="m">100&lt;/span> : 源端口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -d 1.1.1.1 : 目标IP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -dport &lt;span class="m">100&lt;/span> : 目标端口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -p icmp/tcp/udp : 协议类型
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -p icmp --icmp-type &lt;span class="m">8&lt;/span> : ping
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -i etho : 数据接收网口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -o eth1 : 数据发送网口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -m 其他参数
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -m mac --mac-source 00:00:00:00:01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -m owner --uid-owner &lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -m owner --pid-owner &lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -m state --state &lt;span class="o">[&lt;/span>NEW, RELATED, ESTABLISHED, INVALID&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3 启动与停止 [ location: /etc/init.d/iptables ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4 批量操作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables -F &lt;span class="c1"># 清空规则&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables -X &lt;span class="c1"># 清空用户规则&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables -Z &lt;span class="c1"># 清空计数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5 保存规则 [ storage: /etc/sysconfig/iptables ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables save
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="3-kkwall">3 kkwall&lt;/h1>
&lt;h2 id="31-命令">3.1 命令&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 过滤&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.1 过滤ip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwall filter -sip 10.10.10.10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwall accept -dip 10.10.10.10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.2 过滤端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwall filter -sport &lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwall accept -dport &lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwall filter -dport all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.2 过滤协议&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwal filter -protol tcp/icmp/udp/igmp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3 入侵检测&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3.1 防 arp 欺骗&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 网关固定mac&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwal &lt;span class="nb">set&lt;/span> mac 0.0.0.0/00:00:00:00:01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 短时间内，大量arp报文&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3.2 端口扫描&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 设置端口白名单，如果报文目标端口在白名单外的端口，为异常报文&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kkwal &lt;span class="nb">set&lt;/span> ports 22,80
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检测所有tcp状态，识别所有syn和fin扫描&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3.3 拒绝服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 系统漏洞：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ping of death: 超长icmp包 63336， 分片发送 -&amp;gt; 丢弃&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># tear drop: 重复的IP分片 -&amp;gt; 丢弃&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 有限资源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># smurf: 短时间接收到大量icmp echo包 -&amp;gt; 全丢弃&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># tcp syn flood: 短时间，大量半开请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># tcp syn land: tcp src_addr和dst_addr都是自己&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># http flood: http请求&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">ArpHdr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">IpHdr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">TcpHdr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">type&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IpHdr&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">iphdr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">TcpHdr&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tcphdr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">Fragment&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">detecte_trick&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ArpHdr&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">arp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ArpItem&lt;/span> &lt;span class="n">staticarp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">arp_list_find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">arp&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">mac&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">arp&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">dst_ip&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="n">staticarp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;arp trick&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>参考：iptables常用命令 &lt;a href="https://blog.csdn.net/shiner_chen/article/details/132104300">https://blog.csdn.net/shiner_chen/article/details/132104300&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>PostgreSQL 1-5 initdb</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-5-initdb/</link><pubDate>Wed, 26 Feb 2025 18:14:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/1-5-initdb/</guid><description>&lt;h1 id="initdb-流程">initdb 流程&lt;/h1>
&lt;p>opengauss&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span> &lt;span class="c1"># initdb.cpp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">canonicalize_path&lt;/span> &lt;span class="c1"># PGDATA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">find_other_exec&lt;/span> &lt;span class="c1"># 在gs_initdb bin目录下，查找gaussdb bin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 在$GAUSSHOME/share/postgrsql目录下，检查以下文件是否存在&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;postgres.bki, postgres.description, pg_hba.conf.sample, postgresql.conf.sample, ..., system_views.sql, ...&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_locale_encoding&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">init_log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gs_getenv_r&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;GAUSSLOG&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">write_version_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">canonicalize_path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;$PGDATA/PG_VERSION&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fprintf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PG_MAJORVERSION&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;9.2&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">readfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;$GAUSSHOME/share/postgrsql/postgresql.conf.sample&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sprintf_s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;$PGDATA/postgresql.conf&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">writefile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;$PGDATA/postgresql.conf&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitUndoSubsystemMeta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bootstrap_template1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">write_version_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_auth&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_set_pwd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_depend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_plpgsql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_sysviews&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_description&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_privileges&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_schema&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">vacuum_db&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">make_template0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">make_postgres&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>传统安全 5 数据库加密</title><link>https://my-blog.j8465383071.workers.dev/posts/security/1-5-database-encryption/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/1-5-database-encryption/</guid><description>&lt;h1 id="1-数据库加密的背景">1 数据库加密的背景&lt;/h1>
&lt;h2 id="11-数据库安全机制">1.1 数据库安全机制&lt;/h2>
&lt;p>应用将数据发送给数据库后，数据库组织数据，将数据存储在文件中，并提供一系列安全机制，保护数据安全。比如：&lt;/p>
&lt;p>&lt;img alt="dbsec" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/1-5-database-encryption/dbsec.png">&lt;/p>
&lt;ul>
&lt;li>安全传输：基于TLS等安全协议，保证数据在应用与数据库之间传输的机密性、完整性等，避免攻击者对传输中的数据进行窃听、伪造、篡改等&lt;/li>
&lt;li>身份认证：基于IP、口令、证书等鉴别用户身份，避免攻击者非法访问数据库&lt;/li>
&lt;li>访问控制：通过多种访问控制机制，限制攻击者对数据库对象的的访问范围&lt;/li>
&lt;li>安全审计：记录攻击者在数据库中执行的各项操作&lt;/li>
&lt;li>数据脱敏：对隐私数据库进行脱敏处理，避免攻击者查看数据库中的隐私数据&lt;/li>
&lt;li>数据防篡改：基于区块链等技术，记录数据变化情况，识别攻击者非法篡改磁盘上的数据库文件&lt;/li>
&lt;/ul>
&lt;h2 id="12-数据泄露问题">1.2 数据泄露问题&lt;/h2>
&lt;p>在很多针对数据库的攻击行为中，攻击者可绕过上述数据库安全机制，直接从磁盘窃取数据，造成数据泄露问题。&lt;br>
为了规避此类问题，有效的方案是对数据进行加密，使攻击者仅能从磁盘获取数据密文，无法解密数据，从而解决数据泄露问题。&lt;/p>
&lt;h2 id="13-数据库加密方案分类">1.3 数据库加密方案分类&lt;/h2>
&lt;p>数据库加密方案较多，本博客仅介绍一些常见的，且适用于大部分场景的加密方案。&lt;/p>
&lt;h3 id="一按加密位置分类">一、按加密位置分类&lt;/h3>
&lt;p>首先，按加密位置分类，可分为以下6种：&lt;/p>
&lt;p>&lt;img alt="dbenc" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/1-5-database-encryption/dbenc.png">&lt;/p>
&lt;p>各方案的基本原理如下：&lt;/p>
&lt;ol>
&lt;li>应用加密：应用先将数据加密，再使用SQL语句，将数据密文存储至数据库&lt;/li>
&lt;li>全密态加密：数据库驱动识别并加密SQL语法中的数据，同时自动解密SQL查询结果。部分数据库产品提供此功能&lt;/li>
&lt;li>网关或代理加密：在应用与数据库之间的中继节点中，比如代理或网关中，通过解析网络流量，自动识别与加解密流量中的数据，包括SQL语法中的数据与SQL查询结果。很多云服务、安全厂商提供此服务&lt;/li>
&lt;li>加密函数：数据库内置加密函数或存储过程，应用可通过SQL语法主动调用加密函数。大部分数据库产品提供此功能&lt;/li>
&lt;li>透明加密：数据库将数据存储至磁盘前，自动加密数据，数据库从磁盘读取数据时，自动解密数据。大部分数据库产品提供此功能&lt;/li>
&lt;li>磁盘加密：操作系统处理磁盘读写请求时，自动加密与解密读写到的数据。部分操作系统或云存储服务提供此功能&lt;/li>
&lt;/ol>
&lt;h3 id="二按加密定义方式分类">二、按加密定义方式分类&lt;/h3>
&lt;p>上述加密方案中，按应用是否主动感知加密过程，可将其分为非自动加密与自动加密。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>非自动加密&lt;br>
以应用加密为例，用户加密数据的流程如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 首先，定义表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 假设需向t1中存储数据 (1, &amp;#39;data1&amp;#39;)，应用需要先将数据加密，在通过SQL语法将加密后的数据存储至数据库
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 3 存储数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;encrypted[1]&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;encrypted[data1]&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 查询数据时，查询结果为数据密文，数据无法直接使用
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 查询结果为：(&amp;#39;encrypted[1]&amp;#39;, &amp;#39;encrypted[data1]&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 5 应用需自行解密查询结果，最终解密后得到原始数据 (1, &amp;#39;data1&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此类加密方案中，每次涉及数据读写操作时，都需要主动进行加密与解密，操作复杂。&lt;/p></description></item><item><title>海量 2 博客 profile</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-blog-profile/</link><pubDate>Thu, 22 May 2025 10:00:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-blog-profile/</guid><description>&lt;blockquote>
&lt;p>摘要：本文主要分为3个章节：&lt;/p>
&lt;ol>
&lt;li>介绍Vastbase基于密码的身份认证机制，介绍密码相关配置参数，指出当前控制参数的局限性，提出PROFILE功能支持细粒度设置密码相关配置参数。&lt;/li>
&lt;li>介绍Vastbase的PROFILE功能如何使用，包括管理PROFILE功能、管理PROFILE参数、管理用户PROFILE&lt;/li>
&lt;li>介绍Vastbase身份认证流程与原理，介绍PROFILE功能的实现原理&lt;/li>
&lt;/ol>&lt;/blockquote>
&lt;p>&lt;strong>目录&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-PROFILE-%E5%8A%9F%E8%83%BD%E8%83%8C%E6%99%AF">1 PROFILE 功能背景&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9C%BA%E5%88%B6">1.1 身份认证机制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E9%85%8D%E7%BD%AE">1.2 身份认证配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E4%BC%98%E5%8C%96">1.3 身份认证优化&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-PROFILE-%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8">2 PROFILE 功能使用&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-PROFILE-%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B">2.1 PROFILE 简单示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E7%AE%A1%E7%90%86-PROFILE-%E5%8A%9F%E8%83%BD">2.2 管理 PROFILE 功能&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E7%AE%A1%E7%90%86-PROFILE-%E5%8F%82%E6%95%B0">2.3 管理 PROFILE 参数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E7%AE%A1%E7%90%86-%E7%94%A8%E6%88%B7-PROFILE">2.4 管理 用户 PROFILE&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-PROFILE-%E5%8A%9F%E8%83%BD%E5%8E%9F%E7%90%86">3 PROFILE 功能原理&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E5%85%83%E6%95%B0%E6%8D%AE">3.1 身份认证元数据&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%B5%81%E7%A8%8B">3.2 身份认证流程&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h1 id="1-profile-功能背景">1 PROFILE 功能背景&lt;/h1>
&lt;h2 id="11-身份认证机制">1.1 身份认证机制&lt;/h2>
&lt;p>Vastbase身份认证模块，主要采用基于密码的认证机制，常用的密码操作包括：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>创建密码&lt;br>
创建新用户时，需指定密码。语法示例如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vastbase接收密码后，计算密码的哈希值，并将密码哈希值、密码创建时间等存储至系统表中。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>使用密码&lt;br>
用户连接Vastbase时，需提供密码，使用vsql连接的命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="k">host&lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="n">port&lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vastbase&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vastbase会与vsql进行身份认证交互，基于存储的密码哈希值，校验密码是否正确。同时，Vastbase还会进行其他检查，比如：密码是否过期、密码错误次数是否过多等。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>修改密码&lt;br>
用户修改密码时，语法示例如下：&lt;/p></description></item><item><title>海量 2 用例 profile</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-testcase-profile/</link><pubDate>Fri, 14 Mar 2025 16:14:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-testcase-profile/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-CREATE-x2F-ALTER-x2F-DROP-PROFILE">1 CREATE/ALTER/DROP PROFILE&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-CREATE-x2F-ALTER-USER-PROFILE">2 CREATE/ALTER USER .. PROFILE&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-%E9%AA%8C%E8%AF%81profile%E7%94%9F%E6%95%88">3 验证profile生效&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81-failed-login-attempts-%E4%B8%8E-password-lock-time">验证 failed_login_attempts 与 password_lock_time&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81-password-life-time-%E4%B8%8E-password-grace-time">验证 password_life_time 与 password_grace_time&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81-password-reuse-time-%E5%92%8C-password-reuse-max">验证 password_reuse_time 和 password_reuse_max&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81-idle-time">验证 idle_time&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-view">3 view&lt;/a>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">limit&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">00002&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_max&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 1.72s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- error, interval &amp;lt; password_reuse_time
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- succeed, interval &amp;gt; password_reuse_time
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">00005&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 4.32s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass4&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- error, interval &amp;lt; password_reuse_time
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- succeed, interval &amp;gt; password_reuse_time
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="1-createalterdrop-profile">1 CREATE/ALTER/DROP PROFILE&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- check profile feature
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">resource_limit&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ================================ part 1 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- create profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: can set setting
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: can set more settings
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_grace_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_max&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">idle_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: repeated settings are allowed
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: setting value could be &amp;#39;unlimited&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">unlimited&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">unlimited&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: name max len is 64, name will be truncated
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">aaaaa111111111122222222223333333333444444444455555555556666666666&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- too long, max 64, wi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- truncated name: aaaaa1111111111222222222233333333334444444444555555555566666666
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pro5&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">setname&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile name is invalid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- int
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- numeric
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile already exists
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">error: setting is invalid, supported settings:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> unit type min max
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> ------------------------+---------+----------+---------+------------+----
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> failed_login_attempts | times | int | 1 | 2147483646 | 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> password_lock_time | days | double | 0.00001 | 24855 | 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> password_life_time | days | double | 0.00001 | 24855 | 180
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> password_grace_time | days | double | 0.00001 | 24855 | 7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> password_reuse_time | days | double | 0.00001 | 24855 | 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> password_reuse_max | times | int | 1 | 2147483646 | 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> idle_time | minutes | double | 0.00001 | 2147483646 | 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">*/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data_directory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">anyvalue&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_effect_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting lose value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro6&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting value type is invalud
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro7&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;iamstring&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro8&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro9&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">noint&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting value is out of limit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro11&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro12&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro13&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">24856&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro14&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">000001&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">aaaaa111111111122222222223333333333444444444455555555556666666666&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ================================ part 2 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- alter profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: can set setting
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: can set more settings
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_grace_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_max&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">idle_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: setting value could be &amp;#39;unlimited&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">unlimited&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">unlimited&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: can alter default profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">80&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">70&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">setname&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile name is invalid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- int
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- numeric
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">aaaaa111111111122222222223333333333444444444455555555556666666666&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- too long, max 64
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: repeated settings are not allowed
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile doesn&amp;#39;t exist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">epro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">error: setting is invalid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">*/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data_directory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">anyvalue&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_effect_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting lose value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting value type is invalud
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;iamstring&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">noint&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: setting value is out of limit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">24856&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">000001&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ================================ part 3 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- drop profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: drop profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile doesn&amp;#39;t exist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: default profile can&amp;#39;t be dropped
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-createalter-user--profile">2 CREATE/ALTER USER .. PROFILE&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- ================================ part 4 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- set profile for user
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: set profile for user
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u3.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u4.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile doesn&amp;#39;t exist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">eu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u4.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1000&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile name invalid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">eu2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u4.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">eu3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u4.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- catalog also changed
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ================================ part 5 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- alter user profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u3.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: alter user set profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile doesn&amp;#39;t exist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1000&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: profile name invalid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">roloid&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ================================ part 6 ================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- drop user and profile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- succeed: drop user
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: can&amp;#39;t drop profile if any user are using it
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- error: default profile can&amp;#39;t be dropped
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_user_profiles&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">roloid&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="3-验证profile生效">3 验证profile生效&lt;/h1>
&lt;h2 id="验证-failed_login_attempts-与-password_lock_time">验证 failed_login_attempts 与 password_lock_time&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_lock_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">0001&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 运行登录失败3次，失败后锁定8秒
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 允许登录失败无数次
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- u2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.error1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;DROP USER u1,u2&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证-password_life_time-与-password_grace_time">验证 password_life_time 与 password_grace_time&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_life_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">0001&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_grace_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">0001&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 密码有效期为8s，密码宽容期也为8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 密码有效期无限制
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sleep 8s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT 1;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证-password_reuse_time-和-password_reuse_max">验证 password_reuse_time 和 password_reuse_max&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">0001&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 不能用过去8秒使用过的密码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_max&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 不能用过去100次使用过的
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- -----------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_max&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 不能用过去2次使用过的
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_reuse_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass4&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- error
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass2&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- ok
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证-idle_time">验证 idle_time&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">idle_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 6s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 不用pg_sleep
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5432&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u2.pass1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 不用pg_sleep
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="3-view">3 view&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VIEW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">DBA_PROFILES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;PROFILE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">setname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;RESOURCE_NAME&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">setkind&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;RESOURCE_TYPE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">setval&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;LIMIT&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profiles&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>升级&lt;/li>
&lt;li>审计&lt;/li>
&lt;li>oid&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">knl_u_misc_init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AuthenticatedUserId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">InvalidOid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ResetStreamStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AuthenticatedUserId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">InvalidOid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">InitializeSessionUserId&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AuthenticatedUserId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SearchSysCache&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rolname&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">useroid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">InitializeSessionUserIdStandalone&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AuthenticatedUserId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BOOTSTRAP_SUPERUSERID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SessionUserId&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CurrentUserId&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">create_session_context&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enable_session_sig_alarm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ReadCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enable_session_sig_alarm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">disable_session_sig_alarm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TpoolSchedulerMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CheckSessionTimeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">handle_sig_alarm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CheckSessionTimeout&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">WaitMission&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># get_setting_from_guc_or_profile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enable_session_sig_alarm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>海量 2 设计 profile</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-design-profile/</link><pubDate>Thu, 06 Mar 2025 11:32:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-design-profile/</guid><description>&lt;h1 id="1-oracle兼容性-支持profile功能">1 Oracle兼容性-支持profile功能&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;p>本特性实现与oracle profile相同的功能，支持为不同用户设置7个不同的配置参数：&lt;/p>
&lt;ol>
&lt;li>failed_login_attempts&lt;/li>
&lt;li>password_lock_time&lt;/li>
&lt;li>password_life_time&lt;/li>
&lt;li>password_grace_time&lt;/li>
&lt;li>password_reuse_time&lt;/li>
&lt;li>password_reuse_max&lt;/li>
&lt;li>idle_time&lt;/li>
&lt;/ol>
&lt;p>简单使用示例如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;h3 id="一元数据">一、元数据&lt;/h3>
&lt;p>本特性的关键实现为：对用户提供DDL接口，在内核中存储配置数据。因此，在介绍代码流程前，先介绍接口与元数据。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>新增GUC参数resource_limit (与oracle参数名一致)&lt;br>
控制是否启用oracle profile功能。&lt;br>
如果该参数为on，以下5个guc参数则不再生效：[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max]。另外，对于已经过身份认证的连接，session_timeout也不再生效，相关功能均由profile中的用户级参数控制。&lt;br>
对于新安装的集群、旧版本升级的集群，该参数的值存在差异：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>新安装：新安装的数据库，即3.0.8版本及之后，该guc参数值默认为on（初始值为off，由initdb自动设置为on）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>升级：从3.0.8之前版本，升级到3.0.8版本时，在升级的过程中，该参数的值仍然是off，即升级上来默认不可用profile功能&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_settings&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;resource_limit&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RECORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="c1">-------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">resource_limit&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">setting&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 默认为on （由initdb设置为on，从旧版本升级到新版本时，升级脚本会将该参数设置为off）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">unit&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Ungrouped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">short_desc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Used&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">to&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">enable&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">feature&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">extra_desc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postmaster&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 需重启生效
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vartype&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">bool&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">source&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">min_val&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">max_val&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">enumvals&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">boot_val&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">off&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">reset_val&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">off&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">sourcefile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">sourceline&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>修改6个GUC参数的生效条件&lt;br>
当GUC参数resource_limit取值为on时，以下6个GUC参数不再生效：[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max, session_timeout]&lt;/p></description></item><item><title>海量 2 设计 oracle profile</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-design-profile-oracle/</link><pubDate>Thu, 20 Feb 2025 19:24:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-design-profile-oracle/</guid><description>&lt;h1 id="2">2&lt;/h1>
&lt;p>代码&lt;br>
新增试图&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_user_settings&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 新增视图 pg_user_settings
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_authid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolcanlogin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">LEFT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">setname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">setting&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">settype&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">settype&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">setsource&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">--------+-----------------------+----------+---------+-------------+----------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_effect_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">90&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profile&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">cluster&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgresql&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="参数1-failed_login_attempts">参数1: failed_login_attempts&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># opegauss使用1个内存中的hash表，存储密码失败次数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ClientAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 进行身份认证时，如果认证失败，则更新hash表中的失败次数值&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UpdateFailCountToHashTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitAccountLockHashTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_search&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果失败次数超过GUC限制，则锁定账户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">failed_login_attempts&lt;/span>&lt;span class="err">：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lockflag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="参数2-password_lock_time">参数2: password_lock_time&lt;/h4>
&lt;h4 id="参数3-password_effect_time">参数3: password_effect_time&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 通过内置函数，主动查看密码剩余天数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gs_password_deadline&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GetCurrentUserId&lt;/span> &lt;span class="c1"># 1 获取当前用户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GetUserCurrentPwdtime&lt;/span> &lt;span class="c1"># 2 从系统表pg_auth_history中，获取密码创建时间passwordtime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pg_auth_history&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">systable_beginscan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">floor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">u_sess&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">attr_security&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Password_effect_time&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 3 从guc参数password_effect_time中获取密码有效天数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 计算步骤2和3中的时间，返回剩余过期天数&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="参数4-password_reuse_max">参数4: password_reuse_max&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">AddAuthHistory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">systable_beginscan&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pg_auth_history&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 1 从系统表pg_auth_history中，获取曾用过的密码rolpassword，获取生成密码的时间passwordtime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">systable_getnext_back&lt;/span> &lt;span class="c1"># 倒着从系统表扫描，即先扫描不太古老的旧密码，再扫描更古老的旧密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_sha256_encrypt&lt;/span> &lt;span class="c1"># 使用旧密码的salt，加密新密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">strncmp&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="c1"># 比较新密码是否与旧密码相等&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hasSame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果新旧密码相等，计算新旧密码间隔天数，与GUC参数password_reuse_time比较，判断是否满足密码重用时间限制&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">now&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">pg_auth_history&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">passwordtime&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="s1">&amp;#39;password_reuse_time&amp;#39;&lt;/span>&lt;span class="err">：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">isTimeSafe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 计算这是倒数第几个密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">changeTimes&lt;/span>&lt;span class="o">++&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">changeTimes&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="s1">&amp;#39;password_reuse_max&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">isMaxSafe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 满足 password_reuse_time 和 password_reuse_max 中任意一个条件，都可以修改密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># - 要么用好几次之前的密码（满足 password_reuse_max 条件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># - 要么用很旧之间使用的密码（满足 password_reuse_time 条件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">hasSame&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">isTimeSafe&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">isMaxSafe&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 报错&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="参数5-password_reuse_time">参数5: password_reuse_time&lt;/h4></description></item><item><title>海量 2 需求 profile</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-requirement-profile/</link><pubDate>Wed, 19 Feb 2025 17:43:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/2-requirement-profile/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>vastbase与oracle都支持设置运行参数：&lt;/p>
&lt;ul>
&lt;li>vastbase：支持设置集群级guc参数，例如，guc参数failed_login_attempts用于设置’用户密码错误多少次后锁定账户’，该参数对集群中所有用户（非初始用户）都有效。&lt;/li>
&lt;li>oracle：也支持failed_login_attempts参数，但是oracle支持为不同用户设置不同的failed_login_attempts值。我们且将此类参数称为用户级参数。&lt;/li>
&lt;/ul>
&lt;p>与oracle相比，vastbase的guc参数功能存在2个差异：&lt;/p>
&lt;ol>
&lt;li>作用范围：oracle支持设置用户级参数，vastbase大部分参数都是集群级guc参数&lt;/li>
&lt;li>参数个数：23版本的oracle支持18个用户级参数，其中6个可在vastbase找到对应的guc参数&lt;/li>
&lt;li>参数取值：vastbase中，6个guc参数的取值范围与oracle profile不同&lt;/li>
&lt;/ol>
&lt;p>本文主要介绍以下几点：&lt;/p>
&lt;ol>
&lt;li>oracle用户级参数的个数、设置方法&lt;/li>
&lt;li>vastbase中对应集群级guc参数的个数、设置方法&lt;/li>
&lt;li>vastbase新需求：尽量实现与oracle一致的用户级guc参数&lt;/li>
&lt;/ol>
&lt;p>本文档可指导开发者、测试者熟悉vastbase用户级guc配置参数特性&lt;/p>
&lt;p>本文档的内容已被上传至tapd，tapd上，排版更好看，测试用例更方便复制。建议直接从tapd上查看本文档原文: &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196&lt;/a>&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>vastbase 3.0.8及之后版本，vastbase用户级参数profile特性接口设计、使用指导等。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>GUC：Grand Unifed Configuralion，postgresql和vastbase的配置参数&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>原始需求： &lt;a href="https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627">https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627&lt;/a>&lt;/li>
&lt;li>tapd上本需求文档链接： &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196&lt;/a>&lt;/li>
&lt;li>tapd上6个与密码相关的guc参数的使用参考： &lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007200">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007200&lt;/a>&lt;/li>
&lt;li>oracle 23 profile语法以及相关参数： &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html">https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html&lt;/a>&lt;/li>
&lt;li>mysql 8.0 create user语法以及相关参数： &lt;a href="https://mysql.net.cn/doc/refman/8.0/en/create-user.html">https://mysql.net.cn/doc/refman/8.0/en/create-user.html&lt;/a>&lt;/li>
&lt;li>mysql 配置参数列表：&lt;a href="https://mysql.net.cn/doc/refman/8.0/en/server-system-variable-reference.html">https://mysql.net.cn/doc/refman/8.0/en/server-system-variable-reference.html&lt;/a>&lt;/li>
&lt;li>vastbase g100 create user语法以及相关参数： &lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/6a4766151e29496b9f88cd2d9dd3db2e">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/6a4766151e29496b9f88cd2d9dd3db2e&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-支持oracle用户级配置profile">2 支持oracle用户级配置profile&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="需求来源桂林银行">【需求来源】桂林银行&lt;/h3>
&lt;ul>
&lt;li>需求链接：&lt;a href="https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627">https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627&lt;/a>&lt;/li>
&lt;li>需求描述：桂林银行客户指出，目前对于数据库用户的管理方式不够便捷，无法像oracle profile方式为用户赋予一组安全策略。一些属性如密码有效期、密码过期天数、密码尝试次数等也只能全局设定，无法指定用户配置。- 需求范围：桂林银行使用的数据库兼容模式包括oracle和mysql两种兼容模式。&lt;/li>
&lt;/ul>
&lt;h3 id="需求背景oracle-23的profile功能">【需求背景】oracle 23的profile功能&lt;/h3>
&lt;p>通俗来讲，oracle的profle可理解为细粒度的配置参数。1个profile包含1组配置参数，不同用户可使用不同的profile。按上述例子，要单独控制某个用户的密码有效期，操作步骤如下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>创建用户&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">IDENTIFIED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;u1.1234&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建profile，同时设置用户级参数&lt;br>
此处，以设置密码有效期参数为例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PROFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pro1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FAILED_LOGIN_ATTEMPTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>设置用户u1使用profile pro1&lt;/p></description></item><item><title>数据结构与算法 2 剑指offer</title><link>https://my-blog.j8465383071.workers.dev/posts/algorithm/2-coding-interview-guide/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/algorithm/2-coding-interview-guide/</guid><description>&lt;p>&lt;a href="https://www.nowcoder.com/exam/oj/ta?page=1&amp;amp;tpId=13&amp;amp;type=13">https://www.nowcoder.com/exam/oj/ta?page=1&amp;amp;tpId=13&amp;amp;type=13&lt;/a>&lt;/p>
&lt;h1 id="链表">链表&lt;/h1>
&lt;ol>
&lt;li>
&lt;p>从尾到头打印链表&lt;/p>
&lt;ul>
&lt;li>栈&lt;/li>
&lt;li>递归&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>链表反转&lt;/p>
&lt;ul>
&lt;li>
&lt;p>栈&lt;/p>
&lt;/li>
&lt;li>
&lt;p>双指针&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> -&amp;gt; &lt;span class="m">2&lt;/span> -&amp;gt; &lt;span class="m">3&lt;/span> -&amp;gt; &lt;span class="m">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> &amp;lt;- &lt;span class="m">2&lt;/span> -&amp;gt; &lt;span class="m">3&lt;/span> -&amp;gt; &lt;span class="m">4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>递归&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>合并两个有序链表&lt;/p>
&lt;ul>
&lt;li>迭代&lt;/li>
&lt;li>递归&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>两个链表的第一个公共结点&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> -&amp;gt; &lt;span class="m">2&lt;/span> -&amp;gt; &lt;span class="m">3&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">4&lt;/span> -&amp;gt; &lt;span class="m">5&lt;/span> &lt;span class="p">|&lt;/span>-&amp;gt; &lt;span class="m">6&lt;/span> -&amp;gt; &lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>栈&lt;/li>
&lt;li>双指针：先计算长度，再找起点&lt;/li>
&lt;li>map：第一个cnt &amp;gt; 1的节点&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>链表中环的入口节点&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> -&amp;gt; &lt;span class="m">2&lt;/span> -&amp;gt; &lt;span class="m">3&lt;/span> -&amp;gt; &lt;span class="m">4&lt;/span> -&amp;gt; &lt;span class="m">5&lt;/span> -&amp;gt; &lt;span class="m">6&lt;/span> -&amp;gt; &lt;span class="m">7&lt;/span> -&amp;gt; &lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ^ ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 环 相遇（相遇时，快指针多走了1个环）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">快指针：1 &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">6&lt;/span> &lt;span class="m">7&lt;/span> &lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">6&lt;/span> （前后长度一定相等：1 &lt;span class="m">2&lt;/span> 和 &lt;span class="m">7&lt;/span> 8）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">慢指针：1 &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">快指针：1 &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">满指针：1 &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>map：第一个cnt &amp;gt; 1的节点&lt;/li>
&lt;li>快慢指针：首先，找到相遇节点；然后，慢指针接着走，新指针从头走（一次一步），再次相遇。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>链表倒数第K个节点&lt;/p>
&lt;ul>
&lt;li>双指针：前指针先走K步&lt;/li>
&lt;li>栈&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>复杂链表的复制&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> -&amp;gt; &lt;span class="m">2&lt;/span> -&amp;gt; &lt;span class="m">3&lt;/span> -&amp;gt; &lt;span class="m">4&lt;/span> -&amp;gt; &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">3&lt;/span> &lt;span class="m">5&lt;/span> * &lt;span class="m">2&lt;/span> *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> _1 &lt;span class="m">2&lt;/span> _2 &lt;span class="m">3&lt;/span> _3 &lt;span class="m">4&lt;/span> _4 &lt;span class="m">5&lt;/span> _5 &lt;span class="c1"># 1. 复制后的新节点放在旧节点之后&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">3&lt;/span> &lt;span class="m">5&lt;/span> * &lt;span class="m">2&lt;/span> * &lt;span class="c1"># 2. 找到旧节点的旧random节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> _3 _5 * _2 * &lt;span class="c1"># 3. 旧random节点的下一个节点即为新random节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. 拆分链表&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>双指针&lt;/li>
&lt;li>哈希表：hash(旧节点) = 新节点&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>删除链表中重复节点&lt;/p></description></item><item><title>PostgreSQL 2-1 Parse</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-1-parse/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-1-parse/</guid><description>&lt;h1 id="1-语法解析概述">1 语法解析概述&lt;/h1>
&lt;h2 id="11-语法解析的目的">1.1 语法解析的目的&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>语法解析的目的&lt;br>
用户向数据发送以下SQL语句时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">CREATE TABLE t1 (c1 INT, c2 TEXT);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">INSERT INTO t1 VALUES (1, &amp;#39;data1&amp;#39;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DELETE FROM t1 WHERE c1 = 1;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从用户的角度，掌握SQL语法后，我们很容易理解上述SQL的含义。&lt;br>
从PostgreSQL的角度，上述语句知识一串字符串，需要根据SQL语法的规则，从字符串中解析表名、列名、数据等关键信息。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>语法解析的流程&lt;br>
此处将语法解析的步骤简要分为以下4个阶段：&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>定义语法：PostgreSQL开发人员需要根据SQL标准，制定一些类语法规则。比如：
&lt;ul>
&lt;li>当用户执行&lt;code>CREATE TABLE ..&lt;/code>时，表示用户需要创建表&lt;/li>
&lt;li>当用户执行&lt;code>CREATE TABLE tablename ..&lt;/code>时，表示用户要创建的表名叫&lt;code>tablename&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>发布语法：PostgreSQL会在官网上发布其定义的各种语法&lt;/li>
&lt;li>构造语句：当开发人员想让数据执行某些操作时，需根据数据库定义的语法，构造SQL语句，再让数据库执行。比如：
&lt;ul>
&lt;li>当用户想创建一个名为&lt;code>t1&lt;/code>的表，需要构造SQL语句&lt;code>CREATE TABLE t1 ..&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>解析语法：PostgreSQL接收SQL语句后，根据语法规则，可解析SQL想要执行什么操作，生成1个结构体，结构中存储了SQL语句的关键信息，比如：
&lt;ul>
&lt;li>处理&lt;code>CREATE TABLE t1 ..&lt;/code>，结构体中，将有1个变量表示表名，该变量的值将被复制为&lt;code>t1&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>执行语法：在解析用户操作后，生成一个结构体，即根据结构体，开始执行各种操作&lt;/li>
&lt;/ol>
&lt;h2 id="12-语法解析的类型">1.2 语法解析的类型&lt;/h2>
&lt;p>PostgreSQL支持上百种语法，本文主要介绍以下4个常用的语法：&lt;/p>
&lt;ol>
&lt;li>CREATE TABLE ..&lt;/li>
&lt;li>SELECT .. FROM ..&lt;/li>
&lt;li>INSERT INTO ..&lt;/li>
&lt;li>DELETE FROM ..&lt;/li>
&lt;/ol>
&lt;h1 id="2-解析语法">2 解析语法&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RECURSIVE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">with_query&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DISTINCT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">expression&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">expression&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">output_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">from_item&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">condition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">expression&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">HAVING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">condition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">WINDOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">window_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">window_definition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTERSECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXCEPT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DISTINCT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">expression&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ASC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DESC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">operator&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">NULLS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FIRST&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LAST&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OFFSET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">start&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROWS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FETCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FIRST&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROWS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ONLY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SHARE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SHARE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">NOWAIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- from_item
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ONLY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LATERAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">with_query_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LATERAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">function_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">argument&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_alias&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_definition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LATERAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">function_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">argument&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">column_definition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">from_item&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NATURAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">join_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">from_item&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">join_condition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">join_column&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- with_query
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">with_query_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">column_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">values&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">insert&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">update&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">delete&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ONLY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>参考 &lt;a href="http://www.postgres.cn/docs/9.3/sql-select.html">http://www.postgres.cn/docs/9.3/sql-select.html&lt;/a>&lt;/p></description></item><item><title>PostgreSQL 2-2 Analyze</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-2-analyze/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-2-analyze/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-语义分析的目的">1.1 语义分析的目的&lt;/h2>
&lt;ul>
&lt;li>语义分析的目的&lt;br>
上文提到，PostgreSQL接收SQL语句时，会生成1个语法解析树，语法解析树存储了SQL语法中的关键信息。比如，在语法&lt;code>INSERT INTO t1 VALUES(1, 'data1')&lt;/code>中，解析结果可说明：&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>这是一条用于插入数据的INSERT语法&lt;/li>
&lt;li>数据将插入t1表中&lt;/li>
&lt;li>要插入的数据是&lt;code>(1, 'data1')&lt;/code>&lt;/li>
&lt;li>…&lt;br>
但是，数据库执行时，还需要更多的关键信息才行，比如，在&lt;code>INSERT INTO t1 VALUES(1, 'data1')&lt;/code>的语法树中，PostgreSQL需要获取一些关键信息：&lt;/li>
&lt;li>数据库中是否有表叫t1&lt;/li>
&lt;li>t1表有几列，每列的的数据类型是什么&lt;/li>
&lt;li>语法中的值&lt;code>(1, 'data1')&lt;/code>是否符合t1表的定义&lt;/li>
&lt;li>…&lt;/li>
&lt;/ol>
&lt;h2 id="12-本文的目标">1.2 本文的目标&lt;/h2>
&lt;p>本文以几个常见且简单的语法为例，介绍语义分析的详细功能&lt;/p>
&lt;ol>
&lt;li>CREATE TABLE ..&lt;/li>
&lt;li>SELECT .. FROM ..&lt;/li>
&lt;li>INSERT INTO ..&lt;/li>
&lt;li>DELETE FROM ..&lt;/li>
&lt;/ol>
&lt;h2 id="13-语义分析的调用关系">1.3 语义分析的调用关系&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parse_analyze&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="11-整体流程">1.1 整体流程&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 语义分析
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parse_analyze&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformTopLevelStmt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformOptionalSelectInto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformStmt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformInsertStmt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">exec_simple_query&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pg_parse_query&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pg_analyze_and_rewrite&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">parse_analyze&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Node&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">parsetree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">List&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">querytree_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">pg_rewrite_query&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pg_plan_queries&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PortalRun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-分析器">1.2 分析器&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">parse_analyze&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Node&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ParseState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">pstate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">make_parsestate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformTopLevelStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cm">/* 对各种类型语法进行语义分析 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">result&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">switch&lt;/span> &lt;span class="nf">nodeTag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_InsertStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformInsertStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">InsertStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_DeleteStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformDeleteStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">DeleteStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_UpdateStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformUpdateStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">UpdateStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_SelectStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SelectStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">SelectStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">parseTree&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">valuesLists&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">transformValuesClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">op&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nl">SETOP_NONE&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformSelectStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_DeclareCursorStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_ExplainStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_CreateTableAsStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">default&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">makeNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Query&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">commandType&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CMD_UTILITY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">utilityStmt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Node&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">parseTree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-select-分析">1.3 SELECT 分析&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">transformSelectStmt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ParseState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SelectStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">stmt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Query&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">qry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">makeNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Query&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">withClause&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">cteList&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformWithClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">withClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">transformFromClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">fromClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformTargetList&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">markTargetListOrigins&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Node&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">qual&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformWhereClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">whereClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">havingQual&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformWhereClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">havingClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortClause&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformSortClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortClause&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">groupClause&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformGroupClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">groupClause&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">groupingSets&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">distinctClause&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformDistinctOnClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">distinctClause&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortClause&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">limitOffset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformLimitClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">limitOffset&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">limitCount&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformLimitClause&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stmt&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">limitCount&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">windowClause&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">transformWindowDefinitions&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pstate&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">p_windowdefs&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">targetList&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">jointree&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">makeFromExpr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">p_joinlist&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qual&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">pstate&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">p_hasAggs&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">groupClause&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">groupingSets&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">havingQual&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">parseCheckAggregates&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">assign_query_collations&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">qry&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">qry&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 2-3 Rewrite</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-3-rewrite/</link><pubDate>Wed, 05 Feb 2025 18:29:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-3-rewrite/</guid><description>&lt;ul>
&lt;li>
&lt;p>重写功能&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 创建2个表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 创建1条重写规则
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 触发条件：向t1表写入数据时
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 执行操作：将SQL语句重写为：同时向t2写入相同数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RULE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ALSO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 向t1写入一条数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abc&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 验证t2也写入了一条数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>重写规则&lt;/p>
&lt;ul>
&lt;li>
&lt;p>语法&lt;br>
定义重写规则的语法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RULE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">condition&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">DO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ALSO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INSTEAD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOTHING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>约束&lt;/p></description></item><item><title>PostgreSQL 2-4 Plan</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-4-plan/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-4-plan/</guid><description>&lt;h1 id="sql-引擎">SQL 引擎&lt;/h1>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-生成计划的目的">1.1 生成计划的目的&lt;/h2>
&lt;p>上文提到，在语法分析、语义分析之后，PostgreSQL已获取执行所需的详细信息。计划生成主要针对一些复杂的SQL语句，主要是SQL语句，计划器主要告诉PostgreSQL，如何更高效地执行复杂的SQL语句：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>示例1&lt;br>
假设，有1个表，表上有1个索引，表中有1000万条数据&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INDEX&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假设1000万条数据
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当用户执行以下SQL语句时，数据库需要从t1表中，依次扫描所有的数据，此时，索引并没有什么作用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当用户执行以下数据时，数据有2种执行方案：&lt;/p>
&lt;/li>
&lt;li>
&lt;p>语句&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10000&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>方案1：依次扫描t1表所有数据，然后找到c1=10000的几行&lt;/p>
&lt;/li>
&lt;li>
&lt;p>方案2：先扫描索引i1，找到c1=10000的几行数据所在的位置，再去t1表中指定位置读取数据&lt;br>
显然，上述示例中，方案2的执行速度更快，数据库需要根据一定的策略，选择哪种执行方案。这便是计划器的职责。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="12-生成计划的场景">1.2 生成计划的场景&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>SQL语法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data-2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ANALYZE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_statistic&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">starelid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">regclass&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="13-计划的简单表示">1.3 计划的简单表示&lt;/h2>
&lt;h2 id="14-算子的分类">1.4 算子的分类&lt;/h2>
&lt;p>共40个&lt;/p></description></item><item><title>PostgreSQL 2-5 Execute</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-5-execute/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-5-execute/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-总接口">1.1 总接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostmasterMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">select&lt;/span> &lt;span class="c1"># 接收TCP连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fork_process&lt;/span> &lt;span class="c1"># fork postgres进程，用于处理SQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># postgres子进程执行：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># postgres子进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span> &lt;span class="c1"># 语法解析&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span> &lt;span class="c1"># 语义分析 查询重写&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_queries&lt;/span> &lt;span class="c1"># 计划生成&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreatePortal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalDefineQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRunSelect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span> &lt;span class="c1"># 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutePlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecProcNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecSeqScan&lt;/span> &lt;span class="c1"># SELECT 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SeqNext&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_beginscan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_getnext&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRunMulti&lt;/span> &lt;span class="c1"># DDL执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRunUtility&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessUtility&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ProcessUtility&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecDropStmt&lt;/span> &lt;span class="c1"># DROP TABLE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessUtilitySlow&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DefineRelation&lt;/span> &lt;span class="c1"># CREATE TABLE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span> &lt;span class="c1"># 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutePlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecProcNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecModifyTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInsert&lt;/span> &lt;span class="c1"># INSERT 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecUpdate&lt;/span> &lt;span class="c1"># UPDATE 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecDelete&lt;/span> &lt;span class="c1"># DELETE 计划执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_delete&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorFinish&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorEnd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalDrop&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_queries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subquery_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pull_up_subqueries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">preprocess_qual_conditions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">grouping_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">query_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">make_one_rel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set_base_rel_pathlists&lt;/span> &lt;span class="c1"># 查找所有Scan类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set_rel_pathlist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set_plain_rel_pathlist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_seqscan_path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_index_paths&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_index_paths&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">generate_bitmap_or_paths&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_tidscan_paths&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_cheapest_fractional_path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_plan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">create_plan_recurse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_scan_plan&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-算子类型">1.2 算子类型&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">TupleTableSlot&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">ExecProcNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PlanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 控制算子 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecResult&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">ResultState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecModifyTable&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">ModifyTableState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecAppend&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">AppendState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecMergeAppend&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">MergeAppendState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecRecursiveUnion&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">RecursiveUnionState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 扫描算子 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecSeqScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">SeqScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecSampleScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">SampleScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecIndexScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">IndexScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecIndexOnlyScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">IndexOnlyScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecBitmapHeapScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">BitmapHeapScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecTidScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">TidScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecSubqueryScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">SubqueryScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecFunctionScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">FunctionScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecValuesScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">ValuesScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecCteScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">CteScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecWorkTableScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">WorkTableScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecForeignScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">ForeignScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecCustomScan&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">CustomScanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 连接算子 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecNestLoop&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">NestLoopState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecMergeJoin&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">MergeJoinState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecHashJoin&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">HashJoinState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 物化算子 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecMaterial&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">MaterialState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecSort&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">SortState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecGroup&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">GroupState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecAgg&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">AggState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecWindowAgg&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">WindowAggState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecUnique&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">UniqueState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecHash&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">HashState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecSetOp&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">SetOpState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecLockRows&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">LockRowsState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ExecLimit&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">LimitState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-算子">2 算子&lt;/h1>
&lt;h2 id="21-execsort">2.1 ExecSort&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 主要流程 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TupleTableSlot&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">ExecSort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SortState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Tuplesortstate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tuplesortstate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">tuplesortstate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">!&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">sort_Done&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PlanState&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">outerNode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">outerPlanState&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tuplesortstate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">tuplesort_begin_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">ExecGetResultType&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">outerNode&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">numCols&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sortColIdx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sortOperators&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span> &lt;span class="cm">/* 子节点扫描tup */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ExecProcNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">outerNode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_puttupleslot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuplesortstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_performsort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuplesortstate&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">node&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">ss&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ps&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ps_ResultTupleSlot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_gettupleslot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuplesortstate&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">ScanDirectionIsForward&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dir&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">slot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 1 准备 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Tuplesortstate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">tuplesort_begin_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TupleDesc&lt;/span> &lt;span class="n">tupDesc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">nkeys&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">AttrNumber&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">attNums&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Oid&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">sortOperators&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Oid&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">sortCollations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">nullsFirstFlags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Tuplesortstate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">comparetup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comparetup_heap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">copytup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">copytup_heap&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">writetup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">writetup_heap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">readtup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">readtup_heap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortKeys&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">palloc0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nkeys&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SortSupportData&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="n">in&lt;/span> &lt;span class="nf">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nkeys&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SortSupport&lt;/span> &lt;span class="n">sortKey&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">sortKeys&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sortKey&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">ssup_attno&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">attNums&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2 扫描存储 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">tuplesort_puttupleslot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Tuplesortstate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TupleTableSlot&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">slot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SortTuple&lt;/span> &lt;span class="n">stup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">COPYTUP&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">stup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">slot&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">puttuple_common&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">stup&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">switch&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">status&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_INITIAL&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">memtupsize&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">grow_memtuples&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">bounded&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">make_bounded_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">inittapes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">maxTapes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">tuplesort_merge_order&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">allowedMem&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tapeSpace&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">int64&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">maxTapes&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">TAPE_BUFFER_OVERHEAD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 创建临时文件 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PrepareTempTablespaces&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">tapeset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">LogicalTapeSetCreate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">maxTapes&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">mergenext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">palloc0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">maxTapes&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">mergeavailslots&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">palloc0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">maxTapes&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ntuples&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">ntuples&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="o">++&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SortTuple&lt;/span> &lt;span class="n">stup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">stup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">status&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TSS_BUILDRUNS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">dumptuples&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">memtupsize&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* = writetup_heap */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">WRITETUP&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">tp_tapenum&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">destTape&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_siftup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">currentRun&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nl">tupindex&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">markrunend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">tp_tapenum&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">destTape&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">currentRun&lt;/span>&lt;span class="o">++&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">selectnewtape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_BOUNDED&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">COMPARETUP&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">free_sort_tuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">free_sort_tuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_siftup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_BUILDRUNS&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">COMPARETUP&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">currentRun&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">tuplesort_heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">currentRun&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">dumptuples&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 3 排序 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">tuplesort_performsort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Tuplesortstate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">switch&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">status&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_INITIAL&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="cm">/* 可在内存存放所有tup */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">onlyKey&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">qsort_ssup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">onlyKey&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">qsort_tuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtuples&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">memtupcount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">comparetup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">current&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">status&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TSS_SORTEDINMEM&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_BOUNDED&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="cm">/* 使用堆排消除多余tup*/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">sort_bounded_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">status&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TSS_SORTEDINMEM&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">TSS_BUILDRUNS&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">dumptuples&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cm">/* 将内存中所有元组写到持久化存储tape */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mergeruns&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cm">/* 合并执行 */&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="22-tup读写">2.2 tup读写&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">writetup_heap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Tuplestorestate&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tup&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MinimalTuple&lt;/span> &lt;span class="n">tuple&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">MinimalTuple&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">tup&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 2-6 Catalog</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-6-catalog/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-6-catalog/</guid><description>&lt;h1 id="1-常用系统表与视图">1 常用系统表与视图&lt;/h1>
&lt;h2 id="11-系统表">1.1 系统表&lt;/h2>
&lt;h2 id="12-视图">1.2 视图&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>堆内存（区分线程）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_thread_memory_context&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">totalsize&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DESC&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>堆内存（不区分线程）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_shared_memory_detail&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">totalsize&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DESC&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>会话&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_activity&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h1 id="1-新增系统表">1 新增系统表&lt;/h1>
&lt;ol>
&lt;li>
&lt;p>获取空闲的oid&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> src/include/catalog/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x unused_oids
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./unused_oids
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h1 id="2-读取系统表">2 读取系统表&lt;/h1>
&lt;p>创建表时涉及的系统表操作：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">heap_create_with_catalog&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">pg_class_desc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelationRelationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Oid&lt;/span> &lt;span class="n">old_type_oid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">GetSysCacheOid2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TYPENAMENSP&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Oid&lt;/span> &lt;span class="n">relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">GetNewRelFileNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_class_desc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">new_rel_desc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_create&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ObjectAddress&lt;/span> &lt;span class="n">new_type_addr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">AddNewRelationType&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">AddNewRelationTuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_class_desc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">new_rel_desc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">AddNewAttributeTuples&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">new_rel_desc&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_att&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ObjectAddress&lt;/span> &lt;span class="n">myself&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">referenced&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">myself&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">objectId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">relid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">referenced&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">objectId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">relnamespace&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">recordDependencyOn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">myself&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">referenced&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">DEPENDENCY_NORMAL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">recordDependencyOnOwner&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelationRelationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">recordDependencyOnNewAcl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelationRelationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">recordDependencyOnCurrentExtension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">myself&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">StoreConstraints&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_rel_desc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cooked_constraints&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>打开系统表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Relation&lt;/span> &lt;span class="nf">heap_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Oid&lt;/span> &lt;span class="n">relationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LOCKMODE&lt;/span> &lt;span class="n">lockmode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">relation_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lockmode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LockRelationOid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lockmode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">RelationIdGetRelation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">rd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationIdCacheLookup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relationId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelIdCacheEnt&lt;/span> &lt;span class="n">hentry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">hash_search&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelationIdCache&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hentry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">reldesc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationIncrementReferenceCount&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* find cache, return */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">!&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">rd_isvalid&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">relkind&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">RELKIND_INDEX&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationReloadIndexInfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationClearRelation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">rd&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* no cache, so build */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">RelationBuildDesc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HeapTuple&lt;/span> &lt;span class="n">pg_class_tuple&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ScanPgRelation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">targetRelId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HeapTupleGetOid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_class_tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Form_pg_class&lt;/span> &lt;span class="n">relp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Form_pg_class&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">GETSTRUCT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_class_tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relation&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">AllocateRelationDesc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationGetRelid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">relid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationBuildTupleDesc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">..&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationBuildRuleLock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">..&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationBuildTriggers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">..&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationBuildRowSecurity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationParseRelOptions&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pg_class_tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationInitLockInfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationInitPhysicalAddr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_freetuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_class_tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationIncrementReferenceCount&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pgstat_initstats&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Oid&lt;/span> &lt;span class="n">reloid&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Relation&lt;/span> &lt;span class="n">reldesc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">RelIdCacheEnt&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>扫描系统表&lt;/p></description></item><item><title>PostgreSQL 2-6 Alias</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-7-alias/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-7-alias/</guid><description>&lt;h1 id="sql别名">SQL.别名&lt;/h1>
&lt;p>&lt;strong>摘要&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>本文以实际使用为例，介绍SQL语法中别名的使用约束&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>目录&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#SQL-%E5%88%AB%E5%90%8D">SQL.别名&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-%E4%BB%8B%E7%BB%8D">1 介绍&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-%E7%A4%BA%E4%BE%8B">2 示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-%E5%A4%8D%E6%9D%82%E5%9C%BA%E6%99%AF">3 复杂场景&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h2 id="1-介绍">1 介绍&lt;/h2>
&lt;p>什么是别名：&lt;/p>
&lt;p>别名语法:&lt;/p>
&lt;blockquote>
&lt;p>表名 | 列名 | 表名.列名 [AS] 别名&lt;/p>&lt;/blockquote>
&lt;h2 id="2-示例">2 示例&lt;/h2>
&lt;p>0 建表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-SQL" data-lang="SQL">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">c3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>1 [列] 别名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-SQL" data-lang="SQL">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">col1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>2 [表] 别名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-SQL" data-lang="SQL">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tbl1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>3 [表.列] 别名：&lt;/p></description></item><item><title>PostgreSQL 2-8 join</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-8-join/</link><pubDate>Thu, 20 Feb 2025 19:26:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-8-join/</guid><description>&lt;h1 id="1-介绍join">1 介绍JOIN&lt;/h1>
&lt;h2 id="分类">分类&lt;/h2>
&lt;ul>
&lt;li>INNER JOIN&lt;/li>
&lt;li>LEFT JOIN&lt;/li>
&lt;li>RIGHT JOIN&lt;/li>
&lt;li>FULL JOIN&lt;/li>
&lt;li>SELF JOIN&lt;/li>
&lt;li>CROSS JOIN&lt;/li>
&lt;/ul>
&lt;h1 id="2-使用join">2 使用JOIN&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u3&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1-2&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;u2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;u4&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u4-1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INNER JOIN
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INNER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">----+----+----+------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- LEFT JOIN
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LEFT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">----+----+----+------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- RIGHT JOIN
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RIGHT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">----+----+----+------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- FULL JOIN
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FULL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">----+----+----+------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELF JOIN
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">-- CROSS JOIN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SELECT a1, b1, b2, c2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FROM t1 CROSS JOIN t2 -- can&amp;#39;t use &amp;#39;ON&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ORDER BY a1, b1, c2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> a1 | b1 | b2 | c2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----+----+----+------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1 | u1 | u1 | u1-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1 | u1 | u1 | u1-2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1 | u1 | u2 | u2-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1 | u1 | u4 | u4-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2 | u2 | u1 | u1-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2 | u2 | u1 | u1-2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2 | u2 | u2 | u2-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2 | u2 | u4 | u4-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3 | u3 | u1 | u1-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3 | u3 | u1 | u1-2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3 | u3 | u2 | u2-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3 | u3 | u4 | u4-1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 2-9 cache</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-9-cache/</link><pubDate>Wed, 26 Feb 2025 18:10:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-9-cache/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@vb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">GaussDBThteadMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresInitializer&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">InitBackendWorker&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">InitSession&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">InitSysCache&lt;/span> &lt;span class="c1"># 1 初始化缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationCacheInitializePhase2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">lsc&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LocalTabDefCache&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">InitPhase2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Formrdesc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;vb_profiles“&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">formrdesc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;vb_profiles“)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitCatalogCache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">CheckAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PerformAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ClientAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">InitUser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitializeSessionUserId&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">SetDatabase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">SetDatabaseByName&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">InitSessionDatabase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">LockDataBase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">::&lt;/span>&lt;span class="n">LoadSysCache&lt;/span> &lt;span class="c1"># 2 初始化缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationCacheInitializePhase3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">lsc&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LocalTabDefCache&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">InitPhase3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LoadCriticalIndex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_critical_index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ProfileRelationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitDatabase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FinishInit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">InitCatalogCache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RelationCacheInitialize&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 2-10 function</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-10-func/</link><pubDate>Wed, 01 Jul 2026 15:19:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/2-10-func/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">exec_simple_query&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;SELECT * FROM t1 WHERE c1 &amp;gt; 10&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parse_analyze&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformStmt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformSelectStmt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformWhereClause&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformExpr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transformAExprOp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">oper&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">oper_search&lt;/span> &lt;span class="c1"># 查找操作符所有相关函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enforce_generic_type_consistency&lt;/span> &lt;span class="c1"># 根据已知数据类型，找到最符合的函数，自动调用隐式转换&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">make_op&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_queries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInterpExpr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecEvalExprSwitchContext&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">--&lt;/span> &lt;span class="n">ciphera_gt&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">int4gt&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>海量 3 需求 pg_hba.conf加密</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/3-requirement-pg-hba-encrypt/</link><pubDate>Tue, 01 Apr 2025 15:42:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/3-requirement-pg-hba-encrypt/</guid><description>&lt;h1 id="1-需求背景">1 需求背景&lt;/h1>
&lt;ol>
&lt;li>客户使用vb什么版本？ 2215&lt;/li>
&lt;li>客户的要求：&lt;/li>
&lt;/ol>
&lt;h1 id="2-需求分析">2 需求分析&lt;/h1>
&lt;h2 id="21-适配点">2.1 适配点&lt;/h2>
&lt;p>在使用vastbase的多个阶段，都可能涉及pg_hba.conf&lt;/p>
&lt;ul>
&lt;li>编译安装&lt;/li>
&lt;li>初始化&lt;/li>
&lt;li>升级&lt;/li>
&lt;li>配置
&lt;ul>
&lt;li>gs_guc修改pg_hba&lt;/li>
&lt;li>手动编辑pg_hba&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>启动&lt;/li>
&lt;li>运维
&lt;ul>
&lt;li>pg_backup&lt;/li>
&lt;li>pg_rewind&lt;/li>
&lt;li>vb_ctl restart&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="22-代码流程">2.2 代码流程&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>编译&lt;/p>
&lt;/li>
&lt;li>
&lt;p>初始化&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span> &lt;span class="c1"># initdb.cpp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">canonicalize_path&lt;/span> &lt;span class="c1"># PGDATA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">find_other_exec&lt;/span> &lt;span class="c1"># 在gs_initdb bin目录下，查找gaussdb bin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 在$GAUSSHOME/share/postgrsql目录下，检查以下文件是否存在&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;postgres.bki, postgres.description, pg_hba.conf.sample, postgresql.conf.sample, ..., system_views.sql, ...&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_locale_encoding&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">init_log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gs_getenv_r&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;GAUSSLOG&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">canonicalize_path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;$PGDATA/PG_VERSION&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fprintf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PG_MAJORVERSION&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;9.2&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">readfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;postgresql.conf.sample&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">readfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;pg_hba.sample&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">writefile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;pg_hba.conf&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bootstrap_template1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">write_version_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_auth&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_set_pwd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_depend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_plpgsql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setup_sysviews&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>升级&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配置&lt;/p>
&lt;/li>
&lt;li>
&lt;p>启动&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pg_ctl&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>运行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">PostmasterMain&lt;/span> &lt;span class="c1"># postmaster 线程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitializeGUCOptions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">getopt_r&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_hba&lt;/span> &lt;span class="c1"># 加载hba&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ConnCreate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StreamConnection&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span> &lt;span class="c1"># postgres 线程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitBackendWorker&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitSession&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CheckAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PerformAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">port&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">protocol_config&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">fn_authenticate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ClientAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hba_getauthmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_hba&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g_instance&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">libpq_cxt_comm_parsed_hba_lines&lt;/span> &lt;span class="c1"># 读取缓存的hba&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">init_user&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_default_auth_method&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_hostname&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sendAuthRequest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">recv_and_check_password_packet&lt;/span> &lt;span class="c1"># 接收客户端的password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crypt_verify&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exec_simple_query&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;SQL&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SIGHUB_handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_hba&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>运维&lt;/p></description></item><item><title>海量 3 需求 oracle resource</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/3-requirement-oracle-resource/</link><pubDate>Mon, 24 Mar 2025 10:42:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/3-requirement-oracle-resource/</guid><description>&lt;p>| -| -| -| -| -| -| -|&lt;br>
| 1 | FAILED_LOGIN_ATTEMPTS | [1, max] unlimited | failed_login_attempts | [1,1000] | 认证类 | 登录数据库时，如果密码错误次数超过&amp;lt;本参数&amp;gt;，则账号会被锁定，短期内无法再登录 |&lt;br>
| 2 | PASSWORD_LOCK_TIME | [1, max] unlimited | password_lock_time | [1,525600]min | 认证类 | 如果因密码错误次数过多，导致账号被锁，将锁定&amp;lt;本参数&amp;gt;的时间 |&lt;br>
| 3 | PASSWORD_LIFE_TIME | [1, max] unlimited | password_effect_time | [30,36500]day | 认证类 | 设置或更新用户密码时，超过&amp;lt;本参数&amp;gt;的时间，密码会过期（oracle与vastase表现不同） |&lt;br>
| 4 | PASSWORD_GRACE_TIME | - | - | - | 认证类 | 如果密码过期，在&amp;lt;本参数&amp;gt;的时间内，密码仍可使用 |&lt;br>
| 5 | PASSWORD_REUSE_TIME | [1, max] unlimited | password_reuse_time | [30, 90]day | 认证类 | 用户设置密码时，如果密码在过去的&amp;lt;本参数&amp;gt;的时间内别用过，则密码不能复用，opengauss [0,3650] |&lt;br>
| 6 | PASSWORD_REUSE_MAX | - | password_reuse_max | [1,100] | 认证类 | 用户设置密码时，如果密码已被重复使用过&amp;lt;本参数&amp;gt;的次数，则密码不能复用 |&lt;br>
| 7 | INACTIVE_ACCONT_TIME | - | - | - | 认证类 | 如果一个账号在&amp;lt;本参数&amp;gt;的时间内，未登录过，则锁定账号 |&lt;br>
| 8 | PASSWORD_VERIFY_FUNCTION | - | - | - | 认证类 | 用户设置密码时，调用&amp;lt;本参数&amp;gt;指定的函数，检查密码是否符合要求 |&lt;br>
| 9 | PASSWORD_ROLLOVER_TIME | - | - | - | 认证类 | 新旧密码滚动更新天数 |&lt;br>
| 10 | SESSIONS_PER_USER | - | - | - | 资源类 | 1个用户可建立的最大连接数 |&lt;br>
| 11 | CPU_PER_SESSION | - | - | - | 资源类 | 1个连接可使用CPU时间数 |&lt;br>
| 12 | CPU_PER_CALL | - | - | - | 资源类 | 1个调用（比如1个SQL）可使用CPU时间数 |&lt;br>
| 13 | CONNECT_TIME | - | - | - | 资源类 | 1个连接可持续的时间 |&lt;br>
| 14 | IDLE_TIME | [1, max] unlimited | session_timeout | [0,86400] | 资源类 | 1个连接空闲时间限制 |&lt;br>
| 15 | LOGICAL_READS_PER_CALL | - | - | - | 资源类 | 1次调用（比如1个SQL）允许读写的page数量 |&lt;br>
| 16 | LOGICAL_READS_PER_SESSION | - | - | - | 资源类 | 1个连接允许读取的page数量 |&lt;br>
| 17 | PRIVATE_SGA | - | - | - | 资源类 | 1个连接可使用的共享内存空间大小 |&lt;br>
| 18 | CONPOSITE_LIMIT | - | - | - | 资源类 | 1个连接可可使用的总资源：按cpu时间、连接时间、page读写数等加权求和 |&lt;/p></description></item><item><title>数据结构与算法 3 排序</title><link>https://my-blog.j8465383071.workers.dev/posts/algorithm/3-sorting/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/algorithm/3-sorting/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-衡量标准">1.1 衡量标准&lt;/h2>
&lt;h2 id="12-分类">1.2 分类&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>算法&lt;/th>
&lt;th>思想&lt;/th>
&lt;th>最好时间复杂度&lt;/th>
&lt;th>最坏时间复杂度&lt;/th>
&lt;th>时间复杂度&lt;/th>
&lt;th>空间复杂度&lt;/th>
&lt;th>稳定性&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>冒泡排序&lt;/td>
&lt;td>比较、交换&lt;/td>
&lt;td>O(n)&lt;/td>
&lt;td>O(n^2)&lt;/td>
&lt;td>O(n^2)&lt;/td>
&lt;td>O(1)&lt;/td>
&lt;td>稳定，值相等不交换&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>插入排序&lt;/td>
&lt;td>比较、移动&lt;/td>
&lt;td>O(n)&lt;/td>
&lt;td>O(n^2)&lt;/td>
&lt;td>O(n^2)&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>选择排序&lt;/td>
&lt;td>比较、交换&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>归并排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>快速排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>堆排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>桶排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>计数排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>基数排序&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 冒泡排序 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">sort_bubble&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">arr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">arrlen&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">tmp&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrlen&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arrlen&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tmp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tmp&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 3-2 Page</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-2-page/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-2-page/</guid><description>&lt;h1 id="1-page的概念">1 Page的概念&lt;/h1>
&lt;h2 id="11-前置概念">1.1 前置概念&lt;/h2>
&lt;p>首先，简单介绍一些基本概念：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>关系 Relation&lt;/strong>：PostgreSQL是一款关系型数据库，在数据库中，1个表对应关系代数中的1个关系，即1个Relation。本博客中，将1个Relation指1个表&lt;/li>
&lt;li>&lt;strong>数据文件 RelFile&lt;/strong>：通过&lt;code>CREATE TABLE t1 (c1 INT, c2 TEXT)&lt;/code>等语法创建1个表时，PostgreSQL会生成1个与表对应的数据文件，表中数据都将被存储至数据文件中&lt;/li>
&lt;li>&lt;strong>数据库页 Page&lt;/strong>：1个数据文件，由1个或多个大小为8192字节（即8k）的数据页组成&lt;/li>
&lt;li>&lt;strong>行 Row&lt;/strong>：在SQL语法&lt;code>INSERT INTO t1 VALUES (1, 'data1')&lt;/code>中，&lt;code>(1, 'data1')&lt;/code>是表中的1行数据&lt;/li>
&lt;li>&lt;strong>元组 Tuple&lt;/strong>：在PostgreSQL中，1个Tuple存储1行数据，数据越长，Tuple越长。1个Page可以存储多个Tuple&lt;/li>
&lt;/ol>
&lt;h2 id="12-page">1.2 Page&lt;/h2>
&lt;p>Page的格式如下：&lt;/p>
&lt;p>&lt;img alt="page" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-2-page/page.png">&lt;/p></description></item><item><title>数据库安全 0 postgresql表级透明加密</title><link>https://my-blog.j8465383071.workers.dev/posts/security/3-2-postgresql-tde/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/3-2-postgresql-tde/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-%E7%89%B9%E6%80%A7%E8%83%8C%E6%99%AF">1 特性背景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88">2 实现方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E7%B3%BB%E7%BB%9F%E8%A1%A8">2.1 系统表&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-pg-key-info-%E5%AF%86%E9%92%A5%E4%BF%A1%E6%81%AF">1. pg_key_info 密钥信息&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-pg-key-data-%E5%AF%86%E9%92%A5%E6%95%B0%E6%8D%AE">2. pg_key_data 密钥数据&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-pg-encryption-%E5%8A%A0%E5%AF%86%E5%AF%B9%E8%B1%A1">3. pg_encryption 加密对象&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-2-%E5%AE%9A%E4%B9%89%E8%A1%A8">2.2 定义表&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E5%AE%9A%E4%B9%89%E8%A1%A8%E5%8A%A0%E5%AF%86">2.3 定义表加密&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E6%93%8D%E4%BD%9C%E8%A1%A8">2.4 操作表&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-5-%E7%AE%A1%E7%90%86%E8%A1%A8%E5%8A%A0%E5%AF%86">2.5 管理表加密&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-6-%E7%AE%A1%E7%90%86%E4%B8%BB%E5%AF%86%E9%92%A5">2.6 管理主密钥&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-7-%E7%AE%A1%E7%90%86%E6%95%B0%E6%8D%AE%E5%AF%86%E9%92%A5">2.7 管理数据密钥&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-8-%E7%AE%A1%E7%90%86%E5%8A%A0%E5%AF%86%E5%AE%9A%E4%B9%89">2.8 管理加密定义&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-8-%E6%9C%AA%E6%9D%A5%E8%AE%A1%E5%88%92">2.8 未来计划&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E5%8A%9F%E8%83%BD%E8%A1%A5%E5%85%85">一、功能补充&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E8%AF%AD%E6%B3%95%E5%A4%8D%E7%94%A8">二、语法复用&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E5%85%B3%E9%94%AE%E8%AE%BE%E8%AE%A1">3 关键设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E6%A0%BC%E5%BC%8F%E8%AE%BE%E8%AE%A1">3.1 格式设计&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1">3.2 流程设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%95%B4%E4%BD%93%E6%B5%81%E7%A8%8B">整体流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8A%A0%E5%AF%86%E7%B2%92%E5%BA%A6">加密粒度&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8A%A0%E5%AF%86%E6%97%B6%E6%9C%BA">加密时机&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8A%A0%E5%AF%86%E5%88%A4%E6%96%AD">加密判断&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AF%86%E9%92%A5%E5%AD%98%E5%82%A8">密钥存储&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%A7%A3%E5%AF%86%E6%97%B6%E6%9C%BA">解密时机&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%A7%A3%E5%AF%86%E5%88%A4%E6%96%AD">解密判断&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AF%86%E9%92%A5%E6%9D%A5%E6%BA%90">密钥来源&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-3-%E5%85%B6%E4%BB%96%E8%AE%BE%E8%AE%A1">3.3 其他设计&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E4%B8%BB%E5%A4%87%E5%AF%86%E9%92%A5%E5%90%8C%E6%AD%A5">3.2 主备密钥同步&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E7%89%B9%E6%80%A7%E6%BA%90%E7%A0%81">4 特性源码&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#4-1-%E5%8A%9F%E8%83%BD%E6%A6%82%E8%A7%88">4.1 功能概览&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E5%9F%BA%E6%9C%AC%E5%8A%9F%E8%83%BD%E7%AF%87">基本功能篇&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD%E7%AF%87">高级功能篇&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8A%A0%E5%BC%BA%E7%AF%87">加强篇&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-2-%E6%96%B0%E5%A2%9E%E7%B3%BB%E7%BB%9F%E8%A1%A8-pg-key-info">4.2 新增系统表 pg_key_info&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-2-%E6%96%B0%E5%A2%9E%E7%B3%BB%E7%BB%9F%E8%A1%A8-pg-key-data">4.2 新增系统表 pg_key_data&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-3-%E6%96%B0%E5%A2%9E%E8%AF%AD%E6%B3%95-CREATE-KEY">4.3 新增语法 CREATE KEY&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-4-%E6%96%B0%E5%A2%9E%E8%AF%AD%E6%B3%95-CREATE-TABLE-protect-x3D-data-key">4.4 新增语法 CREATE TABLE .. (protect=$data_key)&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-5-%E5%AF%B9%E5%8A%A0%E5%AF%86%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E5%8A%A0%E5%AF%86">4.5 对加密对象的数据进行加密&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83">参考&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-特性背景">1 特性背景&lt;/h1>
&lt;h1 id="2-实现方案">2 实现方案&lt;/h1>
&lt;h2 id="21-系统表">2.1 系统表&lt;/h2>
&lt;h3 id="1-pg_key_info-密钥信息">1. pg_key_info 密钥信息&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>keyoid&lt;/th>
&lt;th>keyname&lt;/th>
&lt;th>type&lt;/th>
&lt;th>alrotithm&lt;/th>
&lt;th>storage&lt;/th>
&lt;th>access&lt;/th>
&lt;th>protect&lt;/th>
&lt;th>create_time&lt;/th>
&lt;th>round&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>mk_1&lt;/td>
&lt;td>master_key&lt;/td>
&lt;td>any&lt;/td>
&lt;td>localkms&lt;/td>
&lt;td>path=./keyfile&lt;/td>
&lt;td>$pass1&lt;/td>
&lt;td>2024/02/01 13:01:01&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>dk_1&lt;/td>
&lt;td>date_key&lt;/td>
&lt;td>aes_256_cbc&lt;/td>
&lt;td>database&lt;/td>
&lt;td>m100.d100.b1.i2&lt;/td>
&lt;td>mk1&lt;/td>
&lt;td>2024/02/01 13:01:01&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="2-pg_key_data-密钥数据">2. pg_key_data 密钥数据&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>oid&lt;/th>
&lt;th>keydata&lt;/th>
&lt;th>algorithm&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>abcd1234&lt;/td>
&lt;td>aes_256&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="3-pg_encryption-加密对象">3. pg_encryption 加密对象&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>type&lt;/th>
&lt;th>name&lt;/th>
&lt;th>oid&lt;/th>
&lt;th>special&lt;/th>
&lt;th>protect&lt;/th>
&lt;th>oldest_round&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>table&lt;/td>
&lt;td>t1&lt;/td>
&lt;td>100&lt;/td>
&lt;td>-&lt;/td>
&lt;td>dk_1&lt;/td>
&lt;td>1&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="22-定义表">2.2 定义表&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>定义表&lt;br>
定义表的语法与非加密表一致，我们通过单独的语法定义ENCRYPTION。&lt;/p></description></item><item><title>PostgreSQL 3-6 Smgr</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-3-smgr/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-3-smgr/</guid><description>&lt;p>接口&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrcreate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">isRedo&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 创建文件
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrdounlink&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">isRedo&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="nf">smgropen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelFileNode&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BackendId&lt;/span> &lt;span class="n">backend&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blocknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">skipFsync&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blocknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">smgrextend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SMgrRelation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blocknum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">skipFsync&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>调用关系&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 索引模块
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nf">btbuildempty&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">smgrwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">metapage&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">_bt_blwritepage&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">smgrwrite&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">spgbuildempty&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">smgrwrite&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">FlushBuffer&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">FlushRelationBuffers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">LocalBufferAlloc&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">smgrwrite&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// FlushBuffer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="o">|-&lt;/span> &lt;span class="nf">BufferAlloc&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// readBuffer时，申请一个buffer，可能调用页面淘汰算法
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="o">|-&lt;/span> &lt;span class="nf">FlushDatabaseBuffers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">FlushRelationBuffers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">FlushOneBuffer&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">FlushBuffer&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// FlushOneBuffer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nf">XLogReadBufferForRedoExtended&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">FlushOneBuffer&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// FlushRelationBuffers
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="o">|-&lt;/span> &lt;span class="nf">heap_sync&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">ATExecSetTableSpace&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// ALTER TABLE SET TABLESPACE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nf">FlushRelationBuffers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// heap_sync when HEAP_INSERT_SKIP_WAL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="o">|-&lt;/span> &lt;span class="nf">intorel_shutdown&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">CopyFrom&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">transientrel_shutdown&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">|-&lt;/span> &lt;span class="nf">ATRewriteTable&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_sync&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// FlushDatabaseBuffers
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nf">dbase_redo&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">FlushDatabaseBuffers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>write时机：&lt;/p>
&lt;ol>
&lt;li>readBuffer时，如果buffer不在内存，且共享缓冲池已满，调用页面置换算法进行刷盘&lt;/li>
&lt;li>alter table set table space&lt;/li>
&lt;li>copy&lt;/li>
&lt;/ol></description></item><item><title>PostgreSQL 3-3 Buffer</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-4-buffer/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-4-buffer/</guid><description>&lt;h1 id="1-buffer基本介绍">1 Buffer基本介绍&lt;/h1>
&lt;h2 id="11-buffer解决的问题">1.1 Buffer解决的问题&lt;/h2>
&lt;p>实际应用场景中，PostgreSQL可能需要1分钟处理数十万次事务，频繁读写Page。Buffer提供以下2个基本功能：&lt;/p>
&lt;ul>
&lt;li>加载Page至内存：PostgreSQL需要读写数时，都需先从磁盘中，将指定的Page加载至内存中，再在内存中操作Page&lt;/li>
&lt;li>缓存常用Page：Page被加载至内存后，还会在内存停留一段时间，降低PostgreSQL直接从磁盘读写Page的频率&lt;/li>
&lt;/ul>
&lt;h2 id="12-buffer的基本功能">1.2 Buffer的基本功能&lt;/h2>
&lt;p>Buffer缓存Page时，需考虑以下几个场景：&lt;/p>
&lt;ul>
&lt;li>插入Page：大部分事务操作表的Page时，先从Buffer中查找Page，如果Page不在Buffer中，再从磁盘读取Page，将其放入Buffer中，再操作Buffer中的Page&lt;/li>
&lt;li>查找Page：访问Page时，通过文件名和Page编号等信息可确定唯一Page&lt;/li>
&lt;li>访问Page：所有事务均可访问Buffer，需考虑多事务并发读写同一Pape的场景&lt;/li>
&lt;li>淘汰Page：Buffer能缓存的Page数量有限，在Page数量过多时，需淘汰一些Page&lt;/li>
&lt;li>落盘Page：Buffer中通常缓存表数据文件的Page，前文提到，事务持久化的标志是WAL日志落盘，因此，Buffer中的Page无需实时落盘，仅需异步落盘即可&lt;/li>
&lt;/ul>
&lt;h1 id="2-buffer的基本原理">2 Buffer的基本原理&lt;/h1>
&lt;h2 id="21-插入page">2.1 插入Page&lt;/h2>
&lt;p>插入Page主要由读Page操作触发，上层函数读取Page的主要流程如下：&lt;/p>
&lt;ol>
&lt;li>上层模块统一调用ReadBuffer()接口，读取指定表的指定Page&lt;/li>
&lt;li>ReadBuffer()中，先从Buffer查找Page，如果找到Page，则直接返回Buffer中的Page&lt;/li>
&lt;li>如果未从Buffer找到Page，现在Buffer中预留存储Page的空间&lt;/li>
&lt;li>之后，调用Smgr模块，从磁盘读取指定Page，并将其放入预留的空间内，再返回Buffer中的Page&lt;/li>
&lt;/ol>
&lt;p>函数调用关系大概如下图所示：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ReadBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadBufferExtended&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadBuffer_common&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BufferAlloc&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 2,3 查找Page，如找到，返回；如未找到，预留存储Page的空间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">smgrread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">..&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 4 如果未找到Page，从磁盘将Page读入预留的Page空间内，返回&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="22-查找page">2.2 查找Page&lt;/h2>
&lt;p>上层函数读Page时，首先进入查找Page阶段。&lt;/p>
&lt;h2 id="11-buffer池模型">1.1 buffer池模型&lt;/h2>
&lt;p>模型：&lt;/p>
&lt;p>&lt;img alt="1" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-4-buffer/1.png">&lt;/p>
&lt;h2 id="12-buffer池接口">1.2 buffer池接口&lt;/h2>
&lt;p>缓冲区接口：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* bufmgr.h */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 1 buffer池管理 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">InitBufferPool&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">InitBufferPoolAccess&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">InitBufferPoolBackend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2 buffer管理 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2.1 读buffer */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Buffer&lt;/span> &lt;span class="nf">ReadBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blockNum&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Buffer&lt;/span> &lt;span class="nf">ReadBufferExtended&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">reln&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forkNum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blockNum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ReadBufferMode&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BufferAccessStrategy&lt;/span> &lt;span class="n">strategy&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Buffer&lt;/span> &lt;span class="nf">ReadBufferWithoutRelcache&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelFileNode&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forkNum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blockNum&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">ReadBufferMode&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BufferAccessStrategy&lt;/span> &lt;span class="n">strategy&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2.2 清理buffer */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">oid&lt;/span> &lt;span class="nf">ReleaseBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">UnlockReleaseBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">MarkBufferDirty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">IncrBufferRefCount&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Buffer&lt;/span> &lt;span class="nf">ReleaseAndReadBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Relation&lt;/span> &lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blockNum&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2.3 刷盘buffer */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">CheckPointBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">flags&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">FlushOneBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">FlushRelationBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">FlushDatabaseBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Oid&lt;/span> &lt;span class="n">dbid&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">BufmgrCommit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">BgBufferSync&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2.4 删除关联buffer */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">DropRelFileNodeBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelFileNodeBackend&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ForkNumber&lt;/span> &lt;span class="n">forkNum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">firstDelBlock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">DropRelFileNodesAllBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelFileNodeBackend&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">rnodes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">nnodes&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">DropDatabaseBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Oid&lt;/span> &lt;span class="n">dbid&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 2.5 锁buffer */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">UnlockBuffers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">LockBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">ConditionalLockBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">LockBufferForCleanup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">ConditionalLockBufferForCleanup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Buffer&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">HoldingBufferPinThatDelaysRecovery&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-buffer调用">1.3 buffer调用&lt;/h2>
&lt;p>&lt;strong>插入数据&lt;/strong>&lt;/p></description></item><item><title>PostgreSQL 3-7 Xlog</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-5-wal/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-5-wal/</guid><description>&lt;h1 id="5-wal落盘">5 wal落盘&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">WalWriterMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">::&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogBackgroundFlush&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LWLockAcquire&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LW_EXCLUSIVE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogWrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LWLockRelease&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CommitTransaction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RecordTransactionCommit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BufmgrCommit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XactLogCommitRecord&lt;/span> &lt;span class="c1"># xlog记录commit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">TransactionTreeSetCommitTsData&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogFlush&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">XactLastRecEnd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">::&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WaitXLogInsertionsToFinish&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogWrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">write&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ResourceOwnerRelease&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AtEOXact_Buffers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AtEOXact_RelationCache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-背景">1.1 背景&lt;/h2>
&lt;p>&lt;a href="https://zhmin.github.io/posts/postgresql-wal-format/">https://zhmin.github.io/posts/postgresql-wal-format/&lt;/a>&lt;br>
wal机制解决的问题：持久性、原子性、性能、数据同步、恢复&lt;/p>
&lt;ul>
&lt;li>
&lt;p>持久性需求：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>执行一次事务/事务块，例如INSERT语句，除了要写数据文件，还需要更新系统表、索引文件、fsm文件、vm文件、事务提交文件等&lt;/p>
&lt;/li>
&lt;li>
&lt;p>为避免故障导致数据丢失，产生的数据写入磁盘才算事务成功&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">应用 数据库 磁盘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. INSERT &lt;span class="o">(&lt;/span>5&lt;span class="o">)&lt;/span> --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 2. 读取数据页 &amp;lt;-- &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 3. 将数据写入数据页
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. 存储数据页 --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 5. 读取索引文件 --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 7. 读取fsm文件 --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 8...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 9. 读取vm文件 --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 10...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 11. INSERT 成功 &amp;lt;-- &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>原子性需求：&lt;/p></description></item><item><title>PostgreSQL 3-2 Transation (v2)</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-tans-ai/</link><pubDate>Fri, 03 Jul 2026 16:51:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-tans-ai/</guid><description>&lt;h1 id="概述">概述&lt;/h1>
&lt;p>假如，2个会话，并发写入数据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>加锁逻辑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_queries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRunMulti&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitPlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitModifyTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitResultRelation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecGetRangeTableRelation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;RowExclusiveLock&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 8级锁，行级排他锁&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relation_open&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockRelationOid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockAcquire&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutePlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInsert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_tuple_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heapam_tuple_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationGetBufferForTuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockBuffer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LWLockAcquire&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;LW_EXCLUSIVE&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 读写锁&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationPutHeapTuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log_heap_insert&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>锁&lt;/p>
&lt;/li>
&lt;li>
&lt;p>HWLock&lt;/p>
&lt;ul>
&lt;li>8级&lt;/li>
&lt;li>relation, index, buffer&lt;/li>
&lt;li>死锁检测&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h2 id="lwlocks">LWLocks&lt;/h2>
&lt;ul>
&lt;li>buffer&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>SpinLock&lt;/p>
&lt;/li>
&lt;li>
&lt;p>PresicateLock&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="hwlock">HWLock&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>锁&lt;/th>
&lt;th>取值&lt;/th>
&lt;th>操作&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>AccessShareLock&lt;/td>
&lt;td>1&lt;/td>
&lt;td>SELECT&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RowShareLock&lt;/td>
&lt;td>2&lt;/td>
&lt;td>SELECT FOR UPDATE/SHARE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RowExclusiveLock&lt;/td>
&lt;td>3&lt;/td>
&lt;td>INSERT/UPDATE/DELETE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareUpdateExclusiveLock&lt;/td>
&lt;td>4&lt;/td>
&lt;td>VACUUM/ANALYZE/CRATE INDEX CONCURRENTLY&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareLock&lt;/td>
&lt;td>5&lt;/td>
&lt;td>CREATE INDEX&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareRowExclusiveLock&lt;/td>
&lt;td>6&lt;/td>
&lt;td>row share&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ExclusiveLock&lt;/td>
&lt;td>7&lt;/td>
&lt;td>block ROW SHARE/SELECT FOR UPDATE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AccessExclusiveLock&lt;/td>
&lt;td>8&lt;/td>
&lt;td>ALTER TABLE/DROP TABLE/VACUUM FULL&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">LockRelationOid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LockAcquireExtended
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hash_search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所有进程共享&lt;/p></description></item><item><title>PostgreSQL 3-2 Transation</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-transaction/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-transaction/</guid><description>&lt;h1 id="1-事务的概念">1 事务的概念&lt;/h1>
&lt;h2 id="11-事务的基本特性">1.1 事务的基本特性&lt;/h2>
&lt;p>事务的4个特性：&lt;/p>
&lt;ul>
&lt;li>原子性 Automicity&lt;/li>
&lt;li>一致性 Consistency&lt;/li>
&lt;li>隔离性 Isolation&lt;/li>
&lt;li>持久性 Durability&lt;/li>
&lt;/ul>
&lt;h2 id="12-事务的隔离性">1.2 事务的隔离性&lt;/h2>
&lt;p>不同隔离级别下，可能出现的异常如下：（T 表示可能）&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>异常&lt;/th>
&lt;th>读未提交&lt;/th>
&lt;th>读已提交&lt;/th>
&lt;th>可重复读&lt;/th>
&lt;th>可串行化&lt;/th>
&lt;th>解释&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>脏读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>读其他事务未提交数据&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>不可重复读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>2次读取数据不一致&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>幻读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>2次读取数据条数不一致&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>postgresql默认的隔离级别是读已提交&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 查看默认事务隔离级别
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">show&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">default_transaction_isolation&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">default_transaction_isolation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">read&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">committed&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查询当前的事务快照 pg 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">txid_current_snapshot&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">txid_current_snapshot&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-----------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1081&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">1081&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查询所有正在活跃的进程
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_activity&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">--
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-事务的实现">1.3 事务的实现&lt;/h2>
&lt;p>为实现事务，有3种并发控制机制：&lt;/p></description></item><item><title>PostgreSQL 3-5 FSM</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-7-fsm/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-7-fsm/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-思想">1.1 思想&lt;/h2>
&lt;p>&lt;strong>fsm结构&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>用数组表示完全二叉树&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="m">8&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">8&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">8&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="12-fsm涉及">1.2 FSM涉及&lt;/h2>
&lt;p>&lt;strong>物理页号&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> +-------+-------+-------+-------+-------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FSMFile &lt;span class="p">|&lt;/span> 8k &lt;span class="p">|&lt;/span> 8k &lt;span class="p">|&lt;/span> 8k &lt;span class="p">|&lt;/span> 8k &lt;span class="p">|&lt;/span> ... &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------+-------+-------+-------+-------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FSMBlock &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="p">|&lt;/span> ... &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------+-------+-------+-------+-------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>逻辑页号&lt;/strong>&lt;br>
第2层：1个FSMBlock&lt;br>
第1层：4069个FSMBlock&lt;br>
第0层：4069 * 4069个FSMBlock，每个FSM可映射4069个DataBlock&lt;br>
FSMAddress: [层次，页号]，页号即FSMBlock号&lt;br>
每个表最大容量是32T，只需3层也页面即可管理整个表的空闲空间&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># [FSMAddress.level, FSMAddress.logpageno, FSMBlockNum（1个page即1个FSMBlock）]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>2,0,0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +---------------------------+---------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>1,0,1&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>1,1,1*4070+1&lt;span class="o">]&lt;/span> ... &lt;span class="o">[&lt;/span>1,4069,4069*4070+1&lt;span class="o">]&lt;/span> 本层共4069个FSMBlock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +----------+------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>2,0,1+1&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>2,1,1+2&lt;span class="o">]&lt;/span> ... &lt;span class="o">[&lt;/span>2,2,1+4069&lt;span class="o">]&lt;/span> ...... 本层共4069*4069个FSMBlock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">（映射DataBlock &lt;span class="m">0&lt;/span> ~ 4065）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>整体架构&lt;/strong>&lt;br>
3层FSMBlock&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>8&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>8&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>8&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> 0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>测试&lt;/p></description></item><item><title>PostgreSQL 3-10 VM</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-9-vm/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-9-vm/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-vm接口调用点">1.1 vm接口调用点&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">heap_insert&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buffer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">RelationGetBufferForTuple&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationPutHeapTuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">heaptup&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">PageIsAllVisible&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageClearAllVisible&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">visibilitymap_clear&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">ItemPointerGetBlockNumber&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heaptup&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">vmbuffer&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">MarkBufferDirty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define PageIsAllVisible(page) ((page)-&amp;gt;pd_flags &amp;amp; PD_ALL_VISIBLE)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-vm模块对外接口">1.2 vm模块对外接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">visibilitymap_clear&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">buf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">uint8&lt;/span> &lt;span class="n">flags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">mapByte&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HEAPBLK_TO_MAPBYTE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heapBlk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LockBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BUFFER_LOCK_EXCLUSIVE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">map&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">PageGetContents&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">map&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">mapByte&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-vmmap结构与定位">1.3 vmmap结构与定位&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 8192 - 24 = 8168 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 1字节 2bit表示1页 : | 00 00 00 00 | */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define BITS_PER_BYTE 8
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define BITS_PER_HEAPBLOCK 2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="cm">/* 1字节 可映射4个heapblock */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define HEAPBLOCKS_PER_BYTE (BITS_PER_BYTE / BITS_PER_HEAPBLOCK)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 计算heapblock对应的vmblock, vmbyte, vmoffset的位置 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 1vmblock可映射4 * 8168个datablock */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define HEAPBLOCKS_PER_PAGE (MAPSIZE * HEAPBLOCKS_PER_BYTE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define HEAPBLK_TO_MAPBLOCK(x) ((x) / HEAPBLOCKS_PER_PAGE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define HEAPBLK_TO_MAPBYTE(x) (((x) % HEAPBLOCKS_PER_PAGE) / HEAPBLOCKS_PER_BYTE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define HEAPBLK_TO_OFFSET(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define VISIBILITYMAP_ALL_VISIBLE 0x01
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define VISIBILITYMAP_ALL_FROZEN 0x02
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define VISIBILITYMAP_VALID_BITS 0x03
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="14-vmblock读写">1.4 vmblock读写&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">vm_extend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">vm_nblocks&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PGAlignedBlock&lt;/span> &lt;span class="n">pg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageInit&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">Page&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">pg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BLCKSZ&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LockRelationForExtension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ExclusiveLock&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">vm_nblocks_now&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">smgrnblocks&lt;/span>&lt;span class="err">（&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_smgr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">VISIBILITYMAP_FORKNUM&lt;/span>&lt;span class="err">）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">vm_nblocks_now&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">vm_nblocks&lt;/span>&lt;span class="err">：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageSetChecksumInplace&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">Page&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">pg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vm_nblocks_now&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">smgrextend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_smgr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">VISIBILITYMAP_FORKNUM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vm_nblocks_now&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">vm_nblocks_now&lt;/span>&lt;span class="o">++&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 让其他postgres进程smgrclose(rel) */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">CacheInvalidateSmgr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_smgr&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">smgr_rnode&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SharedInvalidationMessage&lt;/span> &lt;span class="n">msg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">msg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sm&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SHAREDINVALSMGR_ID&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">msg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sm&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">backend_hi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">backend&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">msg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sm&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">backend_lo&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">backend&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0xffff&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">msg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sm&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">rnode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">rnode&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">VALGRIND_MAKE_MEM_DEFINED&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">SendSharedInvalidMessages&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_smgr&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">smgr_vm_nblocks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">vm_nblocks_now&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">UnlockRelationForExtension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ExclusiveLock&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Buffer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">vm_readbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">blkno&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">extend&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">RelationOpenSmgr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">blkno&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rd_smgr&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">smgr_vm_nblocks&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nl">extend&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vm_extend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">blkno&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ReadBufferExtended&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span> &lt;span class="p">,&lt;/span> &lt;span class="n">VISIBILITYMAP_FORKNUM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">blkno&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">RBM_ZERO_ON_ERROR&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">PageIsNew&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageInit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BLKSZ&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">buf&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="15-vm模块对外接口">1.5 vm模块对外接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">visibilitymap_set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">heapBuf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">XLogRecPtr&lt;/span> &lt;span class="n">recptr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">vmBuf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TransactionId&lt;/span> &lt;span class="n">cutoff_xid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">uint8&lt;/span> &lt;span class="n">flags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">uint8&lt;/span> &lt;span class="nf">visibilitymap_get_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">vmbuf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">visibilitymap_clear&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">vmbuf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">uint8&lt;/span> &lt;span class="n">flags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 每个heapblock有3种状态 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">uint8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">visibilitymap_get_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">mapBlock&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HEAPBLK_TO_MAPBLOCK&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heapBlk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint32&lt;/span> &lt;span class="n">mapByte&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HEAPBLK_TO_MAPBYTE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heapBlk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint8&lt;/span> &lt;span class="n">mapOffset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HEAPBLK_TO_OFFSET&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">heapBlk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 比较传入的buf和计算的mapblock是否为同一个 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">BufferIsValid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">BufferGetBlockNumber&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nl">mapBlock&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">InvalidBuffer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">!&lt;/span>&lt;span class="nf">BufferIsValid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">vm_readbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mapBlock&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">map&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">PageGetContents&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">BufferGetPage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">buf&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 每个heapbuf有01 10 11共3种状态 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">unit8&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">mapByte&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">mapOffset&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">VISIBILITYMAP_VALID_BITS&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">uint8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">visibilitymap_set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">rel&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">BlockNumber&lt;/span> &lt;span class="n">heapBlk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">heapBuf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">XLogRecPtr&lt;/span> &lt;span class="n">recptr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Buffer&lt;/span> &lt;span class="n">vmBuf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TransactionId&lt;/span> &lt;span class="n">cutoff_xid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">uint8&lt;/span> &lt;span class="n">flags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL 3-1 Heapam</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-10-heapam/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-10-heapam/</guid><description>&lt;h1 id="1-heamp的简介">1 heamp的简介&lt;/h1>
&lt;p>前置知识：Relation的基本概念，Tuple的基本概念&lt;/p>
&lt;h2 id="11-heapam接口的功能">1.1 heapam接口的功能&lt;/h2>
&lt;p>heapam是存储模块对上层提供的数据读写接口，这些接口通常是操作1个relation中的1个或多个tuple。&lt;br>
本文介绍以下4个最常用的接口，即如何向1个relation中写入、删除、更新、读取1个Tuple，接口定义如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 向relatiion中写入1条tuple */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HeapTuple&lt;/span> &lt;span class="n">tup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">...)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 从relation中删除1条tuple */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">heap_delete&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ItemPointer&lt;/span> &lt;span class="n">tid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">...)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 在relation中，将旧tuple标记删除，并写入1个新tuple */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">heap_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ItemPointer&lt;/span> &lt;span class="n">otid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HeapTuple&lt;/span> &lt;span class="n">newtup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">...)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 从relation中读取数据，每次读取1条数据 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">HeapScanDesc&lt;/span> &lt;span class="nf">heap_beginscan&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Relation&lt;/span> &lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">...)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">HeapTuple&lt;/span> &lt;span class="nf">heap_getnext&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HeapScanDesc&lt;/span> &lt;span class="n">scan&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-调用heapam接口">1.2 调用heapam接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * 此处，以4个常见的SQL为例，介绍数据库如何调用heapam接口
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * 1. INSERT INTO t1 VALUES (1, &amp;#39;data1&amp;#39;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * 2. SELECT * FROM t1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * 3. DELETE FROM t1 WHERE c1 = 1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * 4. UPDATE t1 SET c2 = &amp;#39;data2&amp;#39; WHERE c1 = 1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">exec_simple_query&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;SQL语句&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cm">/* 该函数是所有SQL语句的统一处理入口 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PortalRun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PortalRunMulti&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ProcessQuery&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecutorRun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">standard_ExecutorRun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecutePlan&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecProcNode&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="cm">/* 从这里开始分叉，不同类型的SQL语句，由不同函数处理 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecModifyTable&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecInsert&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="cm">/* 处理：INSERT INTO t1 VALUES (1, &amp;#39;data1&amp;#39;) */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">..)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-heapam接口的使用场景">1.3 heapam接口的使用场景&lt;/h2>
&lt;p>实际应用场景中，数据库的存储模块需满足以下关键需求：&lt;/p></description></item><item><title>PostgreSQL 3-8 Index</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-11-index/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-11-index/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-%E8%83%8C%E6%99%AF">1 背景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-1-%E6%95%B0%E6%8D%AE%E6%A3%80%E7%B4%A2">1.1 数据检索&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-%E7%B4%A2%E5%BC%95%E6%A6%82%E8%BF%B0">1 索引概述&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E6%A6%82%E8%BF%B0">1.1 概述&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E7%B4%A2%E5%BC%95%E5%87%BD%E6%95%B0">1.2 索引函数&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-2-1-%E8%B0%83%E7%94%A8%E7%B4%A2%E5%BC%95%E5%87%BD%E6%95%B0">1.2.1 调用索引函数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-2-%E7%B4%A2%E5%BC%95%E5%87%BD%E6%95%B0">1.2.2 索引函数&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E7%B4%A2%E5%BC%95%E5%AE%9E%E7%8E%B0">2 索引实现&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95-ambuild">2.1 创建索引 ambuild&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81build%E6%95%B4%E4%BD%93%E6%B5%81%E7%A8%8B">一、build整体流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81build%E6%8F%92%E5%85%A5tuple">二、build插入tuple&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-2-%E7%B4%A2%E5%BC%95%E5%86%99%E5%85%A5%E6%95%B0%E6%8D%AE-aminsert">2.2 索引写入数据 aminsert&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-operate">3 operate&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-背景">1 背景&lt;/h1>
&lt;h1 id="11-数据检索">1.1 数据检索&lt;/h1>
&lt;p>通常，应用会使用数据库存储大量数据，比如，单个表存储上百万、甚至上百亿条数据。此时，对表中数据进行某些查询时，将变得非常困难，比如等值查询、范围查询、模糊查询等。&lt;/p>
&lt;h1 id="1-索引概述">1 索引概述&lt;/h1>
&lt;h2 id="11-概述">1.1 概述&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>索引方式：postgresql共有5种索引&lt;/p>
&lt;ul>
&lt;li>
&lt;p>唯一索引：不能出现重复的值&lt;/p>
&lt;/li>
&lt;li>
&lt;p>主键索引：主键自动创建唯一索引&lt;/p>
&lt;/li>
&lt;li>
&lt;p>多属性索引：多个列（最多32列）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>部分索引：WHERE过滤索引&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 示例
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INDEX&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>表达式索引：和部分索引没太大区别，都是额外调用1个函数&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 示例
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INDEX&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>索引分类：postgresql有多种索引，本文见介绍以下4种&lt;/p>
&lt;ul>
&lt;li>btree&lt;/li>
&lt;li>hash&lt;/li>
&lt;li>gist&lt;/li>
&lt;li>gin&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>索引系统表&lt;/p>
&lt;ul>
&lt;li>
&lt;p>pg_am：存储所有索引的方法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_am&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">amname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">amhandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">amtype&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-------+-------------+--------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">btree&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">bthandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">hash&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">hashhandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">gist&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gisthandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">gin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ginhandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">spgist&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">spghandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">brin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">brinhandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>pg_index：存储所有索引，索引列的下标&lt;/p></description></item><item><title>PostgreSQL 3-9 Vacuum</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-12-vacuum/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-12-vacuum/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">reltuples&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relhasoids&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_class&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- reltuples = 0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_relation_filepath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- oid = filepath = relfilenode
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">vacuum&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">full&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">reltuples&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relhasoids&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_class&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- oid 不变, reltuples = 0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- oid != filepath = relfilenode !=
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">analyze&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- reltuples = 2，即有效tuple
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>
&lt;p>启动autovacuum进程&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">standard_ProcessUtility&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Node&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">parsetree&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">T_VacuumStmt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ExecVacuum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">VacuumStmt&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">vacstmt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vacuum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RangeVar&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Oid&lt;/span> &lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">VacuumParams&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ServerLoop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">StartAutoVacLauncher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">AutoVacLauncherMain&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* if fail: 发送信号重启aotuvacuum进程 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">SendPostmasterSignal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PMSIGNAL_START_AUTOVAC_WORKER&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">sigusr1_handler&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SIGNAL_ARGS&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">CheckPostmasterSignal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PMSIGNAL_START_AUTOVAC_WORKER&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">StartAutovacuumWorker&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Backend&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">bn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">malloc&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bn&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">pid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">StartAutoVacWorker&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">AutoVacWorkerMain&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">argc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[])()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">BaseInit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">InitPostgres&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dbid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">InvalidOid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dbname&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">do_autovacuum&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">autovacuum_do_vac_analyze&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">autovac_table&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tab&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vacuum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RangeVar&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Oid&lt;/span> &lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">VacuumParams&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">proc_exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">dlist_push_head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">BackendList&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">bn&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">elem&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>查找所有待vacuum的表&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">do_autovacuum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cm">/* table-by-table */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">StartTransactionCommand&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 查询pg_database系统表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tuple&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">SearchSysCache1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DATABASEOID&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 打开pg_class系统表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">classRel&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RelationRelationId&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_class_desc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">CreateTupleDescCopy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">RelationGetDescr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">classRel&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 为toast表创建hash表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_toast_map&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">hash_create&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 遍历pg_class系统表，记录所有需要vacuum和analyze的普通表和系统表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relScan&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_beginscan_catalog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">classRel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">tuple&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_getnext&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relScan&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Form_pg_class&lt;/span> &lt;span class="n">classForm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Form_pg_class&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">GETSTRUCT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HeapTupleGetOid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relopts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">extract_autovac_opts&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pg_class_desc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tabentry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_pgstat_tabentry_relid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">classForm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">relisshared&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 检查表是否需要被vacuum和analyze */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">relation_needs_vacanalyze&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relopts&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">classForm&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tabentry&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dovacuum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">doanalyze&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">dovacuum&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nl">doanalyze&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 普通表加入list中 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_oids&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">lappend_oid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">table_oids&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* toast表加入hash表中 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">OidIsValid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">classForm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">reltoastrelid&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hentry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">hash_search&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">table_toast_map&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">classForm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">reltoastrelid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HASH_ENTER&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hentry&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">ar_relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">relid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">eap_endscan&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relScan&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 第二次遍历pg_class系统表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relScan&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_beginscan_catalog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">classRel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">tuple&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">heap_getnext&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relScan&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Form_pg_class&lt;/span> &lt;span class="n">classForm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Form_pg_class&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">GETSTRUCT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">HeapTupleGetOid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relopts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">extract_autovac_opts&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tuple&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pg_class_desc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bstrategy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">GetAccessStrategy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BAS_VACUUM&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 开始遍历所有list中的表 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">foreach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cell&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">table_oids&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Oid&lt;/span> &lt;span class="n">relid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">lfirst_oid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cell&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 再次检查是否仍需vacuum */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tab&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">table_recheck_autovac&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">table_toast_map&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pg_class_desc&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">tab&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MyWorkerInfo&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">wi_tableoid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">relid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">autovac_balance_cost&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">AutoVacuumUpdateDelay&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">autovacuum_do_vac_analyze&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tab&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bstrategy&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vac_update_datfrozenxid&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">CommitTransactionCommand&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>对单个表进行vacuum&lt;/p></description></item><item><title>PostgreSQL 3-13 逻辑复制测试记录</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication-test/</link><pubDate>Thu, 21 May 2026 17:38:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication-test/</guid><description>&lt;h1 id="1-本地自测">1 本地自测&lt;/h1>
&lt;h2 id="11-快速tpcc">1.1 快速tpcc&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vkill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf &lt;span class="nv">$GAUSSHOME&lt;/span>/data*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w100_t200/data $GAUSSHOME/data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w100_t200/data1 $GAUSSHOME/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w5/data &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w5/data1 &lt;span class="nv">$GAUSSHOME&lt;/span>/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w100/data $GAUSSHOME/data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w100/data1 $GAUSSHOME/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb_guc set -D $GAUSSHOME/data -c &amp;#34;enable_ddl_logical_decode=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb_guc set -D $GAUSSHOME/data1 -c &amp;#34;enable_ddl_logical_decode=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb_guc set -D $GAUSSHOME/data1 -c &amp;#34;max_replication_slots=50&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb_guc set -D $GAUSSHOME/data1 -c &amp;#34;max_background_workers=50&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb_guc set -D $GAUSSHOME/data1 -c &amp;#34;max_logical_replication_workers=50&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;max_connections=4000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;enable_audit=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;audit_buffer_size=262144&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;audit_directory_size=1073741824&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 五、发布端（发布）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION pub1 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # 六、订阅端（订阅）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S &lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/bin -o subscription
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=220);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vsql -d pubdb -p 65000 -r&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># \q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cd ~/tpcc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># source envbm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ./toolbm run vpub&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 换窗口查询&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景一：验证内存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM gs_thread_memory_context ORDER BY totalsize DESC limit 30;&amp;#34;&lt;/span> &amp;gt; start_pub.mem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM gs_shared_memory_detail ORDER BY totalsize DESC limit 30;;&amp;#34;&lt;/span> &amp;gt;&amp;gt; start_pub.mem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM gs_thread_memory_context ORDER BY totalsize DESC limit 30;;&amp;#34;&lt;/span> &amp;gt; start_sub.mem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM gs_shared_memory_detail ORDER BY totalsize DESC limit 30;;&amp;#34;&lt;/span> &amp;gt;&amp;gt; start_sub.mem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景八：验证数据一致性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE IF EXISTS tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE tcnt (c1 TEXT,c2 INT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE IF EXISTS tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE tcnt (c1 TEXT,c2 INT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> t in bmsql_config bmsql_customer bmsql_district bmsql_history bmsql_item bmsql_new_order bmsql_oorder bmsql_order_line bmsql_stock bmsql_warehouse&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;INSERT INTO tcnt VALUES(&amp;#39;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#39;, (SELECT count(1) FROM &lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">));&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> t in bmsql_config bmsql_customer bmsql_district bmsql_history bmsql_item bmsql_new_order bmsql_oorder bmsql_order_line bmsql_stock bmsql_warehouse&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;INSERT INTO tcnt VALUES(&amp;#39;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#39;, (SELECT count(1) FROM &lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">));&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM tcnt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景一：重启订阅端（kill）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ps ux &lt;span class="p">|&lt;/span> grep &lt;span class="s1">&amp;#39;vastbase.*-D.*/data1&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -v grep &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> xargs &lt;span class="nb">kill&lt;/span> -9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep &lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景二：重启订阅端(stop)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vb_ctl stop -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep &lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景三：重启发布端&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl stop -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sleep &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl restart -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景三：重建 subscription&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP SUBSCRIPTION sub1;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=20);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP SUBSCRIPTION sub1;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=20);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM pg_subscription_rel&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SELECT pg_wal_lsn_diff&lt;span class="o">(&lt;/span>pg_current_wal_lsn&lt;span class="o">()&lt;/span>, &lt;span class="s1">&amp;#39;0/0&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span> / &lt;span class="o">(&lt;/span>&lt;span class="m">1024&lt;/span> * 1024&lt;span class="o">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景五：ddl&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;\d&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;\d&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE bmsql_warehouse&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t3(c1 INT)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;\d&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;\d&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 场景六：多个发布订阅&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db3;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db3 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t3(c1 INT PRIMARY KEY, c2 TEXT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db3 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION pub3 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db3 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot3&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db3;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db3 -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t3(c1 INT PRIMARY KEY, c2 TEXT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db3 -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub3 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=db3 user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub3 WITH (create_slot=false, slot_name = &amp;#39;pslot3&amp;#39;, copy_data = false, worker_number=20);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP SUBSCRIPTION sub1;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> vsql -d db3 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;BEGIN; INSERT INTO t3 VALUES(&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">,&amp;#39;a&amp;#39;); UPDATE t3 SET c2=&amp;#39;b&amp;#39; WHERE c1=&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">-1; COMMIT;&amp;#34;&lt;/span> &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nb">wait&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 跑10分钟&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./toolbm run vpub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP SUBSCRIPTION sub1;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> t in bmsql_config bmsql_customer bmsql_district bmsql_history bmsql_item bmsql_new_order bmsql_oorder bmsql_order_line bmsql_stock bmsql_warehouse&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;TRUNCATE &lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="续点重传">续点重传&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vkill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf &lt;span class="nv">$GAUSSHOME&lt;/span>/data*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w5/data $GAUSSHOME/data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cp -r ~/w5/data1 $GAUSSHOME/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w100/data &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w100/data1 &lt;span class="nv">$GAUSSHOME&lt;/span>/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;max_connections=4000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 五、发布端（发布）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION pub1 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # 六、订阅端（订阅）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S &lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/bin -o subscription
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=220);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vsql -d pubdb -p 65000 -r&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># \q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ./toolbm run vpub&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启订阅端（kill）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">------------------------------------------------------------------------------------&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ps ux &lt;span class="p">|&lt;/span> grep &lt;span class="s1">&amp;#39;vastbase.*-D.*/data1&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -v grep &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> xargs &lt;span class="nb">kill&lt;/span> -9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep &lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span> &amp;gt;&amp;gt; a.out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT * FROM pg_get_replication_slots(); &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_current_wal_lsn();&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证数据一致性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE IF EXISTS tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE tcnt (c1 TEXT,c2 INT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE IF EXISTS tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE tcnt (c1 TEXT,c2 INT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> t in bmsql_config bmsql_customer bmsql_district bmsql_history bmsql_item bmsql_new_order bmsql_oorder bmsql_order_line bmsql_stock bmsql_warehouse&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;INSERT INTO tcnt VALUES(&amp;#39;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#39;, (SELECT count(1) FROM &lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">));&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> t in bmsql_config bmsql_customer bmsql_district bmsql_history bmsql_item bmsql_new_order bmsql_oorder bmsql_order_line bmsql_stock bmsql_warehouse&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;INSERT INTO tcnt VALUES(&amp;#39;&lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">&amp;#39;, (SELECT count(1) FROM &lt;/span>&lt;span class="nv">$t&lt;/span>&lt;span class="s2">));&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM tcnt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM tcnt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- ===================== worker_number =======================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">400&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub6&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub6&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ===================== copy_data =======================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- do truncate fist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub21&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_subscription_rel&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub21&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- copy and stop
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ===================== cache file =======================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1. drop subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 2. kill progress
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ===================== 断点续传 =======================
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">50000&lt;/span> -c &lt;span class="s2">&amp;#34;DROP TABLE IF EXISTS t1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">50000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t1(c1 INT, c2 TEXT)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> vsql -d postgres -p &lt;span class="m">50000&lt;/span> -c &lt;span class="s2">&amp;#34;BEGIN; INSERT INTO t1 VALUES(&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">,&amp;#39;a&amp;#39;); UPDATE t1 SET c2=&amp;#39;b&amp;#39; WHERE c1=&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">-1; COMMIT;&amp;#34;&lt;/span> &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">50000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM t1 ORDER BY c1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="parallel_applysource">parallel_apply.source&lt;/h2>
&lt;h3 id="1-自测">1 自测&lt;/h3>
&lt;h3 id="批量验证">批量验证&lt;/h3>
&lt;h4 id="初始化模板">初始化模板&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;port=64000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_connection=2000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_replication_slots=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_background_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_logical_replication_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">sed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 sha256\n&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 sha256&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="insert性能">insert性能&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_create_logical_replication_slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgoutput&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">80&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_parallel_apply_stat&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">truncate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">truncate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">datname&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_activity&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">datname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pubdb&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="多个发布订阅">多个发布订阅&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_replication_slots=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_background_workers=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_logical_replication_workers=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">VDATA&lt;/span>&lt;span class="o">=&lt;/span>~/g100/rep/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vkill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf ~/g100/rep/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/g100/rep/temp ~/g100/rep/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;enable_ddl_logical_decode=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_wal_senders=36&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_replication_slots=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_background_workers=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_logical_replication_workers=256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data -c &lt;span class="s2">&amp;#34;max_connections=1000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vstart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf ~/g100/rep/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D ~/g100/rep/data1 -c &lt;span class="s2">&amp;#34;port=65000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/g100/rep/temp ~/g100/rep/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D ~/g100/rep/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 发布&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE USER pu1 REPLICATION SYSADMIN LOGIN ENCRYPTED PASSWORD &amp;#39;pu1.12345&amp;#39;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 11&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d postgres -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE pubdb&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t1(c1 INT PRIMARY KEY, c2 TEXT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION pub&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2"> FOR all tables;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT pg_create_logical_replication_slot(&amp;#39;pslot&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5 load data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 11&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> j in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 10&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;BEGIN; INSERT INTO t1 VALUES(&lt;/span>&lt;span class="nv">$j&lt;/span>&lt;span class="s2">,&amp;#39;a&amp;#39;); UPDATE t1 SET c2=&amp;#39;b&amp;#39; WHERE c1=&lt;/span>&lt;span class="nv">$j&lt;/span>&lt;span class="s2">-1; COMMIT;&amp;#34;&lt;/span> &lt;span class="p">&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nb">wait&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 订阅&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S &lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/bin -o subscription
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 11&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d postgres -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE subdb&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d subdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE TABLE t1(c1 INT PRIMARY KEY, c2 TEXT);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d subdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2"> CONNECTION &amp;#39;host=127.0.0.1 port=64001 dbname=pubdb&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2"> user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2"> WITH (create_slot=false, slot_name = &amp;#39;pslot&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="s2">&amp;#39;, copy_data = false, worker_number=30);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sleep &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 6 check&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 11&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d pubdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT count(1) FROM t1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 11&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> vsql -d subdb&lt;span class="nv">$i&lt;/span> -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT count(1) FROM t1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT * FROM pg_get_replication_slots();&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 7 cleanup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DROP SUBSCRIPTION sub1&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">\c&lt;/span> postgres
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DROP DATABASE IF EXISTS pubdb&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DROP DATABASE IF EXISTS subdb&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DROP USER pu1&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="copydata">copydata&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;port=65000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_ctl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">start&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- pub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- CREATE PUBLICATION pub1 FOR TABLE t1,t2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- INSERT INTO t1 VALUES(1,&amp;#39;a&amp;#39;),(2,&amp;#39;b&amp;#39;),(3,&amp;#39;c&amp;#39;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 (c1,c2) SELECT i,&amp;#39;BASE_&amp;#39; || i || &amp;#39;_&amp;#39; || repeat(&amp;#39;X&amp;#39;, 13000) FROM generate_series(1, 10000) AS i;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- for i in $(seq 0 1000); do vsql -d pubdb -p 64000 -c &amp;#34;INSERT INTO t1 VALUES($i,&amp;#39;a&amp;#39;); &amp;#34; ; done
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- \! for i in $(seq 20000 20010); do vsql -d pubdb -p 64000 -c &amp;#34;INSERT INTO t1 VALUES($i,&amp;#39;a&amp;#39;); &amp;#34; ; done
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_parallel_apply_stat&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT count(1) FROM t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT count(1) FROM t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_replication_slots&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="ddl">ddl&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;enable_ddl_logical_decode=on&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;port=65000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_ctl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">start&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- pub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">publish&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;insert,update,delete,truncate&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ddl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;all&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- CREATE PUBLICATION pub1 FOR TABLE t1,t2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- INSERT INTO t1 VALUES(1,&amp;#39;a&amp;#39;),(2,&amp;#39;b&amp;#39;),(3,&amp;#39;c&amp;#39;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;TRUNCATE t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;DROP TABLE t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_replication_slots&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="sub-txn--ddl">sub-txn + ddl&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;enable_ddl_logical_decode=on&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;port=65000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_ctl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">start&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- pub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">publish&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;insert,update,delete,truncate&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ddl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;all&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- CREATE PUBLICATION pub1 FOR TABLE t1,t2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;TRUNCATE t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;DROP TABLE t1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;BEGIN; CREATE TABLE t3(c1 int); SAVEPOINT sp1; INSERT INTO t3 VALUES(3); SAVEPOINT sp2; TRUNCATE t3; SAVEPOINT sp3; COMMIT;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_replication_slots&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="disable">disable&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">export&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VDATA&lt;/span>&lt;span class="o">=~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">rf&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">cp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;port=65000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_ctl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">start&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~/&lt;/span>&lt;span class="n">g100&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rep&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">data1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- pub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ddl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;all&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- CREATE PUBLICATION pub1 FOR TABLE t1,t2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">65000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- sub
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- SELECT * FROM pg_replication_slots;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_subscription&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DISABLE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">64000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;INSERT INTO t1 VALUES(4,&amp;#39;a&amp;#39;),(5,&amp;#39;b&amp;#39;),(6,&amp;#39;c&amp;#39;);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENABLE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_replication_slots&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="基础场景">基础场景&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vinit&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 config
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_replication_slots=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_background_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_logical_replication_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">sed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 sha256\n&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 sha256&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 startup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_create_logical_replication_slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgoutput&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 create subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=127.0.0.1 port=50001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- , worker_number=30
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 172.16.103.90
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;d&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;e&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;f&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;d&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 load data
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">for&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">seq&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">do&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;BEGIN; INSERT INTO t1 VALUES($i,&amp;#39;a&amp;#39;); UPDATE t1 SET c2=&amp;#39;b&amp;#39; WHERE c1=$i-1; COMMIT;&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">dev&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">null&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">done&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">wait&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 check subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Irn&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;rows&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grep&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Irn&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;rows&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">diff&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cat&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rm&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">out&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 7 cleanup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="空库feedback">空库feedback&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vkill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf &lt;span class="nv">$GAUSSHOME&lt;/span>/data*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w5/data &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/w5/data1 &lt;span class="nv">$GAUSSHOME&lt;/span>/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1 -c &lt;span class="s2">&amp;#34;max_connections=4000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl start -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 五、发布端（发布）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION pub1 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;pslot1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db1&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db2&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db1 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION p1 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db1 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;ps1&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db2 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE PUBLICATION p2 FOR all tables WITH (ddl=&amp;#39;all&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db2 -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34; SELECT pg_create_logical_replication_slot(&amp;#39;ps2&amp;#39;, &amp;#39;pgoutput&amp;#39;);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 六、订阅端（订阅）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S &lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/bin -o subscription
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=220);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db1&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE DATABASE db2&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db1 -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION s1 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=db1 user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION p1 WITH (create_slot=false, slot_name = &amp;#39;ps1&amp;#39;, copy_data = false, worker_number=220);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d db2 -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION s2 CONNECTION &amp;#39;host=172.16.103.90 port=64001 dbname=db2 user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION p2 WITH (create_slot=false, slot_name = &amp;#39;ps2&amp;#39;, copy_data = false, worker_number=220);&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;CREATE VIEW pstat AS SELECT slot_name,active,confirmed_flush, (pg_wal_lsn_diff(confirmed_flush, &amp;#39;0/0&amp;#39;) / (1024 * 1024))::int as confirmed_lsn FROM pg_get_replication_slots();&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看复制进度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM pstat&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看速度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT (pg_wal_lsn_diff(pg_current_wal_lsn(), &amp;#39;0/0&amp;#39;) / (1024 * 1024))::int as mb&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">65000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d pubdb -p &lt;span class="m">64000&lt;/span> -c &lt;span class="s2">&amp;#34;SELECT * FROM vb_parallel_apply_stat()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="子事务">子事务&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> 这是一个基于opengauss开发的数据
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> 我已经设置了一些alias命令。全量编译vcmake。增量编译：vrecmake。启动集群：vinit, vstart。强制停止集群：vkill。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">3.&lt;/span> core文件目录：/data/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">4.&lt;/span> 并行逻辑复制关键代码：parallel_apply.cpp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">5.&lt;/span> $GAUSSHOME也就是install目录下，所有文件都是临时生成的，随便动
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vinit&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 config
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_replication_slots=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_background_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_logical_replication_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;enable_audit=on&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;audit_buffer_size=262144&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;audit_directory_size=1073741824&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">sed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 sha256\n&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 sha256&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 startup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_create_logical_replication_slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgoutput&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 create subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;CREATE SUBSCRIPTION sub1 CONNECTION &amp;#39;host=127.0.0.1 port=50001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39; PUBLICATION pub1 WITH (create_slot=false, slot_name = &amp;#39;pslot1&amp;#39;, copy_data = false, worker_number=20);&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- , worker_number=30
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 172.16.103.90
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2 [savepoint 2, xid:1-2]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3 [savepoint 3, xid:1-2-3]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4 [savepoint 4, xid:1-2-3-4]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;555&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=5 [savepoint 5, xid:1-2-3-4-5]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=6 [rollback to 3: xid:1-2]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;777&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">RELEASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，xid=6和xid=7会归并到xid=2的事务中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2（假设上面RELEASE到s1，则xid=1，和顶层事务一致）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- \! sleep 3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 5 check subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_parallel_apply_stat&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- rollback to top
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;555&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=6
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;777&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">RELEASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，xid=6和xid=7会归并到xid=2的事务中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2（假设上面RELEASE到s1，则xid=1，和顶层事务一致）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- \! sleep 3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 5 check subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_parallel_apply_stat&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 延时检查
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ADD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONSTRAINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3_c1_unique&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNIQUE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFERRABLE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 事务1 -- 事务2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONSTRAINTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFERRED&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 7 cleanup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="子事务--主键冲突">子事务 + 主键冲突&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">vkill&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vinit&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 config
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_replication_slots=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_background_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vb_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;max_logical_replication_workers=100&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">sed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 sha256\n&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 sha256&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 startup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 create publicatioin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">all&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tables&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_create_logical_replication_slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgoutput&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 create subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">S&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subscription&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=50001 dbname=pubdb user=pu1 password=pu1.12345 sslmode=disable&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">worker_number&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;old&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2 [savepoint 2, xid:1-2]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3 [savepoint 3, xid:1-2-3]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4 [savepoint 4, xid:1-2-3-4]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vb_parallel_apply_stat&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 7 cleanup
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="子事务开发">子事务开发&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 子事务开发
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_current_wal_lsn&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 场景一：relase commit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;555&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=6
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;777&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">RELEASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，xid=6和xid=7会归并到xid=2的事务中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2（假设上面RELEASE到s1，则xid=1，和顶层事务一致）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_xlogdump&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pg_xlog&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xxx&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xid&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 场景二：release abort
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;555&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=6
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;777&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">RELEASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，xid=6和xid=7会归并到xid=2的事务中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2（假设上面RELEASE到s1，则xid=1，和顶层事务一致）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- pg 用例
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">wal_level=logical
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">max_worker_processes=20
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">max_logical_replication_workers=20
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">max_parallel_apply_workers_per_subscription=10 &amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">PG_HOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">postgresql&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLES&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pu1.12345&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_create_logical_replication_slot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;pgoutput&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 create subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSCRIPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sub1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CONNECTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host=127.0.0.1 port=5432 dbname=pubdb user=pu1 password=pu1.12345 replication=database&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">create_slot&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">slot_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;pslot1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">copy_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">streaming&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">parallel&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 test transaction
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- \c pubdb
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- BEGIN;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(1,&amp;#39;111&amp;#39;); -- top xid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SAVEPOINT s1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(2,&amp;#39;222&amp;#39;); -- subxid 2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SAVEPOINT s2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(3,&amp;#39;333&amp;#39;); -- subxid 3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SAVEPOINT s3;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(4,&amp;#39;444&amp;#39;); -- subxid 4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SAVEPOINT s4;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(5,&amp;#39;555&amp;#39;); -- subxid 5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- ROLLBACK TO SAVEPOINT s2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(6,&amp;#39;666&amp;#39;); -- subxid 6
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SAVEPOINT s5;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(7,&amp;#39;777&amp;#39;); -- subxid 7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- RELEASE SAVEPOINT s2;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- INSERT INTO t1 VALUES(8,&amp;#39;888&amp;#39;); -- 回到s1对应事务上下文
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- COMMIT;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;111&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;222&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;333&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;444&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;555&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=5
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=6
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;777&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=7
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">RELEASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，xid=6和xid=7会归并到xid=2的事务中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 假如xid=2（假设上面RELEASE到s1，则xid=1，和顶层事务一致）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ROLLBACK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SAVEPOINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 check
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">subdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_subscription&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">xmin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 发布端：2阶段处理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ReleaseSavepoint&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">loop&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cur&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CurrentTransactionState&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cur&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">blockState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TBLOCK_SUBRELEASE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cur&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cur&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">parent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CommitTransactionCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">CurrentTransactionState&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="n">TBLOCK_SUBRELEASE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">loop&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CommitSubTransaction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AtSubCommit_childXids&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CurrentTransactionState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">parent&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">childXids&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">cnt&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CurrentTransactionState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">xid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PopTransaction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CurrentTransactionState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">parent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 订阅端：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pa_start_subtrans&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DefineSavepoint&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subxactlist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lappend_xid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">subxactlist&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">current_xid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">apply_handle_stream_commit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pa_stream_abort&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">loop&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">curxid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subxactlist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">curxid&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">subxid&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RollbackToSavepoint&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>实现原理：&lt;/p></description></item><item><title>PostgreSQL 3-13 逻辑复制原理与性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-logical-replication-tuning/</link><pubDate>Mon, 29 Dec 2025 20:38:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-logical-replication-tuning/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5">1 基本概念&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF">1.1 业务场景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E9%80%BB%E8%BE%91%E5%A4%8D%E5%88%B6">1.2 逻辑复制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF">1.3 实现思路&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5">1.4 基本概念&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">2 使用方法&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9A%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0">2.1 发布端：配置参数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%8F%91%E5%B8%83">2.2 发布端：创建发布&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9A%E5%88%9B%E5%BB%BA%E8%AE%A2%E9%98%85">2.3 订阅端：创建订阅&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1">3 核心设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84">3.1 整体架构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B">3.2 工作流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-3-%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F">3.3 数据格式&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E5%AE%9E%E7%8E%B0%E6%BA%90%E7%A0%81">4 实现源码&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#4-1-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9Aapply-launch">4.1 订阅端：apply-launch&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-2-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9Aapply-worker">4.2 订阅端：apply-worker&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-3-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9Apostmaster">4.3 发布端：postmaster&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-4-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9Awal-sender">4.4 发布端：wal-sender&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">5 性能优化&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#5-1-%E7%8E%B0%E7%8A%B6">5.1 现状&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-2-%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88">5.2 优化方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%80%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E6%B5%81%E5%A4%8D%E5%88%B6%E5%8D%8F%E8%AE%AE%EF%BC%88%E9%80%BB%E8%BE%91%E6%95%B0%E6%8D%AE%EF%BC%89">优化点一：发布端-流复制协议（逻辑数据）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%BA%8C%EF%BC%9A%E8%AE%A2%E9%98%85%E6%AE%B5-%E5%B9%B6%E8%A1%8C%E5%9B%9E%E6%94%BE%E6%9C%BA%E5%88%B6%EF%BC%88%E9%80%BB%E8%BE%91%E6%95%B0%E6%8D%AE%EF%BC%89">优化点二：订阅段-并行回放机制（逻辑数据）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%89%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E5%B9%B6%E8%A1%8C%E8%A7%A3%E7%A0%81%E6%9C%BA%E5%88%B6">优化点三：发布端-并行解码机制&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-3-%E6%9C%AA%E6%9D%A5%E6%96%B9%E6%A1%88">5.3 未来方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E8%AE%A1%E5%88%92%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%80%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E4%BA%8B%E5%8A%A1%E6%8F%90%E4%BA%A4%E7%AD%89%E5%BE%85">一、计划优化点一：发布端-事务提交等待&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-4-%E6%96%B9%E6%A1%88%E5%88%86%E6%9E%90">5.4 方案分析&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E4%BA%8B%E5%8A%A1%E6%AD%A3%E7%A1%AE%E6%80%A7">一、事务正确性&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#6-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95">6 性能测试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">参考资料&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-基本概念">1 基本概念&lt;/h1>
&lt;h2 id="11-业务场景">1.1 业务场景&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>场景一：数据共享（异构数据库）&lt;/strong>&lt;br>
1个公司，有2个部门：商品库存部门、商品成本部门。2个部门有不同技术栈，使用不同数据库产品:postgresql、mysql。2个部门需共享相同的表：商品信息表。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景二：数据容灾&lt;/strong>&lt;br>
应用存储数据时，同时将数据存储至postgresql于mysql中，避免某款数据库出现无法恢复的数据损坏问题。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景三：版本升级&lt;/strong>&lt;br>
从postgresql 13版本，升级到postgresql 16版本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景四：数据迁移（异构数据库）&lt;/strong>&lt;br>
从postgresql，将数据库迁移到mysql中。&lt;/p></description></item><item><title>PostgreSQL 3-13 Vastbase 逻辑复制</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-vb-rep/</link><pubDate>Thu, 27 Nov 2025 19:07:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-vb-rep/</guid><description>&lt;h1 id="2-使用">2 使用&lt;/h1>
&lt;h2 id="21-发布端">2.1 发布端&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_replication_slots=4&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_wal_senders=4&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#34;max_worker_processes=8&amp;#34; &amp;gt;&amp;gt; $GAUSSHOME/data/postgresql.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_logical_replication_workers=32&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;listen_addresses=&amp;#39;*&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 md5\n&amp;#39;&lt;/span> &lt;span class="nv">$GAUSSHOME&lt;/span>/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 md5&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># host all all 0.0.0.0/0 md5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -d postgres -c &lt;span class="s2">&amp;#34;SELECT name,setting FROM pg_settings WHERE name in
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> (&amp;#39;wal_level&amp;#39;, &amp;#39;max_replication_slots&amp;#39;, &amp;#39;max_wal_senders&amp;#39;, &amp;#39;max_worker_processes&amp;#39;, &amp;#39;max_logical_replication_workers&amp;#39;)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建基表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data1-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data1-2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data2-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data2-2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建发布用户&lt;/p></description></item><item><title>PostgreSQL 3-13 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication/</link><pubDate>Fri, 21 Nov 2025 15:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>2025-11-21：持续更新中…&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;h1 id="1-需求概述">1 需求概述&lt;/h1>
&lt;h2 id="11-原始需求">1.1 原始需求&lt;/h2>
&lt;p>主备部署模式下，滚动升级时，可能存在主节点未升级，备节点已升级的情况。在该条件下，客户要求主节点持续执行事务，并且主节点及时将数据同步至备节点。目前，存在一下问题：&lt;/p>
&lt;ul>
&lt;li>物理复制无法使用：由于主节点、备节点版本不一致，主节点生成的wal，备节点可能无法使用。因此，只能使用逻辑复制方案。&lt;/li>
&lt;li>逻辑复制性能较低：主节点作为发布端，解码wal。备节点作为订阅端，接收loggic-wal，并且回放logic-wal，可解决主备版本不一致的问题。但是，目前Vastbase的逻辑复制功能性能较低，无法满足及时同步数据的要求。&lt;/li>
&lt;/ul>
&lt;p>本需求将针对上述场景，端到端优化逻辑复制功能，让逻辑复制性能整体提升5倍以上，达到100m/s的要求。&lt;/p>
&lt;ul>
&lt;li>需求来源：&lt;a href="https://doc.weixin.qq.com/doc/w3_AYsAjQYkADwCNecwqsBM8ShS9YejB?scode=AHUAfwdSAA8UDeKla8AdwAfAa7AFk&amp;amp;roomid=Person:1688855660690652:1688855164259723&amp;amp;version=5.0.2.6008&amp;amp;platform=win">https://doc.weixin.qq.com/doc/w3_AYsAjQYkADwCNecwqsBM8ShS9YejB?scode=AHUAfwdSAA8UDeKla8AdwAfAa7AFk&amp;amp;roomid=Person%3A1688855660690652%3A1688855164259723&amp;amp;version=5.0.2.6008&amp;amp;platform=win&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="12-问题分析">1.2 问题分析&lt;/h2>
&lt;p>逻辑复制分为多个阶段，openGauss和PostgreSQL在部分阶段中做了优化，但未端到端优化。因此，本文将以早期逻辑复制为基础，指出优化设计。&lt;/p>
&lt;h3 id="版本一串行复制">版本一：串行复制&lt;/h3>
&lt;p>在postgresql 13以及之前版本，逻辑复制的关键设计如下：&lt;/p>
&lt;ul>
&lt;li>发布端：
&lt;ul>
&lt;li>解码日志：wal-sender进程，持续读取wal，串行对wal进行decode，生成logic-wal，并将不同事务的logic-wal，分别存放。&lt;/li>
&lt;li>发送日志：对wal进行decode时，如果是事务提交产生的wal，则将该事务的所有logic-wal打包，并发送到订阅端。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>订阅端：
&lt;ul>
&lt;li>回放日志：apply-worker进程，一次接收同一事务的一批logic-wal，串行回放本批logic-wal后，重新等待下一个事务的logic-wal。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>整体方案如下：&lt;/p>
&lt;p>&lt;img alt="pg-13" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/pg-13.png">&lt;/p>
&lt;p>以上设计，存在多项性能瓶颈，以常见的tpcc测试为例，可能有400+postgres进程在执行事务，实时产生wal日志。但是，只有1个wal-sender进程在串行解码日志，只有1个apply-workder在串行回放日志。&lt;/p>
&lt;h2 id="13-方案设计">1.3 方案设计&lt;/h2>
&lt;h3 id="版本二发布端并行解码">版本二：发布端并行解码&lt;/h3>
&lt;p>在openGauss中，针对发布端的解码日志阶段，进行了优化，引入多个decoder线程，并行解码wal生成logic-wal。方案设计如下：&lt;/p>
&lt;p>&lt;img alt="og" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/og.png">&lt;/p>
&lt;p>但是，在订阅端，每次对一个事务的一批logica-wal全部回放后，才会接收下一个事务的logic-wal。仅引入并发解码机制，对性能提升较小。发布端和订阅端，均存在负载不均衡的问题，例如，订阅端回放完一个事务的logic-wal之后，需等待下一个事务的logic-wal。&lt;/p>
&lt;h3 id="版本三流氏复制协议">版本三：流氏复制协议&lt;/h3>
&lt;p>在postgrsql 14版本，针对发布端发送日志阶段，进行了优化，引入流式复制协议，即无需一次发送完一个事务完整的一批logic-wal，而是随时发送logic-wal，即使事务未提交。可解决发布端、订阅端负载不均衡的问题。&lt;/p>
&lt;p>但是，在订阅端，tpcc场景，发布端400+postgres进程执行事务，订阅端1个apply-worker进程回放日志，仍是瓶颈。&lt;/p>
&lt;h3 id="版本四订阅端并行回放">版本四：订阅端并行回放&lt;/h3>
&lt;p>在postgrsql 16版本，针对订阅端回放日志阶段，进行了优化，引入多个apply进程，并行回放logic-wal。方案设计如下：&lt;/p>
&lt;p>&lt;img alt="pg-16" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/pg-16.png">&lt;/p>
&lt;h3 id="版本五并行复制">版本五：并行复制&lt;/h3>
&lt;ul>
&lt;li>结论：本需求参考性能测试结果，认为需同时结合：并行解码、流式复制、并行回放机制，才能提升逻辑复制端到端性能。&lt;/li>
&lt;li>优先级：其中，流式复制、并行回放机制，对性能影响较大，优先级较高。可独立地、优先地实现。&lt;/li>
&lt;li>其他工作：同时采用上述3个机制，需合理控制发布端解码速率、订阅端回放速率，在实现负载均衡的同事，避免logic-wal堆积。&lt;/li>
&lt;/ul>
&lt;h1 id="2-设计分析">2 设计分析&lt;/h1>
&lt;h2 id="21-必要性">2.1 必要性&lt;/h2>
&lt;p>根据postgrsql-16的性能测试结果，流式复制和并行回放机制，可达到70Mb/s的复制速度。&lt;/p>
&lt;h3 id="一测试场景">一、测试场景&lt;/h3>
&lt;ul>
&lt;li>测试机器：
&lt;ul>
&lt;li>IP：172.16.103.90&lt;/li>
&lt;li>硬件：CPU：鲲鹏920-ARM-128核。缓存L1-L2-L3：8M/64M/256M。内存：760G。磁盘：NVME&lt;/li>
&lt;li>系统：openEuler&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>tpcc测试场景（为了快速测试，不太标准）
&lt;ul>
&lt;li>数据量：100 warhouse&lt;/li>
&lt;li>并发：400&lt;/li>
&lt;li>执行时间：1 min&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>逻辑复制配置：
&lt;ul>
&lt;li>部署：发布端、订阅端在同一台机器（找不到2台性能机）&lt;/li>
&lt;li>订阅：创建1个publiction，涵盖所有table&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="二测试数据">二、测试数据&lt;/h2>
&lt;p>由于机器、时间等限制，测试未严格控制变量，但是，和准确结果应该有80%以上符合度。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>版本&lt;/th>
&lt;th>配置&lt;/th>
&lt;th>tpmc&lt;/th>
&lt;th>发布端-wal写入速度&lt;/th>
&lt;th>逻辑复制速度（峰值）&lt;/th>
&lt;th>逻辑复制速度（平均值）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>postgrsql-14&lt;/td>
&lt;td>串行解码、非流式复制、串行回放&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>207 Mb/s&lt;/td>
&lt;td>-&lt;/td>
&lt;td>16 Mb/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>postgresql-16&lt;/td>
&lt;td>串行解码、流式复制、串行回放&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>212 Mb/s&lt;/td>
&lt;td>117 Mb/s&lt;/td>
&lt;td>55 Mb/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>postgresql-16&lt;/td>
&lt;td>串行解码、流式复制、并行回放(4)&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>197 Mb/s&lt;/td>
&lt;td>113 Mb/s&lt;/td>
&lt;td>71 Mb/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;ul>
&lt;li>测试：贾旭辉&lt;/li>
&lt;li>详细数据和结论见wiki：&lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007526">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007526&lt;/a>&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;ul>
&lt;li>尝试修改源码，让订阅端只接受日志，不apply，确定发布端解码和发送的瓶颈，但是，测试结果有点奇怪，有空再继续。&lt;/li>
&lt;/ul>
&lt;h2 id="22-可行性">2.2 可行性&lt;/h2>
&lt;ul>
&lt;li>并行解码：openGauss已引入&lt;/li>
&lt;li>流式复制：postgreql-16版本已成熟&lt;/li>
&lt;li>并行回放：postgreql-16版本已成熟&lt;/li>
&lt;/ul>
&lt;h2 id="23-潜在风险">2.3 潜在风险&lt;/h2>
&lt;h3 id="一数据有一致性">一、数据有一致性&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>写写冲突&lt;/p></description></item><item><title>PostgreSQL 3-13 Publication</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-publication/</link><pubDate>Thu, 28 Aug 2025 16:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-publication/</guid><description>&lt;h1 id="1-逻辑复制背景">1 逻辑复制背景&lt;/h1>
&lt;h2 id="11-逻辑复制场景">1.1 逻辑复制场景&lt;/h2>
&lt;p>在使用数据库时，为提高整个系统的可靠性，或实现不同部门数据同步等场景，很多客户的部署模型存在：一主多备、异构数据库等特点，在保证性能的前提下，常见部署模型如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------+ sql +---------------------+ wal +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> application &lt;span class="p">|&lt;/span> --------&amp;gt; &lt;span class="p">|&lt;/span> postgresql &lt;span class="o">(&lt;/span>master&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span> -------&amp;gt; &lt;span class="p">|&lt;/span> postgresql &lt;span class="o">(&lt;/span>slave&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------+ +---------------------+ +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> decoded-wal +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +---------------------&amp;gt; &lt;span class="p">|&lt;/span> mysql, oracle, .. &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +--------------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-逻辑复制功能">1.2 逻辑复制功能&lt;/h2>
&lt;h2 id="13-逻辑复制基础">1.3 逻辑复制基础&lt;/h2>
&lt;p>首先，需自行了解一些存储的基本知识，包括事务特性、mvcc机制，表的物理存储格式：filenode、page、tuple等。&lt;br>
此处，以一个例子，介绍什么wal日志的特点。需了解一些&lt;/p>
&lt;ol>
&lt;li>
&lt;p>应用执行事务&lt;br>
假设同一时间，有2个事务，事务id分别为10和11。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>时间&lt;/th>
&lt;th>应用1&lt;/th>
&lt;th>应用2&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>0&lt;/td>
&lt;td>CREATE TABLE t1 (c1 INT,c2 INT)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>CREATE TABLE t2 (c1 INT,c2 INT)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>BEGIN (xid=10)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>INSERT INTO t1 VALUES(10, 1)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>-&lt;/td>
&lt;td>BEGIN (xid=11)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>-&lt;/td>
&lt;td>INSERT INTO t1 VALUES (11, 1)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>INSERT INTO t2 VALUES (10, 2)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>COMMIT&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>-&lt;/td>
&lt;td>DELETE FROM t1 WHERE c1 = 10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>-&lt;/td>
&lt;td>INSERT INTO t2 VALUES (11, 2)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10&lt;/td>
&lt;td>-&lt;/td>
&lt;td>COMMIT&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>内核产生wal日志&lt;br>
所有表的wal日志，按生成wal的顺序，组织在一起。上述示例中，产生的wal如下：（此处仅列举关键信息）&lt;/p></description></item><item><title>PostgreSQL 3-14 物理复制</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-14-physical-replication/</link><pubDate>Fri, 05 Jun 2026 09:56:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-14-physical-replication/</guid><description>&lt;h1 id="1-物理复制基本原理">1 物理复制基本原理&lt;/h1>
&lt;h2 id="11-使用场景">1.1 使用场景&lt;/h2>
&lt;p>介绍为什么需要物理复制&lt;/p>
&lt;h2 id="12-相关原理">1.2 相关原理&lt;/h2>
&lt;p>介绍什么是wal，wal是用来干嘛的&lt;/p>
&lt;h2 id="13-实现思路">1.3 实现思路&lt;/h2>
&lt;p>介绍如何基于wal，实现物理复制，并解决1.1中的问题&lt;/p>
&lt;h1 id="2-物理复制使用方式">2 物理复制使用方式&lt;/h1>
&lt;h2 id="21-使用物理复制">2.1 使用物理复制&lt;/h2>
&lt;h1 id="3-物理复制工作流程">3 物理复制工作流程&lt;/h1>
&lt;h2 id="31-整体架构">3.1 整体架构&lt;/h2>
&lt;p>包括Postgres生成wal，walwriter存储wal，walsender发送wal，walreceive接收wal，startup重放wal，checkpoint/bgwriter等。&lt;/p>
&lt;h2 id="32-工作流程">3.2 工作流程&lt;/h2>
&lt;p>参考2.1，梳理完整的工作流程，从主机执行SQL语句开始，到最终备机达到同样效果&lt;/p>
&lt;h1 id="4-物流复制实现源码">4 物流复制实现源码&lt;/h1>
&lt;p>参考2.1，介绍每一阶段的关键原理，另外，包括wal日志格式等&lt;/p>
&lt;p>你好，我要基本当前目录下的代码，生成一份流复制的skill，所以，接下来的对话，都和这件事有关。&lt;/p></description></item><item><title>海量 4 需求 scram-sha256</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/4-requirement-scram-sha256/</link><pubDate>Thu, 03 Apr 2025 17:41:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/4-requirement-scram-sha256/</guid><description>&lt;h1 id="深信服支持pg-scram-sha256需求">深信服支持pg scram-sha256需求&lt;/h1>
&lt;h2 id="需求目标">需求目标&lt;/h2>
&lt;p>本需求的根本目标时，当vastbase server要求使用sha256算法进行身份认证时，postgresql client能与vastbase server建立连接。&lt;br>
该需求目前仅合入深信服分支&lt;/p>
&lt;h2 id="需求分析">需求分析&lt;/h2>
&lt;p>身份认证的详细流程有点复杂，此处简要概述为2个阶段：&lt;/p>
&lt;ol>
&lt;li>标识：新建用户时，server计算并存储密码哈希值&lt;/li>
&lt;li>鉴别：用户登录时，server向client发送计算密码哈希值的关键信息，client计算并向server发送密码哈希值，server校验其是否符合存储的值&lt;/li>
&lt;/ol>
&lt;p>vastbase和postgresql对比，server计算密码哈希值的算法不同，server向client发送关键信息也不同。为解决pg-client能够连接vb-server的问题，需解决问题如下：&lt;/p>
&lt;ol>
&lt;li>vb-server计算并存储与pg-server一致的密码哈希值&lt;/li>
&lt;li>vb-server向pg-client发送密码哈希值关键信息时，需要pg-server一致&lt;/li>
&lt;/ol>
&lt;p>postgreql的标识与鉴别机制，符合标准RFC-5802，涉及的算法与协议，本文统一称为scram-sha256。vastbase涉及的算法与协议，本文统一称为sha256。&lt;/p>
&lt;h2 id="需求实现">需求实现&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>密码存储：新建用户时，修改存储用户密码的值&lt;/p>
&lt;ul>
&lt;li>
&lt;p>修改前：guc参数password_encrypt_type，取值1时，vb-server存储密码的[sha256, md5]值；取值为2时，存储密码的[sha256]值&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FORM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgauthid&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 示例：长度为209
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e96343a5cbf800ecdfecefade&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>修改后：guc参数password_encrypt_type，取值1时，vb-server存储密码的[sha256, md5, scram-sha256]值；取值为2时，存储密码的[sha256, scram-sha256]值&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FORM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgauthid&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 示例：长度342 (新增长度：133)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e963SCRAM&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">SHA&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">sp5V1hrLKzLsS4HtQgqTuA&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">QO&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">UVdrXxIypzBEGqEuIWe96A80elghFQs25ZbdPsLg&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">J4lPXmXPANtTMOkaHokMjmM19K1Di7fU6WRWuZ5VmS0&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>认证协议：用户登录时，修改向客户端发送的密码哈希值关键信息&lt;/p>
&lt;ul>
&lt;li>
&lt;p>修改前：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 身份认证协议&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. client &amp;lt;-&amp;gt; server : tcp connect
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. client --&amp;gt; server : send &lt;span class="o">[&lt;/span>消息类型:0, 协议版本:3.51，连接参数:user_name, databse, ...&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. server --&amp;gt; client : send &lt;span class="o">[&lt;/span>消息类型:R, 哈希算法:10, 系统表存储的密码的算法:2, 计算密码哈希关键信息：salt,token,iteration&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. client &amp;lt;-&amp;gt; server : &lt;span class="c1"># 省略3次交互&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>修改后：&lt;/p></description></item><item><title>数据库安全 Oracle</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-oracle-security/</link><pubDate>Sat, 25 Jan 2025 11:07:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-oracle-security/</guid><description>&lt;p>&lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001006330">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001006330&lt;/a>&lt;/p>
&lt;h1 id="3-异常参数">3 异常参数&lt;/h1>
&lt;h2 id="31-des-encrypt">3.1 DES encrypt&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>封装函数&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">REPLACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hex_plain&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">hex_key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RAW&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">dbms_obfuscation_toolkit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hex_plain&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">hextoraw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hex_key&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">encrypted_data&lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">RETURN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rawtohex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">END&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>函数格式&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">desencrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>约束：&lt;/p>
&lt;/li>
&lt;li>
&lt;p>构造用例&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>明文长度&lt;/th>
&lt;th>密钥长度&lt;/th>
&lt;th>输出：密文长度&lt;/th>
&lt;th>示例&lt;/th>
&lt;th>结果&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>一、正常用例&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>8&lt;/td>
&lt;td>8&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>abc&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>16&lt;/td>
&lt;td>8&lt;/td>
&lt;td>16&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>abc&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>一、明文长度异常&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>0&lt;/td>
&lt;td>8&lt;/td>
&lt;td>16&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>明文不是8的倍数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>8&lt;/td>
&lt;td>-&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>明文不是8的倍数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>8&lt;/td>
&lt;td>-&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>明文不是8的倍数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>15&lt;/td>
&lt;td>8&lt;/td>
&lt;td>-&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>明文不是8的倍数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>二、密钥长度异常&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>0&lt;/td>
&lt;td>8&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>密钥长度不是8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>1&lt;/td>
&lt;td>8&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>密钥长度不是8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>15&lt;/td>
&lt;td>8&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>密钥长度不是8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>16&lt;/td>
&lt;td>8&lt;/td>
&lt;td>desencrypt()&lt;/td>
&lt;td>密钥长度不是8&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;/ol>
&lt;h2 id="32-des-decrypt">3.2 DES decrypt&lt;/h2>
&lt;h2 id="33-3des-encrypt">3.3 3DES encrypt&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>封装函数&lt;/p></description></item><item><title>数据库安全 0 整体架构</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-0-database-security/</link><pubDate>Wed, 22 Jan 2025 11:34:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-0-database-security/</guid><description>&lt;blockquote>
&lt;p>摘要：介绍常见数据库安全机制的原理：&lt;br>
1.身份认证&lt;br>
2.安全传输&lt;br>
3.安全审计&lt;br>
4.访问控制&lt;br>
5.数据发现&lt;br>
6.数据防篡改&lt;br>
7.加密函数&lt;br>
8.透明加密&lt;br>
9.数据脱敏&lt;br>
10.全密态加密&lt;br>
11.机密计算&lt;/p>&lt;/blockquote>
&lt;h1 id="1-数据库安全概述">1 数据库安全概述&lt;/h1>
&lt;h2 id="11-数据库基本功能">1.1 数据库基本功能&lt;/h2>
&lt;p>本文讨论数据库安全，为方便理解，将大部分软件架构简化为2个主体：应用端与数据库端。&lt;/p>
&lt;ul>
&lt;li>应用：实现业务逻辑，收集业务数据，将数据发送至数据库，由数据库提供数据存储功能，并且，要求数据库提供数据查询功能&lt;/li>
&lt;li>数据库：存储业务数据，向应用提供SQL接口，接收应用发送的SQL语句，并处理SQL语句。同时，解决高并发、高性能、高可靠的问题&lt;/li>
&lt;/ul>
&lt;p>大部分场景中，应用与数据库部署于不同主机上，以下是一个应用使用数据库实现数据存储与查询的示例流程：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>建立连接：应用与数据库建立网络连接&lt;/p>
&lt;/li>
&lt;li>
&lt;p>定义数据：应用向数据库发送以下SQL语句，创建1个表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>存储数据：应用向数据库发送以下SQL语句，向表中存储数据&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abc&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>查询数据：应用向数据库发送以下SQL语句，从表中查询数据&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="12-数据库基本架构">1.2 数据库基本架构&lt;/h2>
&lt;p>数据库架构较复杂，此处先将数据库架构简单划分为以下3个部分：&lt;/p>
&lt;ul>
&lt;li>数据库驱动：集成到应用内部，向应用提供编程接口，常见接口有：连接数据库、执行SQL语句等&lt;/li>
&lt;li>计算模块：解析SQL语句，并按合理地执行流程处理SQL语句中的请求，调用存储模块接口实现数据存储与读取&lt;/li>
&lt;li>存储模块：合理组织数据，调用IO接口，实现磁盘读写操作。向计算模块提供接口&lt;/li>
&lt;/ul>
&lt;h2 id="13-数据库安全威胁">1.3 数据库安全威胁&lt;/h2>
&lt;p>在应用使用数据库的过程中，攻击者可能对整个系统造成恶意攻击，攻击的最终目标是：&lt;/p>
&lt;ul>
&lt;li>破坏业务数据：窃取、伪造、篡改、损坏等&lt;/li>
&lt;li>破坏业务系统：拒绝服务等&lt;/li>
&lt;/ul>
&lt;p>攻击者针对多个系统薄弱点进行功能：&lt;/p>
&lt;ul>
&lt;li>数据库网络：协议等&lt;/li>
&lt;li>数据库应用：身份认证机制等&lt;/li>
&lt;li>数据库主机：操作系统、软件（除数据库外的其他软件）、硬件等&lt;/li>
&lt;/ul>
&lt;p>假设应用与数据库部署在不同主机，分为是下图中的主机c和主机z，常见安全威胁的架构图如下：&lt;/p>
&lt;p>&lt;img alt="risk" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/4-0-database-security/risk.png">&lt;/p>
&lt;h2 id="14-数据安全架构">1.4 数据安全架构&lt;/h2>
&lt;p>针对各类威胁，数据库提供多种安全机制，保护数据与数据库安全，常见的安全机制如下：&lt;/p>
&lt;ol>
&lt;li>身份认证：阻止非法用户与数据库建立网络连接&lt;/li>
&lt;li>安全传输：阻止非法用户窃取、篡改、伪造、..传输数据&lt;/li>
&lt;li>安全审计：记录非法/合法用户对数据库的操作&lt;/li>
&lt;li>访问控制：缩小非法用户对数据库的访问范围&lt;/li>
&lt;li>数据发现：协助合法用户识别敏感数据&lt;/li>
&lt;li>数据防篡改：识别非法用户篡改、伪造、..存储数据&lt;/li>
&lt;li>加密函数：协助合法用户加密存储数据&lt;/li>
&lt;li>透明加密：阻止非法用户窃取、篡改、伪造、..存储数据&lt;/li>
&lt;li>数据脱敏：缩小非法用户对数据内容的访问范围&lt;/li>
&lt;li>全密态加密：阻止非法用户窃取、篡改、伪造、..传输、计算、存储数据&lt;/li>
&lt;li>机密计算：阻止非法用户窃取、篡改、伪造计算数据&lt;/li>
&lt;/ol>
&lt;p>按对数据处理的顺序，各安全机制的架构如下图所示：&lt;/p></description></item><item><title>数据结构与算法 4 图</title><link>https://my-blog.j8465383071.workers.dev/posts/algorithm/4-graph/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/algorithm/4-graph/</guid><description>&lt;h1 id="1-图的介绍">1 图的介绍&lt;/h1>
&lt;h2 id="11-定义">1.1 定义&lt;/h2>
&lt;p>G = (V, E)&lt;/p>
&lt;ul>
&lt;li>一组节点V&lt;/li>
&lt;li>一组边E&lt;/li>
&lt;li>节点的度：相邻节点的数量&lt;/li>
&lt;li>完备图：所有节点都有n-1个相邻节点，即任意2节点间可达&lt;/li>
&lt;/ul>
&lt;h2 id="12-分类">1.2 分类&lt;/h2>
&lt;h3 id="根据边分类">根据边分类&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>无向图&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">n1 ---- n2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n3 ---- n4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>有向图&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> --&amp;gt; n2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n1 --&amp;gt; n4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --&amp;gt; n3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>带权有向图&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ---&amp;gt; n2 6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n1 ---&amp;gt; n4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ---&amp;gt; n3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="图的性质分类">图的性质分类&lt;/h3>
&lt;ul>
&lt;li>同构图：G和H，通过重新标记G的节点产生H。阶相等，顶点度数相等&lt;/li>
&lt;li>异构图&lt;/li>
&lt;/ul>
&lt;h2 id="13-表示">1.3 表示&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>邻接矩阵&lt;br>
如果节点间ni,nj之间有弧，则[ni, nj] = 1&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> n1 n2 n3 n4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n1 | 0 1 1 0 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n2 | 0 0 0 1 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n3 | 0 0 0 1 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">n4 | 0 0 0 0 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>无向图的斜下半部分是多余的&lt;/p></description></item><item><title>PostgreSQL 4-1 pgaudit</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/4-1-pgaudit/</link><pubDate>Fri, 23 May 2025 10:54:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/4-1-pgaudit/</guid><description>&lt;h1 id="1-使用pgaudt">1 使用pgaudt&lt;/h1>
&lt;h2 id="11-常见sql">1.1 常见SQL&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 ddl
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INDEX&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">i1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 dml
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aaa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbb&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ccc&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aaa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbb&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ddd&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 select
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 function
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;_oper&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;_func&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;aaa&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;_func&amp;#39;&lt;/span>&lt;span class="p">)),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;aaa&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;_func&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 multi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">t2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">t3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="1-安装pgaudit">1 安装pgaudit&lt;/h1>
&lt;h2 id="11-安装postgresql">1.1 安装postgresql&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 配置环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export BUILD_ROOT=`pwd`&amp;#39;&lt;/span> &amp;gt; pgenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PG_HOME=$BUILD_ROOT/install&amp;#39;&lt;/span> &amp;gt;&amp;gt; pgenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PATH=&amp;#34;$PG_HOME/bin:$PATH&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; pgenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> pgenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2 下载源码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://ftp.postgresql.org/pub/source/v14.18/postgresql-14.18.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf postgresql-14.18.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> postgresql-14.18.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3 编译源码 (不开启debug模式，提高性能)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#./configure --prefix=$PG_HOME --enable-debug=yes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./configure --prefix&lt;span class="o">=&lt;/span>&lt;span class="nv">$PG_HOME&lt;/span> --enable-debug&lt;span class="o">=&lt;/span>no --enable-cassert&lt;span class="o">=&lt;/span>no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make -sj
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install -sj
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="nv">$BUILD_ROOT&lt;/span>/pg14/contrib/pgaudit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install &lt;span class="nv">USE_PGXS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">PG_CONFIG&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$PG_HOME&lt;/span>/bin/pg_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4 初始化集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">initdb -D &lt;span class="nv">$PG_HOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4 配置集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#34;port = 54000&amp;#34; &amp;gt;&amp;gt; $PG_HOME/data/postgresql.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#34;max_connections = 1000&amp;#34; &amp;gt;&amp;gt; $PG_HOME/data/postgresql.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;logging_collector = on&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;shared_preload_libraries = &amp;#39;pgaudit&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log = &amp;#39;ALL&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_catalog = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_client = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_parameter = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_relation = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_rows = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;pgaudit.log_statement = true&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5 启动集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_ctl start -D &lt;span class="nv">$PG_HOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DROP EXTENSION pgaudit&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CREATE EXTENSION pgaudit&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CREATE UNLOGGED TABLE adt&lt;span class="o">(&lt;/span>c1 TEXT&lt;span class="o">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CREATE TABLE t1 &lt;span class="o">(&lt;/span>c1 INT&lt;span class="o">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">INSERT INTO t1 VALUES &lt;span class="o">(&lt;/span>1&lt;span class="o">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">\!&lt;/span> ls &lt;span class="nv">$PG_HOME&lt;/span>/data/log
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">\!&lt;/span> tail &lt;span class="nv">$PG_HOME&lt;/span>/data/log/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==========================================&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-tpcc优化">1.2 tpcc优化&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">shared_buffers = 200GB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">work_mem = 1GB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">maintenance_work_mem = 4GB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">effective_cache_size = 500GB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">wal_buffers = 1GB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">checkpoint_timeout = 55min
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show shared_buffers&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show work_mem&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show maintenance_work_mem&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show effective_cache_size&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show wal_buffers&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">show checkpoint_timeout&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-安装pgaudit">1.3 安装pgaudit&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 下载源码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://codeload.github.com/pgaudit/pgaudit/tar.gz/refs/tags/1.6.2 -O pgaudit-1.6.2.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf pgaudit-1.6.2.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2 编译&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> pgaudit-1.6.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install &lt;span class="nv">USE_PGXS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">PG_CONFIG&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$PG_HOME&lt;/span>/bin/pg_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3 验证编译成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ll &lt;span class="nv">$PG_HOME&lt;/span>/share/extension
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf &lt;span class="p">|&lt;/span> grep shared_preload_libraries
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4 开启日志功能&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;logging_collector = on&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;log_statement = all&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5 开启 pgaudit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;shared_preload_libraries = &amp;#39;pgaudit&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34; pgaudit.log = &amp;#39;ALL&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 安装pgaudit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgaudit&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 查看配置参数
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgaudit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- ALL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- READ: SELECT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- WRITE: INSERT, UPDATE, DELETE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- ROLE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- DDL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- FUNCTION
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- MISC
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- MISC_SET
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgaudit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pgaudit&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">log_level&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查看审计文件
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">log_directory&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SHOW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">log_filename&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>审计策略：客户&lt;/li>
&lt;/ol>
&lt;p>优先3.0&lt;/p></description></item><item><title>数据库安全 1 身份认证</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-1-authentication/</link><pubDate>Fri, 24 Jan 2025 18:46:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-1-authentication/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>摘要&lt;/strong>：从5个方面，介绍PostgreSQL身份认证特性：背景、原理、使用、设计、实现&lt;/p>&lt;/blockquote>
&lt;h1 id="1-身份认证概述">1 身份认证概述&lt;/h1>
&lt;h2 id="11-非法访问风险">1.1 非法访问风险&lt;/h2>
&lt;ul>
&lt;li>数据库进程&lt;br>
数据库运行时，本质是一个服务器进程，在特定的主机上，监听特定端口。应用如果知道IP和端口，都可与数据库进程建立TCP连接，并进行数据交互，包括发送SQL语句、接收查询结果等。&lt;/li>
&lt;li>数据泄露风险&lt;br>
为避免非法用户访问数据库，构造特殊数据，造成数据损坏、数据泄露等问题，数据库接收应用建立TCP的请求，并成功建立TCP连接后，需先确认应用的身份是否合法，再接收应用的其他数据，比如接收SQL语句等。&lt;/li>
&lt;/ul>
&lt;h2 id="12-身份认证机制">1.2 身份认证机制&lt;/h2>
&lt;p>在信息系统中，身份认证是一种常见的机制，身份认证的概念较成熟，本文不详细介绍相关概念。身份认证分为标识与鉴别两个部分：&lt;/p>
&lt;ul>
&lt;li>标识：用户向系统声明自己的身份，系统标识用户&lt;/li>
&lt;li>鉴别：系统验证用户提供的信息，确认用户是否是已标识的用户&lt;/li>
&lt;/ul>
&lt;p>按照认证因素，可将身份认证划分为3类：&lt;/p>
&lt;ul>
&lt;li>知识因素：用户知道某些秘密，比如口令、密码等&lt;/li>
&lt;li>拥有因素：用户拥有某些实物，比如钥匙、证书、令牌等&lt;/li>
&lt;li>生物因素：用户拥有某些特征，比如指纹、面部、虹膜、签名等&lt;/li>
&lt;/ul>
&lt;h2 id="13-postgrsql的身份认证">1.3 PostgrSQL的身份认证&lt;/h2>
&lt;p>PostgreSQL的认证方式有很多种，包括：密码认证、Ident认证、Peer认证、证书认证、LDAP认证等。本文仅介绍最常见的方案。&lt;/p>
&lt;p>在大部分场景中，PostgreSQL采用以下2层认证机制：&lt;/p>
&lt;ul>
&lt;li>主机认证：
&lt;ul>
&lt;li>标识：在PostgreSQL的配置文件中，配置IP白名单&lt;/li>
&lt;li>鉴别：PostgreSQL与应用建立连接后，检查应用的IP是否在白名单内，判断应用是否合法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>口令认证：
&lt;ul>
&lt;li>标识：PostgreSQL已存在的用户，创建新用户，为其设置用户信息，以及口令
&lt;ul>
&lt;li>备注：第一次安装PostgreSQL时，PostgreSQL要求用户创建初始用户&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>鉴别：在主机认证后，PostgreSQL先要求应用提供用户信息，再要求应用提供对应的口令，判断应用是否合法&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h1 id="2-身份认证的使用流程">2 身份认证的使用流程&lt;/h1>
&lt;h2 id="21-基本流程">2.1 基本流程&lt;/h2>
&lt;p>PostgreSQL中，从用户的角度观察，使用身份认证的流程可简单理解为：&lt;/p>
&lt;ol>
&lt;li>用户：已存在的用户使用&lt;code>CRATE USER {username} .. PASSWORD {password} ..&lt;/code>语法，创建新用户并设置口令&lt;/li>
&lt;li>数据库：数据库先对口令进行哈希，再存储口令的哈希值，目前的版本中，默认哈希算法为sha256算法，用户可通过GUC参数配置哈希算法类型&lt;/li>
&lt;li>用户：用户与数据建立连接，将&lt;code>{username}&lt;/code>与&lt;code>{password}&lt;/code>的哈希值发送给数据库，数据库比较用户发送的哈希值与系统表中的哈希值，判断&lt;code>{password}&lt;/code>是否合法&lt;/li>
&lt;/ol>
&lt;p>具体实现中，第3步的验证过程较为复杂，RFC5 802协议提供了一套安全的交互流程。后文介绍内部实现的详细流程。&lt;/p>
&lt;h1 id="3-身份认证的实现">3 身份认证的实现&lt;/h1>
&lt;h2 id="31-基于ip的身份认证">3.1 基于IP的身份认证&lt;/h2>
&lt;p>标识：访问者的IP&lt;br>
鉴别：数据库遍历IP白名单，判断访问者IP是否在白名单中，如果在，则认为访问者合法，允许与数据建立TCP连接。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">PostmasterMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ConnCreate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StreamConnection&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitPostgres&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PerformAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ClientAuthentication&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hba_getauthmethod&lt;/span> &lt;span class="cm">/* 从hba文件中，获取指定ip的认证方式 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_hba&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_hostname&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">check_ip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 如果指定ip未获取到认证方式，则返回空 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">switch&lt;/span> &lt;span class="n">hba&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nl">auth_method&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="cm">/* 根据ip采用不同的认证方式 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaReject&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaImplicitReject&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaGSS&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaSSPI&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaPeer&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaMD5&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaPassword&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaCert&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nl">uaTrust&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="32-基于证书的身份认证">3.2 基于证书的身份认证&lt;/h2>
&lt;p>创建主体的语法示例如下：&lt;/p></description></item><item><title>数据库安全 3 安全审计</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-3-audit/</link><pubDate>Wed, 22 Jan 2025 14:22:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-3-audit/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>摘要&lt;/strong>：从5个方面，介绍openGauss审计特性：背景、原理、使用、设计、实现&lt;/p>&lt;/blockquote>
&lt;h1 id="1-审计的背景">1 审计的背景&lt;/h1>
&lt;h2 id="11-审计的原理">1.1 审计的原理&lt;/h2>
&lt;p>在使用数据库存取数据的大部分场景中，数据库具有以下特点：&lt;/p>
&lt;ol>
&lt;li>对象多：一个数据库集群中有多个database对象，1个database对象中有多个schema对象，1个schema对象中有多个table、index等对象&lt;/li>
&lt;li>用户多：一个数据库中，有多个用户，每个用户可访问的数据库对象不同&lt;/li>
&lt;li>应用多：多个应用将数据存储在同一数据库集群中，并同时访问数据库集群&lt;/li>
&lt;li>操作多：数据库提供丰富的功能，包括DDL、DML、DCL、运维等&lt;/li>
&lt;li>运行久：一个数据库集群，可能会保持数十年运行&lt;/li>
&lt;/ol>
&lt;p>审计的主要目的，使记录数据运行过程中发生了哪些事件。审计的3要素是：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>主体&lt;/strong>：一般指数据库用户&lt;/li>
&lt;li>&lt;strong>客体&lt;/strong>：一般指数据库对象，包括：集群、用户、连接、数据对象（database、schema、table、index、function等）&lt;/li>
&lt;li>&lt;strong>操作&lt;/strong>：主体对客体的操作，比如某个用户访问了某个表&lt;/li>
&lt;/ul>
&lt;h2 id="12-审计的目的">1.2 审计的目的&lt;/h2>
&lt;p>审计具有以下重要意义：&lt;/p>
&lt;ol>
&lt;li>攻击检测：通过检查审计日志，可判断是否发生网络安全攻击事件&lt;/li>
&lt;li>例行维护：通过检查审计日志，可跟踪对某个对象的访问信息&lt;/li>
&lt;li>故障检测：当数据库出现故障是，协助快速定位问题&lt;/li>
&lt;li>合法合规：《网络安全法》等法律法规与表中中，要求应用具备审计功能&lt;/li>
&lt;li>…&lt;/li>
&lt;/ol>
&lt;h2 id="13-审计的功能">1.3 审计的功能&lt;/h2>
&lt;p>审计功能包含以下3个部分：&lt;/p>
&lt;ol>
&lt;li>设置审计范围：通过数据库配置参数，或者数据库语法，定义哪些对象需要被审计&lt;/li>
&lt;li>设置审计存储：通过数据库配置参数，定义审计日志如何存储&lt;/li>
&lt;li>生成审计日志：数据库运行过程中，访问某个对象时，记录访问信息&lt;/li>
&lt;li>管理审计日志：查询，删除，归档审计日志&lt;/li>
&lt;/ol>
&lt;h2 id="14-oracle审计">1.4 oracle审计&lt;/h2>
&lt;p>oracle审计的发展：&lt;br>
- oracle 8i及更早：支持传统审计&lt;br>
- oracle 12c：新增支持统一审计&lt;br>
- oracle 23ai：不支持传统审计，仅支持统一审计&lt;/p>
&lt;p>oracle统一审计的使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 创建审计策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">AUDIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ap1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- privilege 子句，记录所有使用CreateTable, AlterUser权限的操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ACTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- aciton 子句，记录所有对表t1执行SELECT,INSERT,UPDATE的操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ROLES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- role 子句，记录所有使用r1角色的操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 启用审计策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">AUDIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ap1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 查看审计日志
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">UNIFIED_AUDIT_TRAIL&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- DBA_COMMON_AUDIT_TRAIL, DBA_AUDIT_SESSION, DBA_AUDIT_OBJECT, DBA_FGA_AUDIT_TRAIL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DBA_AUDIT_TRAIL&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">os_username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">userhost&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">terminal&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">timestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">owner&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">action&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">action_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">------------+----------+----------+----------+-----------+-------+----------+--------+-------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">new_owner&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">new_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_privilege&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sys_privilege&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">admin_option&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grantee&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">audit_option&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ses_actions&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">----------+----------+---------------+---------------+--------------+---------+--------------+-------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">logoff_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_lread&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_pwrite&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_dlock&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_text&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sessionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">entryid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">statementid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">returncode&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">-----------+--------------+---------------+--------------+--------------+-----------+---------+-------------+------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">priv_used&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">client_id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">econtext_id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">session_cpu&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extended_timestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">proxy_sessionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">global_uid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">instance_number&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">-----------+-----------+-------------+-------------+--------------------+-----------------+------------+-----------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">os_process&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">transactionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">scn&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sql_bind&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sql_text&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_edition_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rls_info&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">current_user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">----------+---------------+-----+----------+----------+------------------+------+----------+--------------+
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中，可设置的权限、操作等范围如下：&lt;/p></description></item><item><title>数据库安全 4 访问控制</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-4-access-control/</link><pubDate>Wed, 05 Feb 2025 16:57:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-4-access-control/</guid><description>&lt;h1 id="1-访问控制的背景">1 访问控制的背景&lt;/h1>
&lt;p>在使用数据库存取数据的大部分场景中，数据库具有以下特点：&lt;/p>
&lt;ol>
&lt;li>对象多：一个数据库集群中有多个database对象，1个database对象中有多个schema对象，1个schema对象中有多个table、index等对象&lt;/li>
&lt;li>用户多：一个数据库中，有多个用户，每个用户可访问的数据库对象不同&lt;/li>
&lt;/ol>
&lt;p>在该场景中，通过访问控制机制，可限制某个对象访问数据库对象的范围&lt;/p>
&lt;h1 id="2-访问控制的原理">2 访问控制的原理&lt;/h1>
&lt;p>访问控制的模型是：主体、客体、操作。本文不解释基本概念。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>主体&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>USER&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>角色：&lt;/p>
&lt;ul>
&lt;li>SYSADMIN 系统管理员&lt;/li>
&lt;li>CREATEROLE 安全管理员&lt;/li>
&lt;li>AUDITADMIN 审计管理员&lt;/li>
&lt;li>MONADMIN 监控管理员&lt;/li>
&lt;li>OPRADMIN 运维管理员&lt;/li>
&lt;li>POLADMIN 安全策略管理员&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>客体&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DATABASE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SCHEMA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TABLESPACE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>COLUMN&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FUNCTION&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PROCEDURE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SEQUENCE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FOREIGN SERVER&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LANGUAGE&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作&lt;/th>
&lt;th>客体&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CREATE&lt;/td>
&lt;td>DATABASE, SCHEMA, TABLESPACE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ALTER&lt;/td>
&lt;td>DATABASE, SCHEMA, TABLESPACE, TABLE, FUNCTION, PRODUCE, FOREIGN SERVER, DIRECOTRY, PACKAGE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DROP&lt;/td>
&lt;td>DATABASE, SCHEMA, TABLESPACE, TABLE, FUNCTION, PRODUCE, FOREIGN SERVER, DIRECOTRY, PACKAGE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TRUNCATE&lt;/td>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>VACUUM&lt;/td>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INDEX&lt;/td>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TRIGGER&lt;/td>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SELECT&lt;/td>
&lt;td>TABLE, COLUMN, SEQUENCE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INSERT&lt;/td>
&lt;td>TABLE, COLUMN&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UPDATE&lt;/td>
&lt;td>TTABLE, COLUMN, SEQUENCE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DELETE&lt;/td>
&lt;td>TABLE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TEMPORARY&lt;/td>
&lt;td>DATABASE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EXECUTE&lt;/td>
&lt;td>FUNCTION, PROCEDURE, PACKAGE&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>语法：&lt;/p></description></item><item><title>数据库安全 5 全密态</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-5-fully-encrypted-database/</link><pubDate>Wed, 24 Jun 2026 14:47:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-5-fully-encrypted-database/</guid><description>&lt;ol>
&lt;li>&lt;a href="#0-%E5%9F%BA%E7%A1%80%E8%B0%83%E7%A0%94">0 基础调研&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E8%BF%90%E7%AE%97%E7%AC%A6">一、运算符&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B">二、数据类型&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#1-%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1">1 架构设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E5%B7%A5%E4%BD%9C%E8%AE%A1%E5%88%92">工作计划&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#Table-1-Scan-Nodes">Table 1: Scan Nodes&lt;/a>&lt;/li>
&lt;li>&lt;a href="#Table-2-Join-Nodes">Table 2: Join Nodes&lt;/a>&lt;/li>
&lt;li>&lt;a href="#Table-3-Processing-Nodes">Table 3: Processing Nodes&lt;/a>&lt;/li>
&lt;li>&lt;a href="#Table-4-Set-amp-Control-Nodes">Table 4: Set &amp;amp; Control Nodes&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8D%95%E7%8B%AC%E8%AF%B4%E6%98%8E%EF%BC%9ATable-Function-Materialization%EF%BC%88%E8%A1%A8%E5%87%BD%E6%95%B0%E7%89%A9%E5%8C%96%E8%AE%A1%E7%AE%97%EF%BC%89">单独说明：Table Function Materialization（表函数物化计算）&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E9%A9%B1%E5%8A%A8%E5%8A%A0%E5%AF%86-%E5%AE%9E%E7%8E%B0">2 驱动加密 - 实现&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E6%96%B0%E5%A2%9E%E7%B1%BB%E5%9E%8Bciphera">2.1 新增类型ciphera&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E6%96%B0%E5%A2%9E%E7%B3%BB%E7%BB%9F%E8%A1%A8pg-key">2.2 新增系统表pg_key&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E6%96%B0%E5%A2%9E%E8%AF%AD%E6%B3%95DATA-KEY">2.3 新增语法DATA KEY&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E6%96%B0%E5%A2%9E%E7%B3%BB%E7%BB%9F%E8%A1%A8pg-sec-class">2.4 新增系统表pg_sec_class&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E6%96%B0%E5%A2%9E%E8%AF%AD%E6%B3%95ENCRYPT">2.4 新增语法ENCRYPT&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-5-%E6%96%B0%E5%A2%9E%E5%85%AC%E5%85%B1%E8%AF%AD%E6%B3%95%E8%A7%A3%E6%9E%90libgram">2.5 新增公共语法解析libgram&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-6-libpq%E9%87%8D%E5%86%99INSERT">2.6 libpq重写INSERT&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-7-libpq%E9%87%8D%E5%86%99SELECT%E7%BB%93%E6%9E%9C">2.7 libpq重写SELECT结果&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-8-%E6%96%B0%E5%A2%9E%E6%94%AF%E6%8C%81int%E7%B1%BB%E5%9E%8B">2.8 新增支持int类型&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E6%9C%BA%E5%AF%86%E8%AE%A1%E7%AE%97-%E5%AE%9E%E7%8E%B0">3 机密计算 - 实现&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E7%AE%80%E5%8D%95%E8%AE%A1%E5%88%92">3.1 简单计划&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E6%94%AF%E6%8C%81%E8%8C%83%E5%9B%B4">3.2 支持范围&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B">一、数据类型&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E6%93%8D%E4%BD%9C%E7%AC%A6%E4%B8%8E%E5%87%BD%E6%95%B0">二、操作符与函数&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-2-%E6%96%B0%E5%A2%9Elibcalc">3.2 新增libcalc&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E6%96%B0%E5%A2%9Eta-calc-x2F-ca-calc">3.2 新增ta_calc/ca_calc&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-3-%E5%86%85%E6%A0%B8%E6%96%B0%E5%A2%9Eciphera%E5%87%BD%E6%95%B0">3.3 内核新增ciphera函数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-4-%E5%86%85%E6%A0%B8%E6%96%B0%E5%A2%9Eciphera%E8%BF%90%E7%AE%97%E7%AC%A6">3.4 内核新增ciphera运算符&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-5-%E5%86%85%E6%A0%B8make-op%E8%AF%86%E5%88%AB%E6%9C%BA%E5%AF%86%E8%AE%A1%E7%AE%97">3.5 内核make_op识别机密计算&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-6-index-scan%E7%AE%97%E5%AD%90">3.6 index_scan算子&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-6-%E4%BC%98%E5%8C%96">3.6 优化&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#ca-x2F-ta%E9%80%9A%E4%BF%A1">ca/ta通信&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B">4 测试用例&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E7%AD%89%E5%80%BC%E6%9F%A5%E8%AF%A2">等值查询&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2">范围查询&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%A8%A1%E7%B3%8A%E6%9F%A5%E8%AF%A2">模糊查询&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#%E9%99%84%E5%BD%95%EF%BC%9A%E4%B8%93%E5%88%A9">附录：专利&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%99%84%E5%BD%95%EF%BC%9AAI">附录：AI&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%BB%A3%E7%A0%81%E8%A6%81%E6%B1%82%EF%BC%9A">代码要求：&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#%E9%99%84%E5%BD%95%EF%BC%9A%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">附录：参考文献&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="0-基础调研">0 基础调研&lt;/h1>
&lt;h2 id="一运算符">一、运算符&lt;/h2>
&lt;ul>
&lt;li>运算符&lt;br>
以int4为例：&lt;code>select proname from pg_catalog.pg_proc where proname like '%int4%' order by proname;&lt;/code>
&lt;ul>
&lt;li>
&lt;p>一、比较运算符函数&lt;/p></description></item><item><title>数据库安全 9 透明加密</title><link>https://my-blog.j8465383071.workers.dev/posts/security/4-9-tde/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/4-9-tde/</guid><description>&lt;h1 id="1-透明加密背景">1 透明加密背景&lt;/h1>
&lt;p>在另一篇博客中，已经讨论了几个话题：&lt;/p>
&lt;ul>
&lt;li>数据泄露风险&lt;/li>
&lt;li>加密方案对比&lt;/li>
&lt;li>透明加密基本原理&lt;/li>
&lt;/ul>
&lt;p>因此，本篇博客直接进入主题，介绍openGauss透明加密特性。&lt;/p>
&lt;h1 id="2-透明加密使用">2 透明加密使用&lt;/h1>
&lt;h2 id="21-开启透明加密">2.1 开启透明加密&lt;/h2>
&lt;h2 id="22-定义加密表">2.2 定义加密表&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">enable_tde&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="23-验证数据加密">2.3 验证数据加密&lt;/h2>
&lt;h1 id="3-透明加密设计">3 透明加密设计&lt;/h1>
&lt;h1 id="4-透明加密原理">4 透明加密原理&lt;/h1>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;h2 id="11-模块">1.1 模块&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">heapam -&amp;gt; buffer -&amp;gt; smgr -&amp;gt; page
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="1-概述-1">1 概述&lt;/h1>
&lt;h2 id="11-功能">1.1 功能&lt;/h2>
&lt;p>用户创建表时，通过SQL语句指定表是否加密&lt;br>
数据库将数据页写入磁盘时，判断如果数据页属于加密表，对数据先加密在存储&lt;br>
数据库从磁盘读取数据页时，判断如果数据页已被加密，读取后马上解密&lt;/p>
&lt;h2 id="12-适配点">1.2 适配点&lt;/h2>
&lt;ul>
&lt;li>初始化page&lt;/li>
&lt;li>存储page&lt;/li>
&lt;li>读取page&lt;/li>
&lt;li>生成xlog记录：考虑初始化pagee&lt;/li>
&lt;li>重放xlog记录：考虑初始化page&lt;/li>
&lt;/ul>
&lt;h2 id="13-kun-tde">1.3 kun tde&lt;/h2>
&lt;h1 id="2-调用关系">2 调用关系&lt;/h1>
&lt;h2 id="21-初始化数据页">2.1 初始化数据页&lt;/h2>
&lt;h3 id="pageinit">PageInit&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">PageInit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Page&lt;/span> &lt;span class="n">page&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Size&lt;/span> &lt;span class="n">pageSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Size&lt;/span> &lt;span class="n">specialSize&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_xlog_insert&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_xlog_multi_insert&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_xlog_update&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">heap_xlog_visible&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">raw_heap_insert&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">PageGetTempPageCopySpecial&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fill_seq_with_data&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">seq_redo&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">brin_page_init&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">lazy_scan_heap&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">GinInitPage&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">GISTInitBuffer&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_hash_pageinit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">_bt_pageinit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">SpGistInitPage&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vm_readbuf&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">vm_extend&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">XLogRecordPageWithFreeSpace&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fsm_readbuf&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fsm_extend&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="image">image&lt;/h3>
&lt;h2 id="22-写入数据页">2.2 写入数据页&lt;/h2>
&lt;h3 id="smgrextend">smgrextend&lt;/h3>
&lt;p>调用栈：&lt;/p></description></item><item><title>海量 5 用例 G100审计重构</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-testcase-g100-audit-refactor/</link><pubDate>Thu, 16 Oct 2025 18:05:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-testcase-g100-audit-refactor/</guid><description>&lt;h1 id="1-正常场景">1 正常场景&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ddl
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- dml
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aaa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbb&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aba&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- func
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f1&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RETURNS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)::&lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LANGUAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">sql&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f1&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- trans
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">reset&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_audit_log&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-异常场景">2 异常场景&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">st1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- doest&amp;#39;t exist
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">nt1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- permission deny
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">st1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">reset&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_audit_log&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>海量 5 设计 G100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-design-g100-audit-refactor/</link><pubDate>Mon, 01 Sep 2025 18:00:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-design-g100-audit-refactor/</guid><description>&lt;h1 id="g100审计功能重构">G100审计功能重构&lt;/h1>
&lt;h1 id="1-功能简述">1 功能简述&lt;/h1>
&lt;p>在需求文档中，已详细介绍需求背景，此处不在重复介绍。&lt;br>
G100 309之前版本，审计特性存在较多问题，因此，在本版本，将重新设计与实现审计特性，解决功能、性能、易用性、可维护性、可扩展性等问题，使审计特性达到大规模商用的标准。&lt;/p>
&lt;h1 id="2-实现方案">2 实现方案&lt;/h1>
&lt;h2 id="一审计架构">一、审计架构&lt;/h2>
&lt;p>审计特性，核心子功能如下：&lt;/p>
&lt;ol>
&lt;li>配置审计：通过GUC参数，配置审计参数：日志目录、目录大小、日志文件淘汰策略等&lt;/li>
&lt;li>设置范围：通过SQL语法，设置审计策略，控制哪些事件需审计。在策略中，可按用户、操作、对象、操作结果等过滤事件&lt;/li>
&lt;li>收集事件：在代码关键节点，收集事件&lt;/li>
&lt;li>过滤事件：根据审计策略，过滤无需审计的事件&lt;/li>
&lt;li>生成日志：提取事件关键信息，生成日志&lt;/li>
&lt;li>传输日志：工作线程，通过共享内存，传输日志给审计线程&lt;/li>
&lt;li>存储日志：审计线程，组织日志，并将其存储至文件中。文件存放在单独的日志目录&lt;/li>
&lt;li>查询日志：通过内置FUNCTION，在线查询日志，通过TOOL，离线查询日志&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>其中，设置范围、过滤事件子功能相对独立，可单独设计与实现，所以，拆分到另一个的设计文档中。&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;p>审计特性整体架构图如下：&lt;/p>
&lt;p>&lt;img alt="1-st" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/5-design-g100-audit-refactor/1-st.png">&lt;/p>
&lt;h2 id="二工作流程">二、工作流程&lt;/h2>
&lt;p>收集事件的主体、操作、客体等信息时，因为需收集操作结果，即操作成功或失败，所以，很多场景中，收集事件需分为2个阶段：&lt;/p>
&lt;ul>
&lt;li>执行操作前：收集事件基本信息，包括操作类型等&lt;/li>
&lt;li>执行操作后：收集事件的操作结果。对于出现ERROR的场景，则在异常处理函数中收集操作结果。&lt;/li>
&lt;/ul>
&lt;p>在所有事件中，DML语句的事件稍复杂一点，此处主要以该类语句为例，梳理整体执行流程：&lt;/p>
&lt;p>&lt;img alt="2-fl" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/5-design-g100-audit-refactor/2-fl.png">&lt;/p>
&lt;h2 id="三详细流程">三、详细流程&lt;/h2>
&lt;h3 id="阶段1-配置审计进程启动">阶段1 配置审计（进程启动）&lt;/h3>
&lt;p>首先，用户通过GUC参数，配置审计文件管理等功能。然后，在系统启动阶段，审计模块将根据配置，初始化的各类关键资源，包括：&lt;/p>
&lt;ol>
&lt;li>日志文件：日志存储目录，初始日志文件等&lt;/li>
&lt;li>审计内存：日志缓存区，内存上下文等&lt;/li>
&lt;li>审计线程：信号处理函数等&lt;/li>
&lt;li>事件收集节点：hook函数注册等&lt;/li>
&lt;/ol>
&lt;p>详细启动过程如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span> &lt;span class="c1"># 1. 启动vastbase进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">knl_instance_init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MemoryContextInit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostmasterMain&lt;/span> &lt;span class="c1"># 2. 启动postmaster线程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SelectConfigFiles&lt;/span> &lt;span class="c1"># 3. 加载GUC参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkDataDir&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;audit_dir_init&amp;#39;&lt;/span> &lt;span class="c1"># 4. 创建审计日志文件目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;audit_hook_init&amp;#39;&lt;/span> &lt;span class="c1"># 5. 注册审计回调函数：身份认证等&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_hba&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">reset_shared&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateSharedMemoryAndSemaphores&lt;/span> &lt;span class="c1"># （日志缓冲区不是共享内存，后文阶段6详细介绍）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GlobalSysDBCache&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">Init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateLocalSysDBCache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitRoleIdHashTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;audit_comm_init&amp;#39;&lt;/span> &lt;span class="c1"># 6. 初始化审计内存上下文、日志缓存区，创建审计日志文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;initialize_util_thread(AUDIT_WRITER)&amp;#39;&lt;/span> &lt;span class="c1"># 7. 启动audit-writer 线程，持续读取日志缓冲区，等待接收与存储日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize_thread&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ===== audit-writer 线程 ==============&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GaussDbThreadMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitShmemAccess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitAuxiliaryProcess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateSharedMemoryAndSemaphores&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GaussDBAuxiliaryThreadMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BaseInit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;adt_writer_main&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ===== audit-writer 线程 ==============&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(;;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comm_select&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ConnCreate&lt;/span> &lt;span class="c1"># 9. 接收客户端连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize_util_thread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">WORKER&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize_thread&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ===== postgres 线程 ==============&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GaussDbThreadMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">knl_thread_init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitializeGUCOptions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateLocalSysDBCache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;audit_hook_init&amp;#39;&lt;/span> &lt;span class="c1"># 10. 注册事件收集回调函数：计划执行、函数执行等回调点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendInitialize&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ===== postgres 线程 ==============&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;initialize_util_thread(AUDIT_WRITER)&amp;#39;&lt;/span> &lt;span class="c1"># 11. 检查audit-writer 线程状态与自动重启&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="阶段2-设置范围">阶段2 设置范围&lt;/h3>
&lt;p>向用户提供SQL接口，用于创建审计策略。（见另一个设计文档）&lt;/p></description></item><item><title>海量 5 需求 G100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-requirement-g100-audit-refactor/</link><pubDate>Wed, 27 Aug 2025 15:13:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-requirement-g100-audit-refactor/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>审计特性：&lt;/p>
&lt;ul>
&lt;li>功能：收集数据库内的关键事件，例如启动集群、创建对象、查询数据等，根据事件生成与存储审计日志，向用户提供审计日志查询接口。&lt;/li>
&lt;li>必要：从客户角度，使用审计特性，主要目的包括：合法合规、安全监控、事故调查等。从内核角度，为满足信创要求，数据库需达到CC标准，在CC标准中，对审计功能提出多项要求。&lt;/li>
&lt;li>问题：G100审计特性存在多处设计缺陷，导致功能问题多、性能低、易用性差、可维护性差、可扩展性差等。到目前为止，其中累计识别50+缺陷，仍具有30+未识别缺陷。&lt;/li>
&lt;li>历史：openGauss早期版本，华为以色列团队开发审计特性，交付标准为基本功能可用，与商用标准差距大。G100早期版本，由openGauss引入审计特性。在之后版本，G100进行多轮迭代。&lt;/li>
&lt;/ul>
&lt;p>本需求的目标是重构审计特性，解决功能、性能、易用性、可维护性、可扩展性等问题，使审计特性达到大规模商用的标准。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>G100 3.0.8 psu5以及之后版本&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>暂无&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>原始需求：&lt;a href="https://www.tapd.cn/tapd_fe/60475194/story/detail/1160475194001083526">https://www.tapd.cn/tapd_fe/60475194/story/detail/1160475194001083526&lt;/a>&lt;/li>
&lt;li>国标查询下载网站： &lt;a href="https://openstd.samr.gov.cn/bzgk/gb/index">https://openstd.samr.gov.cn/bzgk/gb/index&lt;/a>&lt;/li>
&lt;li>CC标准
&lt;ul>
&lt;li>《GB/T 20009-2019 信息安全技术 数据库管理系统安全评估准则》&lt;/li>
&lt;li>《GB/T 20273-2019 信息安全技术 数据库管理系统安全技术要求》&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>信创标准
&lt;ul>
&lt;li>《SJ/T 11939-2024 安全可靠 集中式事务型数据库技术要求》&lt;/li>
&lt;li>《T/AIA 016—2023信创产品测评 通用要求》&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>等保标准
&lt;ul>
&lt;li>《GB/T 25070-2019》信息安全技术 网络安全等级保护安全设计技术要求》&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>数据库政府采购标准：&lt;a href="https://jx.mof.gov.cn/xxgk/zhengcefagui/202401/t20240105_3925117.htm">https://jx.mof.gov.cn/xxgk/zhengcefagui/202401/t20240105_3925117.htm&lt;/a>&lt;/li>
&lt;li>标准原文：微盘：&lt;a href="https://drive.weixin.qq.com/s?k=AHUAfwdSAA87Z01xB">https://drive.weixin.qq.com/s?k=AHUAfwdSAA87Z01xB&lt;/a>&lt;/li>
&lt;li>G100审计特性：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549&lt;/a>&lt;/li>
&lt;li>G100审计历史客户需求：&lt;a href="https://www.tapd.cn/tapd_fe/60475194/story/list?sort_name=created&amp;amp;order=&amp;amp;useScene=storyList&amp;amp;groupType=&amp;amp;conf_id=1160475194001046742&amp;amp;queryToken=fe85cdfc29d23bba423905c15d72d127&amp;amp;page=1">https://www.tapd.cn/tapd_fe/60475194/story/list?sort_name=created&amp;amp;order=&amp;amp;useScene=storyList&amp;amp;groupType=&amp;amp;conf_id=1160475194001046742&amp;amp;queryToken=fe85cdfc29d23bba423905c15d72d127&amp;amp;page=1&lt;/a>&lt;/li>
&lt;li>Oracle审计特性：&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html">https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html&lt;/a>&lt;/li>
&lt;li>开源组件pgaudit：&lt;a href="https://www.modb.pro/db/105894">https://www.modb.pro/db/105894&lt;/a>&lt;/li>
&lt;li>需求分析与整理文档：语雀：&lt;a href="https://www.yuque.com/u57264336/oav5h4/tkhcgdilcbpuqm09">https://www.yuque.com/u57264336/oav5h4/tkhcgdilcbpuqm09&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-g100审计功能重构">2 G100审计功能重构&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="一需求背景审计特性">一、需求背景：审计特性&lt;/h3>
&lt;ul>
&lt;li>审计目的：记录数据库内的各种事件，事件包括：
&lt;ul>
&lt;li>启动、恢复、切换、停止集群&lt;/li>
&lt;li>登录、注销账号&lt;/li>
&lt;li>创建、修改、删除数据库对象，包括：DATABASE、SCHEMA、TABLE等&lt;/li>
&lt;li>插入、更新、删除、查询关系表&lt;/li>
&lt;li>…&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>描述事件：每个事件中，有3个关键要素：&amp;lt;主体&amp;gt;&amp;lt;操作&amp;gt;&amp;lt;客体&amp;gt;
&lt;ul>
&lt;li>主体：一般是数据库用户&lt;/li>
&lt;li>客体：集群、账号、DATABASE、SCHEMA、TABLE、FUNCTION等&lt;/li>
&lt;li>操作：不同的客体，涉及的操作不一样。比如，对于TABLE，操作有：CREATE, INSERT, SELECT等。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>审计日志：针对每个事件，收集与主体、操作、客体有关的信息，封装为1条审计日志。通常，1条审计日志中，包括的信息如下：
&lt;ul>
&lt;li>主体相关：用户名、客户端IP、会话ID等&lt;/li>
&lt;li>操作相关：操作的类型、操作的时间、触发操作的SQL语句等&lt;/li>
&lt;li>客体相关：客体类型、客体名称、客体属于哪个database、客体属于哪个schema&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>审计特性：为实现审计功能，在数据库内核中，需实现以下功能：
&lt;ul>
&lt;li>配置范围：对用户提供接口，配置需审计的事件范围&lt;/li>
&lt;li>收集事件：在内核关键代码节点，发现事件，例如：登录用户、创建对象、查询数据等，收集主体、操作、客体相关信息&lt;/li>
&lt;li>生成日志：按统一格式组织事件信息，生成审计日志&lt;/li>
&lt;li>存储日志：将审计日志存储至磁盘&lt;/li>
&lt;li>查询日志：对用户提供接口，查询日志&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="二需求背景g100审计特性旧版本">二、需求背景：G100审计特性（旧版本）&lt;/h3>
&lt;p>G100早期版本，引入openGauss审计特性，但是，该特性存在较多问题，包括：&lt;/p></description></item><item><title>海量 5 方案 G100审计重构</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-solution-g100-audit-refactor/</link><pubDate>Wed, 23 Apr 2025 18:00:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/5-solution-g100-audit-refactor/</guid><description>&lt;ol>
&lt;li>&lt;a href="#1-%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7%E4%BB%8B%E7%BB%8D">1 审计特性介绍&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD">1.1 核心功能&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%EF%BC%88308-3%EF%BC%89">1.2 整体架构（308.3）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B%EF%BC%88308-3%EF%BC%89">1.3 工作流程（308.3）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-%E6%96%87%E4%BB%B6%E7%BB%84%E7%BB%87">1.4 文件组织&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E4%BD%BF%E7%94%A8%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7">2 使用审计特性&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E9%85%8D%E7%BD%AE%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7">2.1 配置审计特性&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E5%90%AF%E5%8A%A8%E6%95%B0%E6%8D%AE%E5%BA%93">2.2 启动数据库&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E7%94%9F%E6%88%90%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">2.3 生成审计日志&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-4-%E6%9F%A5%E8%AF%A2%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">2.4 查询审计日志&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-5-%E5%BC%82%E5%B8%B8%E7%AE%A1%E7%90%86">2.5 异常管理&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7%E5%8F%98%E6%9B%B4%E7%82%B9">3 审计特性变更点&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90">3.1 问题分析&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E9%87%8D%E6%9E%84%E7%9B%AE%E6%A0%87">2.2 重构目标&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90%EF%BC%88%E5%BD%93%E5%89%8D%E7%89%88%E6%9C%AC%EF%BC%89">2.3 问题分析（当前版本）&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E5%AD%98%E5%82%A8%E6%97%A5%E5%BF%97%E6%85%A2">一、存储日志慢&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E6%A3%80%E7%B4%A2%E6%97%A5%E5%BF%97%E6%85%A2">二、检索日志慢&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89%E3%80%81%E6%96%87%E4%BB%B6%E9%97%AE%E9%A2%98%E5%A4%9A">三、文件问题多&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-4-%E9%87%8D%E6%9E%84%E6%96%B9%E6%A1%88">2.4 重构方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E5%AD%98%E5%82%A8%E6%97%A5%E5%BF%97%E9%87%8D%E6%9E%84">一、存储日志重构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E6%A3%80%E7%B4%A2%E6%97%A5%E5%BF%97">二、检索日志&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-5-%E9%87%8D%E6%9E%84%E5%BC%80%E9%94%80">2.5 重构开销&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-6-%E9%87%8D%E6%9E%84%E5%BD%B1%E5%93%8D">2.6 重构影响&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-7-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95">2.7 性能测试&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1">3 审计特性详细设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1">3.1 架构设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84">一、整体架构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B">二、工作流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89%E3%80%81%E6%96%87%E4%BB%B6%E7%BB%84%E7%BB%87">三、文件组织&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-2-%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1">3.2 详细设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E9%85%8D%E7%BD%AE%E5%AE%A1%E8%AE%A1%E7%89%B9%E6%80%A7">一、配置审计特性&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E5%AE%A1%E8%AE%A1%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86">二、审计文件管理&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89%E3%80%81-%E5%90%AF%E5%8A%A8%E6%95%B0%E6%8D%AE%E5%BA%93">三、 启动数据库&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%9B%9B%E3%80%81%E7%94%9F%E6%88%90%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">四、生成审计日志&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%94%E3%80%81%E5%AD%98%E5%82%A8%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">五、存储审计日志&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%AD%E3%80%81%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%E4%B8%80%E8%87%B4%E6%80%A7">六、审计日志一致性&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%83%E3%80%81%E5%BD%92%E5%B9%B6%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">七、归并审计日志&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%AB%E3%80%81%E6%9F%A5%E8%AF%A2%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97">八、查询审计日志&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E5%AE%A1%E8%AE%A1%E5%90%8E%E7%BB%AD%E9%87%8D%E6%9E%84%E8%AE%A1%E5%88%92">4 审计后续重构计划&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>摘要&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>介绍审计特性，分析性能问题，提出优化方案，评审优化方案，规划其他计划&lt;/p>&lt;/blockquote>
&lt;h1 id="1-审计特性介绍">1 审计特性介绍&lt;/h1>
&lt;h2 id="11-核心功能">1.1 核心功能&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>审计特性：记录数据库内的各种事件，事件包括：&lt;/p></description></item><item><title>数据库安全 统一管理</title><link>https://my-blog.j8465383071.workers.dev/posts/security/5-unified-management/</link><pubDate>Sat, 25 Jan 2025 21:10:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/5-unified-management/</guid><description>&lt;h1 id="2-使用方法">2 使用方法&lt;/h1>
&lt;h2 id="21-设置安全策略">2.1 设置安全策略&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>表级&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 1 身份认证
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 安全传输
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 安全审计
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ad1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;security audit&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">scope&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;create, insert, update&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 访问控制
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ac1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;access control&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">group&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;user1, user2, user3&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 数据发现
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 6 数据防篡改
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lga&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ledger&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 7 加密函数
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 8 透明加密
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">se1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;storage encrypt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;key1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 9 数据脱敏
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ms1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;mask&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;money&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 10 全密态加密
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SECURITY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ce1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">USE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;client encrypt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;key1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 11 机密计算
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>列级&lt;/p></description></item><item><title>PostgreSQL 5-1 libpq</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/5-1-libpq/</link><pubDate>Tue, 30 Jun 2026 14:43:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/5-1-libpq/</guid><description>&lt;h1 id="简介">简介&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>postgresql 简单架构&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">application driver&lt;span class="o">(&lt;/span>jdbc/libpq/..&lt;span class="o">)&lt;/span> server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-----------------------------------------------+-----------------------------------------+---------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> PQconnect&lt;span class="o">(&lt;/span>host, port, user, name&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="k">do&lt;/span> something ..
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> PQexec&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;create table t1(c1 int, c2 text)&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> PQexecStart&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> PQsendQuery&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> pqPutMsgStart&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;Q&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> pqPutnchar&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$sql&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> pqPutMsgEnd&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> pqFlush&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> SocketBackend&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> pq_parse_input&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> &lt;span class="s1">&amp;#39;Q&amp;#39;&lt;/span>: exec_simple_query&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> PQexec&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;insert into t1 values(1,&amp;#39;a&amp;#39;),(2,&amp;#39;b&amp;#39;)&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> PQexec&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;select * from t1&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> ..
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> ..
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> exec_simple_query&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>libpq的功能&lt;/p>
&lt;ul>
&lt;li>连接管理&lt;/li>
&lt;li>协议编码&lt;/li>
&lt;li>数据收发&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="连接管理">连接管理&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">application driver(jdbc/libpq/..) server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+-----------------------------------------+---------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| connect(host, port, user, name)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="协议编码">协议编码&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>消息通用格式&lt;/p></description></item><item><title>海量 6 设计 greenplum</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/6-design-greenplum/</link><pubDate>Thu, 15 May 2025 16:36:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/6-design-greenplum/</guid><description>&lt;h1 id="1-需求分析">1 需求分析&lt;/h1>
&lt;ol>
&lt;li>透明加密
&lt;ul>
&lt;li>主密钥&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>动态脱敏
&lt;ul>
&lt;li>和统一审计共用resource lable模块&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>全密态
&lt;ul>
&lt;li>密态等值&lt;/li>
&lt;li>密态非等值
&lt;ul>
&lt;li>范围查询：OPE保序加密&lt;/li>
&lt;li>模糊查询&lt;/li>
&lt;li>内置函数&lt;/li>
&lt;li>排序&lt;/li>
&lt;li>..&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>防篡改
&lt;ul>
&lt;li>分布式：有点麻烦，区块链记录在每个节点上&lt;/li>
&lt;li>哈希函数：md5&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="11-透明加密">1.1 透明加密&lt;/h2>
&lt;ul>
&lt;li>模块分析
&lt;ul>
&lt;li>密钥管理
&lt;ul>
&lt;li>设置主密钥&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>定义加密属性
&lt;ul>
&lt;li>表：普通表、临时表、分区表、toast表&lt;/li>
&lt;li>索引&lt;/li>
&lt;li>xlog&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>加密数据
&lt;ul>
&lt;li>加密算法：aes-256-ctr, sm4-ctr&lt;/li>
&lt;li>备机加密&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 创建主密钥
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 设置表加密
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">enable_tde&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 验证数据加密存储
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbbcccddd&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-动态脱敏">1.2 动态脱敏&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 开启脱敏功能
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">gs_guc&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">reload&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">D&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">GAUSSHOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;enable_security_policy=on&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 创建表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;bbccdd&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbccdd&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 创建用户
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 创建资源标签（只对u1脱敏）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RESOURCE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LABEL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ADD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">COLUMN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MASKING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">m1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">randommasking&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LABEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FILTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ROLES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 验证脱敏：只有u1脱敏
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RESET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROLE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RESET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ROLE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 清理环境
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MASKING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">m1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RESOURCE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LABEL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-全密态">1.3 全密态&lt;/h2>
&lt;ul>
&lt;li>模块分析
&lt;ul>
&lt;li>客户端
&lt;ul>
&lt;li>语法解析&lt;/li>
&lt;li>语义分析&lt;/li>
&lt;li>加密&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>服务端
&lt;ul>
&lt;li>..&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="14-防篡改">1.4 防篡改&lt;/h2>
&lt;ul>
&lt;li>hash算法：md5&lt;/li>
&lt;/ul>
&lt;h1 id="2-greenplum">2 greenplum&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">yum install zstd libzstd-devel krb5-devel krb5-libs cyrus-sasl-gssapi libevent-devel libyaml-devel libxml2 libxml2-devel curl libcurl-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install apr apr-devel apr-util apr-util-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install expat-devel openldap-devel bzip2 bzip2-devel xerces-c xerces-c-devel python36-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ln -s /usr/include/python2.7/Python.h /usr/include/Python.h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 报错就降级&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum downgrade expat-2.1.0-12.el7
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#39;&amp;#39;使用单引号可防止变量$PATH等展开&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export GPHOME=`pwd`/install
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export BINARYLIBS=`pwd`/../third
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export GCC_PATH=$BINARYLIBS/buildtools/gcc10.3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export CC=$GCC_PATH/gcc/bin/gcc
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export CXX=$GCC_PATH/gcc/bin/g++
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export LD_LIBRARY_PATH=$GCC_PATH/gcc/lib64:$GCC_PATH/isl/lib:$GCC_PATH/mpc/lib/:$GCC_PATH/mpfr/lib/:$GCC_PATH/gmp/lib/:$LD_LIBRARY_PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PATH=$GCC_PATH/gcc/bin:$PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt; genv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 建议把环境变量再在~/.bashrc中写一份，因为初始化集群时，需要ssh登录，以初始化segment节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./configure --with-python --with-libxml --with-gssapi --without-zlib --with-gpcc --prefix&lt;span class="o">=&lt;/span>&lt;span class="nv">$GPHOME&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make -sj &lt;span class="m">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install -sj &lt;span class="m">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">ARRAY_NAME=&amp;#34;&lt;/span>Greenplum Cluster&lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">SEG_PREFIX=gpseg #segment数据库前缀名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">PORT_BASE=40000 #segment数据库起始端口号
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">declare -a DATA_DIRECTORY=(//home/shenkun/gp/install/segdata)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">#segments数据目录，有几个DATA_DIRECTORY, 每个节点上便会启动几个segment，本例为2个segment
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">MASTER_HOSTNAME=master #master主机名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">MASTER_DIRECTORY=/home/shenkun/gp/install/master #master数据目录
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">MASTER_PORT=5000 #master端口号，也是对外业务端口号
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">TRUSTED_SHELL=ssh
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">CHECK_POINT_SEGMENTS=8
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">ENCODING=UNICODE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">DATABASE_NAME=gpdb
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">MACHINE_LIST_FILE=/home/shenkun/gp/install/hostfile #集群配置文件，hostfile对应7中创建的文件名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; gpcfg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;master&amp;#34;&lt;/span> &amp;gt; hostfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gpinitsystem -c gpcfg -a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -p &lt;span class="m">5000&lt;/span> -d gpdb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PGOPTIONS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;-c gp_session_role=utility&amp;#39;&lt;/span> psql -p &lt;span class="m">40000&lt;/span> -d gpdb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># @ master&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">exec_simple_query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_parse_query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_analyze_and_rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_plan_queries
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_plan_querie
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> standard_planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> subquery_planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cdbllize_adjust_top_path
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> create_plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cdbpathtoplan_create_flow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> makeFlow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cdbllize_decorate_subplans_with_motions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalStart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutorStart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> standard_ExecutorStart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> CdbDispatchPlan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># @ segment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> exec_mpp_query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> deserializeNode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalStart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalRun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalDrop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalRun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalRunMulti
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ProcessQuery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutorStart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutorRun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> standard_ExecutorRun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutePlan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutorFinish
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ExecutorEnd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PortalDrop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>海量 8 需求 海康身份认证</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/8-requirement-hikvision-auth/</link><pubDate>Mon, 30 Jun 2025 18:32:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/8-requirement-hikvision-auth/</guid><description>&lt;p>本需求包含6个小需求：&lt;/p>
&lt;ol>
&lt;li>身份认证：创建用户：CREATE/SET USER .. PASSWORD ..，密码可以只设置2类字符&lt;/li>
&lt;li>身份认证：创建用户：CREATE/SET [角色] USER ..，角色支持指定SUPERUSER和NOSUPERUSER&lt;/li>
&lt;li>身份认证：查看用户：SELECT .. FROM pg_user，普通用户可查询pg_user视图（仅pg兼容性）&lt;/li>
&lt;li>身份认证：登录用户：SET ROLE new_user [PASSWORD ..]，new_user是会话用户时，可以不指定PASSWORD&lt;/li>
&lt;li>访问控制：Database权限：普通用户可访问template1数据库（仅pg兼容性）&lt;/li>
&lt;li>访问控制：Schema权限：普通用户可在public下执行CREATE操作（仅pg兼容性）&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>描述&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>
&lt;p>身份认证：创建用户&lt;br>
变更：用户密码可以只包含2类字符&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- password_polcy取值不同，密码需包含的字符种类数不同，为1时需3类，需2时需4类，为3时需2类
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SYSTEM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password_policy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">OT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 修改取值范围[0,2]为[0,3]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;password1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 此时，密码可以只含2类字符
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">old_user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORd&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;password1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>身份认证：创建用户&lt;br>
变更：可以指定SUPERUSER角色&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUPERUSER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 支持设置 SUPERUSER 角色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">NOSUPERUSER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 支持取消 SUPERUSER 角色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">old_user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUPERUSER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>身份认证：查看用户&lt;br>
变更：普通用户可查询pg_user视图（仅pg兼容性）&lt;/p></description></item><item><title>WAL 加密模块设计</title><link>https://my-blog.j8465383071.workers.dev/posts/security/wal-encryption-design/</link><pubDate>Mon, 07 Sep 2026 15:30:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/wal-encryption-design/</guid><description>&lt;p>假设集群里已经存在表级透明加密模块，在此基础上设计一个高性能、高易用性的 WAL 加密模块。&lt;/p>
&lt;p>WAL 加密的难点几乎不在&amp;quot;加密&amp;quot;本身，而在两件事：&lt;strong>同一个 8KB 页会被反复重写&lt;/strong>，以及&lt;strong>恢复路径要在拿不到 catalog 的时候就能解密&lt;/strong>。下面按设计决策的顺序展开。&lt;/p>
&lt;h2 id="1-威胁模型">1 威胁模型&lt;/h2>
&lt;p>先划清边界，因为它直接决定后面几个取舍。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>要防的&lt;/strong>：磁盘 / 备份 / 归档介质被拖走；DBA 之外的运维人员直接读 &lt;code>pg_wal/&lt;/code>；WAL 归档到对象存储。&lt;/li>
&lt;li>&lt;strong>不防的&lt;/strong>：有 root 权限的在线攻击者（内存里必然有明文）、旁路攻击。&lt;/li>
&lt;/ul>
&lt;h3 id="11-为什么不用-dm-crypt-了事">1.1 为什么不用 dm-crypt 了事&lt;/h3>
&lt;p>如果只是防&amp;quot;介质丢失&amp;quot;，块设备加密（LUKS/dm-crypt）性价比高得多。在数据库内核里做 WAL 加密，真正的理由只有三个：&lt;/p>
&lt;ol>
&lt;li>密钥要由数据库自己管，不能落在 OS 层（密评 / 国测要求）；&lt;/li>
&lt;li>归档件要天然带密；&lt;/li>
&lt;li>和已有的表级 TDE 共用一套密钥体系。&lt;/li>
&lt;/ol>
&lt;p>设计要始终对齐这三个理由，否则很容易做成一个又慢、又没多大意义的模块。&lt;/p>
&lt;h3 id="12-fpi-是必须堵的洞">1.2 FPI 是必须堵的洞&lt;/h3>
&lt;p>既然表级 TDE 已经存在，那么 &lt;strong>FPI（full page image）就是个必堵的泄漏点&lt;/strong>。&lt;/p>
&lt;p>如果 TDE 是在 smgr 层做的（缓冲区里是明文、写盘时加密），那么 WAL 里的 FPI 记录的是&lt;strong>明文页&lt;/strong> —— 加密表的数据会原封不动地漏进 WAL。&lt;/p>
&lt;blockquote>
&lt;p>只要集群里存在任何一张加密表，WAL 加密就必须强制开启，不能是两个独立开关。&lt;/p>&lt;/blockquote>
&lt;p>实现上做成一个集群级的 &lt;code>data_encryption = on&lt;/code>，或者至少让 &lt;code>CREATE ENCRYPTION POLICY&lt;/code> 在 WAL 加密未开启时直接报错。这是易用性设计里最重要的一条：&lt;strong>不要把一个&amp;quot;配错了就静默泄密&amp;quot;的组合留给用户&lt;/strong>。&lt;/p></description></item><item><title>Vastbase 数据库研发过程安全分析报告</title><link>https://my-blog.j8465383071.workers.dev/posts/compliance/sdl-process-security/</link><pubDate>Fri, 14 Aug 2026 17:53:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/compliance/sdl-process-security/</guid><description/></item><item><title>c++</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/cpp/</link><pubDate>Thu, 13 Aug 2026 10:54:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/cpp/</guid><description>&lt;h1 id="1-容器">1 容器&lt;/h1>
&lt;h2 id="11-基本概念">1.1 基本概念&lt;/h2>
&lt;p>c++ stl&lt;/p>
&lt;ul>
&lt;li>对象&lt;/li>
&lt;li>指针&lt;/li>
&lt;li>引用&lt;/li>
&lt;li>迭代器&lt;/li>
&lt;li>容器接口&lt;/li>
&lt;/ul>
&lt;h2 id="11-接口">1.1 接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.1 vector —— 动态数组
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 末尾添加
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop_back&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 删除末尾
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 元素个数
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 是否为空
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// 随机访问（无边界检查）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">at&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 随机访问（边界检查）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">front&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">back&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 首/尾元素
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">clear&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 清空
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.2 deque —— 双端队列
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">deque&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_front&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 头插
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 尾插
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop_front&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 头删
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop_back&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 尾删
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">front&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">back&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 首/尾访问
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.3 list —— 双向链表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">list&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">l&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_front&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop_front&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop_back&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 删除所有值为2的元素
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">front&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">back&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.4 set —— 有序唯一集合
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// 实际存储 {1,3,4}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 插入
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">erase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 删除指定值
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 查找，返回迭代器，未找到返回 end()
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 计数（0或1）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 允许重复元素用 multiset，接口基本相同
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.5 map —— 有序键值对
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">ages&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ages&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;Alice&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 插入/修改；注意：若 key 不存在，[] 会自动插入一个默认值(0)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">ages&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;Bob&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ages&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">erase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Alice&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 删除
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">ages&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Bob&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 查找，不想触发自动插入就用 find 而不是 []
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">ages&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Tom&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 计数
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">ages&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">ages&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 允许重复key用 multimap，接口基本相同
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.6 unordered_set —— 哈希无序集合
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">unordered_set&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">us&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">insert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">erase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// O(1) 查找
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">us&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.7 unordered_map —— 哈希无序键值对
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">unordered_map&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">scores&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;Tom&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">95&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;Jerry&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">88&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">erase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Tom&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Jerry&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Bob&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">scores&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.8 stack —— 栈（LIFO）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">stack&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 入栈
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">top&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 查看栈顶
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 出栈（无返回值）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">st&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.9 priority_queue —— 优先队列（默认最大堆）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">priority_queue&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">pq&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">top&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 最大元素（10）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">pop&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 移除堆顶
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">pq&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 想要最小堆：priority_queue&amp;lt;int, vector&amp;lt;int&amp;gt;, greater&amp;lt;int&amp;gt;&amp;gt; minPq;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.10 pair —— 两个值的组合，不用专门定义 struct
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">pair&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">p1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;Alice&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">first&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// &amp;#34;Alice&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">p1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">second&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 25
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">pair&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">p2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">make_pair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 另一种构造写法
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.11 string —— 字符串（可以当成 char 的容器，替代 char* + strcpy/strcat 那一套）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">s2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">s2&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="s">&amp;#34; world&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 拼接
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 长度（两个等价）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">s2&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// 下标访问
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">substr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 从下标1开始取3个字符，&amp;#34;ell&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;wor&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 查找子串，返回起始下标，找不到返回 string::npos
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Hi&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 替换
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 追加
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">to_string&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">42&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// int -&amp;gt; string
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">stoi&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;123&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// string -&amp;gt; int
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">s2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 要传给 C 函数（如 fopen）时转成 const char*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 1.12 array —— 固定大小数组（比原生C数组多了 .size() 等接口，但不能动态扩容）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 全部填充为0
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-其他">1.2 其他&lt;/h2>
&lt;p>对所有容器通用&lt;/p></description></item><item><title>VexDB 数据库安全自评价报告</title><link>https://my-blog.j8465383071.workers.dev/posts/compliance/security-self-assessment/</link><pubDate>Wed, 29 Jul 2026 18:51:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/compliance/security-self-assessment/</guid><description>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>版本号&lt;/th>
&lt;th>日期&lt;/th>
&lt;th>修改说明&lt;/th>
&lt;th>编制人&lt;/th>
&lt;th>审核人&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.0&lt;/td>
&lt;td>2026.07.24&lt;/td>
&lt;td>完成初稿&lt;/td>
&lt;td>沈坤&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="1核心资产">1、核心资产&lt;/h2>
&lt;p>VexDB 的核心资产分为七类，覆盖数据、结构、访问、运行、审计、内存和密码资源，是数据库安全保护的主要对象。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>核心资产&lt;/th>
&lt;th>资产内容&lt;/th>
&lt;th>资产价值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>数据资产&lt;/td>
&lt;td>业务数据、用户数据、交易数据等存储内容&lt;/td>
&lt;td>数据库核心资源。泄露、篡改或丢失影响业务安全&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库结构资产&lt;/td>
&lt;td>模式、表、字段、索引、视图、存储过程、函数、约束等&lt;/td>
&lt;td>描述数据组织和业务逻辑。非法修改影响业务正确性&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库管理资产&lt;/td>
&lt;td>用户、角色、权限、配置参数、安全策略等&lt;/td>
&lt;td>控制访问范围和运行行为。错误配置影响整体安全&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库运行资产&lt;/td>
&lt;td>实例、进程、数据文件、日志文件及计算存储资源&lt;/td>
&lt;td>支撑数据库服务运行。破坏导致服务不可用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库操作记录资产&lt;/td>
&lt;td>访问日志、审计记录、运行日志、管理操作记录等&lt;/td>
&lt;td>支撑安全分析、事件追踪和责任认定&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库内存资产&lt;/td>
&lt;td>内存中的业务数据、缓存、会话信息和认证凭证&lt;/td>
&lt;td>运行过程中的敏感信息。泄露可能导致数据或凭证暴露&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>密码与密钥资产&lt;/td>
&lt;td>加密密钥、口令摘要、认证凭证等密码资源&lt;/td>
&lt;td>支撑身份认证和数据保护。泄露可能导致安全机制失效&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>核心资产的机密性、完整性和可用性，决定数据库安全运行和业务连续性。&lt;/p>
&lt;hr>
&lt;h2 id="2安全风险和应对措施">2、安全风险和应对措施&lt;/h2>
&lt;p>VexDB 面临外部攻击、内部误操作、权限滥用和运行环境异常等风险，可能导致非法访问、数据泄露、数据篡改、身份冒用和服务不可用。主要风险与应对措施如下。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>安全风险&lt;/th>
&lt;th>风险描述&lt;/th>
&lt;th>应对措施&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>非法访问风险&lt;/strong>&lt;/td>
&lt;td>非授权主机连接数据库，获取非法访问入口&lt;/td>
&lt;td>网络防火墙&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>身份认证风险&lt;/strong>&lt;/td>
&lt;td>弱口令、凭证泄露或认证缺陷导致身份冒用&lt;/td>
&lt;td>身份认证&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>通信安全风险&lt;/strong>&lt;/td>
&lt;td>网络传输被窃听、伪造、重放或篡改&lt;/td>
&lt;td>安全传输&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>权限控制风险&lt;/strong>&lt;/td>
&lt;td>权限配置不当或权限提升导致越权访问&lt;/td>
&lt;td>访问控制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>数据安全风险&lt;/strong>&lt;/td>
&lt;td>数据存储、传输、处理过程中发生泄露或篡改&lt;/td>
&lt;td>透明加密、驱动加密、机密计算、动态脱敏、数据防篡改&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>密钥安全风险&lt;/strong>&lt;/td>
&lt;td>密钥泄露、丢失或生命周期管理不足导致保护失效&lt;/td>
&lt;td>密钥管理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>操作追溯风险&lt;/strong>&lt;/td>
&lt;td>数据访问和管理操作缺少记录，无法有效追责&lt;/td>
&lt;td>数据库审计、数据防篡改&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>服务可用性风险&lt;/strong>&lt;/td>
&lt;td>恶意请求或资源异常消耗导致性能下降或服务中断&lt;/td>
&lt;td>资源安全&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>运行环境风险&lt;/strong>&lt;/td>
&lt;td>不可信环境或异常运行环境导致数据暴露风险&lt;/td>
&lt;td>驱动加密、机密计算、密钥管理&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="vexdb-通过网络防护身份认证访问控制数据保护密码保护安全审计和资源管理等能力降低非法访问数据泄露数据篡改和服务不可用等安全风险">VexDB 通过网络防护、身份认证、访问控制、数据保护、密码保护、安全审计和资源管理等能力，降低非法访问、数据泄露、数据篡改和服务不可用等安全风险。&lt;/h2>
&lt;h2 id="3安全机制">3、安全机制&lt;/h2>
&lt;p>VexDB 从接入、传输、访问、存储、计算、合规六个维度构建防御模型，各安全机制相互独立又相互配合。&lt;/p></description></item><item><title>数据库安全 防篡改</title><link>https://my-blog.j8465383071.workers.dev/posts/security/blockchain-tamper-proof/</link><pubDate>Wed, 29 Jul 2026 10:04:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/blockchain-tamper-proof/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">BLOCKCHAIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">blockchain&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">s1_t1_hist&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bb&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">hash&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">blockchain&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">s1_t1_hist&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">hahs_ins&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">hash_del&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">pre_hash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_global_chain&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">relnsp&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relhash&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">globalhash&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">txcommand&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="分布式">分布式&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">BLOCKCHAIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">create_distributed_table&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1.t1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;c1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bb&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ee&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">hash&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">blockchain&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">s1_t1_hist&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- hahs_ins,hash_del,pre_hash, 其中，pre_hash没用上，无作用
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_global_chain&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- relnsp,relname,relhash,globalhash,txcommand
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_archive&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_repair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_archive&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_repair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="集中式">集中式&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">BLOCKCHAIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bb&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ee&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">hash&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">blockchain&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">s1_t1_hist&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gs_global_chain&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_archive&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_hist_repair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_archive&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ledger_gchain_repair&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 下面2个函数，不用适配，别动代码，告诉我当前表现
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT * FROM ledger_hist(&amp;#39;s1&amp;#39;, &amp;#39;t1&amp;#39;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT * FROM ledger_gchain();
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>CREATE SCHEMA s1 WITH BLOCKCHAIN;&lt;br>
CREATE TABLE s1.t1(c1 INT, c2 TEXT);&lt;/p></description></item><item><title>国测 claude</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/claude-code-vscode/</link><pubDate>Mon, 27 Jul 2026 19:03:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/claude-code-vscode/</guid><description>&lt;h1 id="vscode-claude-code-扩展配置">VSCode Claude Code 扩展配置&lt;/h1>
&lt;p>本文记录如何在 VSCode 中配置 Claude Code 扩展，接入第三方（海量/glm）模型服务，无需在本机维护环境变量，扩展启动时自动注入。&lt;/p>
&lt;h2 id="配置位置">配置位置&lt;/h2>
&lt;p>VSCode 用户级配置文件：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Windows&lt;/strong>：&lt;code>%APPDATA%\Code\User\settings.json&lt;/code>&lt;br>
（即 &lt;code>C:\Users\&amp;lt;用户名&amp;gt;\AppData\Roaming\Code\User\settings.json&lt;/code>）&lt;/li>
&lt;li>&lt;strong>macOS&lt;/strong>：&lt;code>~/Library/Application Support/Code/User/settings.json&lt;/code>&lt;/li>
&lt;li>&lt;strong>Linux&lt;/strong>：&lt;code>~/.config/Code/User/settings.json&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>打开方式：VSCode 中按 &lt;code>Ctrl + ,&lt;/code> 打开设置 → 右上角「打开设置 (JSON)」图标，或直接 &lt;code>Ctrl + Shift + P&lt;/code> 输入 &lt;code>Preferences: Open User Settings (JSON)&lt;/code>。&lt;/p>
&lt;h2 id="完整配置">完整配置&lt;/h2>
&lt;p>将以下内容合并进 &lt;code>settings.json&lt;/code>（注意 JSON 语法，最后一项末尾不要多逗号）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;claudeCode.environmentVariables&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_BASE_URL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://172.16.105.104:3000&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_AUTH_TOKEN&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sk-hR1tQQloyPW0ax9b7404D51285Ae4737A118457535Fc33Ae&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_MODEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_OPUS_MODEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_SONNET_MODEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_HAIKU_MODEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;glm-5&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;CLAUDE_CODE_SUBAGENT_MODEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;glm-5&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;CLAUDE_CODE_EFFORT_LEVEL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;max&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;claudeCode.preferredLocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;panel&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="环境变量说明">环境变量说明&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">变量名&lt;/th>
&lt;th style="text-align: left">作用&lt;/th>
&lt;th style="text-align: left">说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_BASE_URL&lt;/code>&lt;/td>
&lt;td style="text-align: left">API 基础地址&lt;/td>
&lt;td style="text-align: left">指向第三方中转服务（兼容 Anthropic 协议）。海量外网网关示例：&lt;code>http://172.16.105.104:3000&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_AUTH_TOKEN&lt;/code>&lt;/td>
&lt;td style="text-align: left">鉴权令牌&lt;/td>
&lt;td style="text-align: left">中转服务下发的 &lt;code>sk-xxx&lt;/code>，等价于官方的 API Key&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_MODEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">默认模型&lt;/td>
&lt;td style="text-align: left">主对话使用的模型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">Opus 档模型&lt;/td>
&lt;td style="text-align: left">覆盖官方 Opus 映射，通常设为最强模型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">Sonnet 档模型&lt;/td>
&lt;td style="text-align: left">覆盖官方 Sonnet 映射，日常主力&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">Haiku 档模型&lt;/td>
&lt;td style="text-align: left">覆盖官方 Haiku 映射，轻量快模型，用于补全/摘要&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>CLAUDE_CODE_SUBAGENT_MODEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">子 Agent 模型&lt;/td>
&lt;td style="text-align: left">Task/Explore 等子任务使用的模型，建议用快模型省钱&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>CLAUDE_CODE_EFFORT_LEVEL&lt;/code>&lt;/td>
&lt;td style="text-align: left">推理强度&lt;/td>
&lt;td style="text-align: left">&lt;code>max&lt;/code> 表示最高推理强度（思考最深），可选 &lt;code>low/medium/high/max&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>扩展项 &lt;code>claudeCode.preferredLocation&lt;/code>：控制 Claude Code 面板的默认停靠位置，可选 &lt;code>panel&lt;/code>（底部面板）或 &lt;code>editor&lt;/code>（作为编辑器标签页）。&lt;/p></description></item><item><title>国测 vexdb</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vexdb/</link><pubDate>Mon, 27 Jul 2026 14:19:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vexdb/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- cn: 50000
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- dn1: 50005
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- dn2: 50010
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PG_DIST_NODE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">create_distributed_table&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;c1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 创建8个分片，dn1和dn2，每个dn有4个分片，即4个表，表名为 t1_$oid
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_dist_shard&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- min和max是hash之后的值
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_dist_shard_placement&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_dist_partition&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bb&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50005&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_class&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">like&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%t1%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50010&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_class&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">relname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">like&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;%t1%&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SELECT&lt;/span> &lt;span class="n">create_distributed_table&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;c1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shard 1 (dn1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">worker_apply_shard_ddl_command&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">12042&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;CREATE TABLE public.t1 (c1 integer, c2 text) WITH (orientation=row, compression=no, fillfactor=80)&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># dn1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">worker_apply_shard_ddl_command&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ddlnode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ParseTreeNode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sql&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelayEventExtendNames&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ddlnode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sharid&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 在语法解析树中，把t1名称，修改为t1_$shardid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessUtilityParseTree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">worker_apply_shard_ddl_command&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">12042&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;ALTER TABLE public.t1 OWNER TO shenkun&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shard 2 (dn2)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">worker_apply_shard_ddl_command&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">12043&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;CREATE TABLE public.t1 (c1 integer, c2 text) WITH (orientation=row, compression=no, fillfactor=80)&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">worker_apply_shard_ddl_command&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">12043&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;ALTER TABLE public.t1 OWNER TO shenkun&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shared 3 (dn1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; 一共8个分片，每个分片2条SQL！&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">INSERT&lt;/span> &lt;span class="n">INTO&lt;/span> &lt;span class="n">t1&lt;/span> &lt;span class="n">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;bb&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">),(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">planner&lt;/span> &lt;span class="n">hook&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">distributed_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateDistributedPlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateModifyPlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RouterInsertJob&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">deferredPruning&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 返回 CustomScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">DVecExecutorStart&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">DVecExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BeginCustomScan&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="n">DVecBeginScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DVecBeginModifyScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RegenerateTaskListForInsert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BuildRoutesForInsert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FindShardInterval&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ActiveShardPlacementList&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RebuildQueryStrings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DeparseTaskQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AppendShardIdToName&lt;/span> &lt;span class="c1"># 生成改名后SQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">ExecutorRun_hook&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">DVecExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecCustomScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DVecExecScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AdaptiveExecutor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RunDistributedExecution&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartRemoteTransactionBegin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BeginTransactiionCommand&lt;/span> &lt;span class="c1"># 生成：BEGIN ISOLATION LEVEL READ COMMITTED;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AssignDistributedTransactionIdCommand&lt;/span> &lt;span class="c1"># 生成：SELECT assign_distributed_transaction_id(0,20,&amp;#39;...&amp;#39;);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span> &lt;span class="c1"># 一次发送2条事务SQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQsendQuery&lt;/span> &lt;span class="c1"># INTO t1_$shardid ..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CoordinatedRemoteTransactionsPrepare&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span> &lt;span class="c1"># 发送 REPARE TRANSACTION ..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span> &lt;span class="c1"># 发送 COMMIT PREPARED ..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shard 1 (dn1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BEGIN&lt;/span> &lt;span class="n">ISOLATION&lt;/span> &lt;span class="n">LEVEL&lt;/span> &lt;span class="n">READ&lt;/span> &lt;span class="n">COMMITTED&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">assign_distributed_transaction_id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;...&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">INSERT&lt;/span> &lt;span class="n">INTO&lt;/span> &lt;span class="n">public&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">t1_12042&lt;/span> &lt;span class="n">AS&lt;/span> &lt;span class="n">dvec_table_alias&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">VALUES&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">REPARE&lt;/span> &lt;span class="n">TRANSACTION&lt;/span> &lt;span class="s1">&amp;#39;dvecx_...&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">COMMIT&lt;/span> &lt;span class="n">PREPARED&lt;/span> &lt;span class="s1">&amp;#39;dvecx_...&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 执行分布式事务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">INSERT&lt;/span> &lt;span class="n">INTO&lt;/span> &lt;span class="n">public&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">t1_12042&lt;/span> &lt;span class="n">AS&lt;/span> &lt;span class="n">dvec_table_alias&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">VALUES&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;aa&amp;#39;&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shard 2 (dn2)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">INSERT&lt;/span> &lt;span class="n">INTO&lt;/span> &lt;span class="n">public&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">t1_12043&lt;/span> &lt;span class="n">AS&lt;/span> &lt;span class="n">dvec_table_alias&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">VALUES&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;dd&amp;#39;&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shared 3 (d1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; 一共8个分片，其中4个分片，各收到1条INSERT语句&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 多行在同一分片，INSERT语句合并&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SELECT&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">FROM&lt;/span> &lt;span class="n">t1&lt;/span> &lt;span class="n">WHERE&lt;/span> &lt;span class="n">c1&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">planner&lt;/span> &lt;span class="n">hook&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">distributed_planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreateDistributedPlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GetRouterPlanType&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="n">一造&lt;/span> &lt;span class="n">multi&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">shard&lt;/span> &lt;span class="n">fan&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">非&lt;/span> &lt;span class="n">router&lt;/span> &lt;span class="n">计划&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MultiLogicalPlanCreate&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">logical&lt;/span> &lt;span class="n">planner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">建逻辑计划&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CreatePhysicalDistributedPlan&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">physical&lt;/span> &lt;span class="n">planner&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">├─&lt;/span> &lt;span class="n">为命中的每个分片建一个&lt;/span> &lt;span class="n">Task&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">本表&lt;/span> &lt;span class="mi">8&lt;/span> &lt;span class="n">个分片&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="mi">8&lt;/span> &lt;span class="n">个&lt;/span> &lt;span class="n">Task&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UpdateTaskQueryString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DeparseTaskQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">deparse_shard_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AppendShardIdToName&lt;/span> &lt;span class="c1"># t1 → t1_&amp;lt;shardId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># SELECT * + c1,c2 ; WHERE c1&amp;gt;10 → (c1 OPERATOR(pg_catalog.&amp;gt;) 10)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 包成 CustomScan 返回&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">DVecExecutorStart&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">DVecExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BeginCustomScan&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="n">DVecBeginScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">ExecutorRun_hook&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="n">DVecExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecCustomScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DVecExecScan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AdaptiveExecutor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RunDistributedExecution&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AssignTasksToConnectionsOrWorkerPool&lt;/span> &lt;span class="c1"># 8 个 Task 分给 DN1/DN2 的连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ConnectionStateMachine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartRemoteTransactionBegin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">发送&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">BEGIN&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">assign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">每条&lt;/span> &lt;span class="n">DN&lt;/span> &lt;span class="n">连接首次用&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">只发一次&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BeginTransactionCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 生成: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AssignDistributedTransactionIdCommand&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 生成: SELECT assign_distributed_transaction_id(...)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="n">PQsendQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">两条合并成一条发出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送: SELECT c1,c2 FROM t1_&amp;lt;shardId&amp;gt; WHERE (c1&amp;gt;10)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># DN1 上 4 条 (12042/12044/12046/12048), DN2 上 4 条&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="n">COMMIT&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RemoteTransactionCommit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SendRemoteCommand&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="n">PQsendQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 只读 → 普通 COMMIT(无 PREPARE/COMMIT PREPARED,无 2PC)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># COMMIT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --&amp;gt; shard 1 (dn1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SELECT&lt;/span> &lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c2&lt;/span> &lt;span class="n">FROM&lt;/span> &lt;span class="n">public&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">t1_12042&lt;/span> &lt;span class="n">t1&lt;/span> &lt;span class="n">WHERE&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">c2&lt;/span> &lt;span class="n">OPERATOR&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pg_catalog&lt;/span>&lt;span class="o">.&amp;gt;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SELECT&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">FROM&lt;/span> &lt;span class="n">t1&lt;/span> &lt;span class="n">WHERE&lt;/span> &lt;span class="n">c2&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="err">密态：&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">cn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(..)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">dn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1_$shardid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1_$shardid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(..)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">values的值不变&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1_$shardid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">#&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">WHERE子句不变&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>专利 全密态 索引</title><link>https://my-blog.j8465383071.workers.dev/posts/compliance/patent-encrypted-index/</link><pubDate>Wed, 15 Jul 2026 19:25:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/compliance/patent-encrypted-index/</guid><description>&lt;h1 id="1-专利名称">1 专利名称&lt;/h1>
&lt;p>一种基于可信执行环境的数据库密态索引访问方法、系统及介质&lt;/p>
&lt;h1 id="2-技术背景">2 技术背景&lt;/h1>
&lt;ul>
&lt;li>全密态数据库：一种由数据库提供的安全特性，指数据库在处理数据的过程中，确保数据在传输、计算、存储等全生命周期阶段，于任何不可信的介质或环境中，始终处于加密状态。&lt;/li>
&lt;li>全密态数据库实现方案：目前，业界较成熟的方案，是基于可信执行环境，实现全密态数据库，该方案主要分为2个模块：1)驱动加密：应用向数据库发送SQL语句时，应用侧的数据驱动自动加密SQL语句中的数据，数据库接收与处理数据密文。2)机密计算：数据库无法再密文上进行计算，将密文发送至可信执行环境（TEE）中，由可信模块完成解密与计算。&lt;/li>
&lt;li>数据库索引结构：数据库中，最常见的索引为b+树索引。以tpcc测试模型为例，数据量低于100亿条时，b+树一般不超过4层。每一层的节点，即索引节点，是固定大小的page，分root index-page，internal index-page，leaf index-page。1个index-page中，存储多个index-item。其中，root和internal index-page中的index-item，存储数据和下一层index-page的位置。leaf index-page中的index-item，存储数据和table-page的位置。&lt;/li>
&lt;li>加密性能：在加解密数据时，影响加密性能的因素中，加密次数的影响远高于数据长度。例如，1次加密8k数据，比40次加密200字节数据的性能高10+倍。&lt;/li>
&lt;li>密态索引：在全密态数据库中，数据库只存储数据密文，在等值、范围查询等场景，为提高查询效率，避免全表扫描，需要在密文上构造索引。因此，需要见密文传输至可行执行环境TEE中，在TEE中临时解密数据，比较数据大小，构造索引。&lt;/li>
&lt;li>现有方案缺陷：在构造密态索引时，现有方案存在以下缺陷：1)交互开销高：以索引元组为粒度，与TEE交互，交互次数多，交互开销高。2)加解密开销高：在索引页内比较元组大小时，需要多次解密索引元组。对于顶层的索引页，访问评率高，加解密频率也较高。3)内核修改多：为适配TEE，对索引构造、索引查询、并发控制等修改多，破坏生态兼容性等。&lt;/li>
&lt;/ul>
&lt;h1 id="3-发明内容">3 发明内容&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>发明目的&lt;/strong>：本发明针对在密文数据上构造索引、扫描索引的场景，提供一种通用的、高性能、低改造的方案，基于可信执行环境，大幅降低交互开销、加解密开销，并且，充分复用索引分裂、并发访问的机制，对内核侵入修改度低。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>技术方案&lt;/strong>：&lt;br>
本发明的关键创新如下：&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>构造索引：应用插入数据时，驱动以字段为粒度，加密数据。数据库接收数据密文，TEE解密数据，构造索引，并以索引页为粒度，重新加密数据。&lt;/li>
&lt;li>访问索引：结合索引的访问特点，每个index-item不独立加密与解密，每次以index-page为粒度加密与解密，降低加解密次数。&lt;/li>
&lt;li>发送索引：数据库向TEE发生索引时，每次以index-page为粒度发送，降低交互次数。&lt;/li>
&lt;li>缓存索引：在TEE中，针对索引中root和internal page访问频率高、修改频率低的特点，缓存解密后的page，降低解密次数、与TEE的交互次数。&lt;/li>
&lt;li>内核改造：数据库中，访问索引时，只在需要比较大小时，才与TEE交互，保留已有索引分裂、并发访问机制。&lt;/li>
&lt;/ol>
&lt;p>以tpcc模型为例，当warhouse为10000时：&lt;/p>
&lt;ul>
&lt;li>基表：bmsql_customer表中，数据行数为3亿，表大小约250G&lt;/li>
&lt;li>索引：bmsql_customer主键索引中，index-item数为3亿，索引文件大小约9.5G，索引层数为4层，每层page数量分别：1、17、4400、114万，每个page中page-item数量约260个。插入1条数据，index-page平均分裂次数为0.0034次。&lt;/li>
&lt;/ul>
&lt;p>在该场景中，使用本发明的方案，考虑index-page分裂、TEE缓存偶尔未命中等所有可能产生额外交互、加密、解密的情况下：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>场景&lt;/th>
&lt;th>与TEE交互次数&lt;/th>
&lt;th>加密次数（TEE内）&lt;/th>
&lt;th>解密次数（TEE内）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>插入1条数据&lt;/td>
&lt;td>&amp;lt; 2.01&lt;/td>
&lt;td>&amp;lt; 1.01&lt;/td>
&lt;td>&amp;lt; 1.01&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查询1条数据&lt;/td>
&lt;td>&amp;lt; 2.01&lt;/td>
&lt;td>0&lt;/td>
&lt;td>&amp;lt; 1.01&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>删除1条数据&lt;/td>
&lt;td>&amp;lt; 2.01&lt;/td>
&lt;td>&amp;lt; 1.01&lt;/td>
&lt;td>&amp;lt; 1.01&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h1 id="4-附图及附图的简单说明">4 附图及附图的简单说明&lt;/h1>
&lt;h2 id="41-密态索引结构">4.1 密态索引结构&lt;/h2>
&lt;p>密态索引中，所有index-page中，只存储数据密文。在TEE中，以page为粒度加密，PageHeader、PageTail中，不存储用户数据，无需加密。&lt;br>
此处，以一个简单的3层索引为例，展示明文索引、密态索引的区别：&lt;/p>
&lt;p>&lt;img alt="idx-diff" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Compliance/patent-encrypted-index/idx-diff.png">&lt;/p>
&lt;h2 id="42-密态索引插入流程">4.2 密态索引插入流程&lt;/h2>
&lt;p>在图1的示例中，向索引中插入1条数据，流程如下：&lt;/p>
&lt;p>&lt;img alt="idx-ins" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Compliance/patent-encrypted-index/idx-ins.png">&lt;/p>
&lt;p>上述流程中，步骤12至20可通过缓存优化。以tpcc为例，index-item为3亿时，索引层数为4，索引文件大小约9.5G，root page数为1，internal page数为17+4000，缓存大小为31.38MB。&lt;/p>
&lt;h1 id="5-具体实施方式">5 具体实施方式&lt;/h1>
&lt;h2 id="51-创建密态索引">5.1 创建密态索引&lt;/h2>
&lt;ol>
&lt;li>管理员：创建密钥 CREATE DATA KEY dk1(..);&lt;/li>
&lt;li>数据库驱动：通过密钥服务或密码机生成密钥，缓存密钥，向数据库发送密钥信息&lt;/li>
&lt;li>数据库：在系统表中，存储密钥信息，包括：密钥名、密钥Oid等。&lt;/li>
&lt;li>管理员：创建加密表和索引：CREATE TABLE t1(c1 INT ENCRYPTED BY dk1, c2 TEXT)，CREATE INDEX i1 ON t1(c1);&lt;/li>
&lt;li>数据库：存储加密信息，包括：表名、列名、密钥名等。&lt;/li>
&lt;/ol>
&lt;h2 id="52-向索引插入1条数据">5.2 向索引插入1条数据&lt;/h2>
&lt;ol>
&lt;li>前置条件：已创建密态索引&lt;/li>
&lt;li>应用：连接数据库&lt;/li>
&lt;li>数据驱动：连接数据库，查询加密信息、密钥信息，并缓存&lt;/li>
&lt;li>数据库驱动：从密钥服务或密码机获取密钥，与可信执行环境建立安全通道，并传输密钥&lt;/li>
&lt;li>可信执行环境：缓存密钥&lt;/li>
&lt;li>应用：向数据库存储数据：INSERT INTO t1 VALUES (13, ‘data1’);&lt;/li>
&lt;li>数据库驱动：对SQL进行语法解析，识别加密列字段，并加密字段，并改写SQL：INSERT INTO t1 VALUESS (cipher[13], ‘data1’);&lt;/li>
&lt;li>数据库：向基表t1插入数据(cipher[13], ‘data1’)，准备构造索引&lt;/li>
&lt;li>数据库：向TEE中，发送密文 cipher[13]&lt;/li>
&lt;li>可信执行环境：解密cipher[13]，获取明文(13)&lt;/li>
&lt;li>可信执行环境：查找缓存的root page，如果未找到，请求数据库发送root page，解密并缓存root page&lt;/li>
&lt;li>可信执行环境：在root page中，二分查找，获取internal page位置&lt;/li>
&lt;li>可信执行环境：查找缓存的internal page，如果未找到，请求数据库发送internal page，解密并缓存internal page&lt;/li>
&lt;li>可信执行环境：在internal page中，二分查找，获取leaf page位置&lt;/li>
&lt;li>可信执行环境：请求数据库发送leaf page。解密leaf page&lt;/li>
&lt;li>可信执行环境：如果leaf page已满，触发分裂流程，此处不展开说明&lt;/li>
&lt;li>可信执行环境：在leaf pag中，二分查找，获取插入位置&lt;/li>
&lt;li>可信执行环境：在leaf page中，插入数据(13, 基表t1中13的存储位置)&lt;/li>
&lt;li>可信执行环境：加密leaf page，向数据库返回加密后的leaf page&lt;/li>
&lt;li>数据库：重新存储加密后的leaf page&lt;/li>
&lt;/ol>
&lt;h2 id="53-从索引中查找1条数据">5.3 从索引中查找1条数据&lt;/h2>
&lt;p>查询流程，与插入流程大部分一致：&lt;/p></description></item><item><title>国测 安全架构</title><link>https://my-blog.j8465383071.workers.dev/posts/compliance/security-architecture/</link><pubDate>Mon, 06 Jul 2026 16:40:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/compliance/security-architecture/</guid><description>&lt;h1 id="4-安全架构">4 安全架构&lt;/h1>
&lt;h2 id="41-威胁模型">4.1 威胁模型&lt;/h2>
&lt;p>数据库运行在复杂的环境中，在计算、传输、存储数据等阶段，攻击者可利用硬件、软件等漏洞，威胁数据库安全。本文以数据库为核心，缩短攻击链路，排除攻击者身份演变、攻击阶段演进等因素，构造简化的威胁模型：&lt;/p>
&lt;ul>
&lt;li>一、角色
&lt;ol>
&lt;li>黑客&lt;/li>
&lt;li>内部运维人员&lt;/li>
&lt;li>内部研发人员&lt;/li>
&lt;li>系统维护人员&lt;/li>
&lt;li>供应链&lt;/li>
&lt;li>网络中间人&lt;/li>
&lt;li>机房管理人员&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>二、动机
&lt;ol>
&lt;li>售卖获利&lt;/li>
&lt;li>勒索获利&lt;/li>
&lt;li>情报窃取&lt;/li>
&lt;li>蓄意报复&lt;/li>
&lt;li>规避审计&lt;/li>
&lt;li>炫耀技能&lt;/li>
&lt;li>人为过失&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>三、目标
&lt;ol>
&lt;li>鉴别数据&lt;/li>
&lt;li>用户表&lt;/li>
&lt;li>系统表&lt;/li>
&lt;li>事务日志&lt;/li>
&lt;li>审计日志&lt;/li>
&lt;li>内存数据&lt;/li>
&lt;li>配置文件&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>四、技术
&lt;ol>
&lt;li>不可信IP登录&lt;/li>
&lt;li>默认账户攻击&lt;/li>
&lt;li>过期账号攻击&lt;/li>
&lt;li>弱口令攻击&lt;/li>
&lt;li>密码泄露&lt;/li>
&lt;li>暴力破解&lt;/li>
&lt;li>凭证重放&lt;/li>
&lt;li>内存凭证残留&lt;/li>
&lt;li>流量伪造&lt;/li>
&lt;li>流量重放&lt;/li>
&lt;li>证书伪造&lt;/li>
&lt;li>未授权访问&lt;/li>
&lt;li>越权访问&lt;/li>
&lt;li>权限提升&lt;/li>
&lt;li>权限滥用&lt;/li>
&lt;li>磁盘窃取&lt;/li>
&lt;li>恶意软件&lt;/li>
&lt;li>操作系统隔离失效&lt;/li>
&lt;li>数据文件篡改&lt;/li>
&lt;li>供应链后门&lt;/li>
&lt;li>侧信道内存嗅探&lt;/li>
&lt;li>调试工具滥用&lt;/li>
&lt;li>特权用户窥探&lt;/li>
&lt;li>审计日志伪造&lt;/li>
&lt;li>攻击行为隐匿&lt;/li>
&lt;li>恶意操作抵赖&lt;/li>
&lt;li>合规审计证据缺失&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>五、分类
&lt;ol>
&lt;li>欺骗&lt;/li>
&lt;li>篡改&lt;/li>
&lt;li>否认&lt;/li>
&lt;li>信息泄露&lt;/li>
&lt;li>拒绝服务&lt;/li>
&lt;li>权限提升&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h2 id="42-防御模型">4.2 防御模型&lt;/h2>
&lt;p>针对威胁模型，本文从接入、传输、访问、存储、计算、合规6个维度，提供以下安全功能，构建防御模型：&lt;/p>
&lt;ol>
&lt;li>接入安全：合法用户，才能接入数据库
&lt;ul>
&lt;li>网络防火墙&lt;/li>
&lt;li>身份认证&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>传输安全：与数据库的通信数据，
&lt;ul>
&lt;li>安全传输&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>访问安全
&lt;ul>
&lt;li>访问控制&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>计算安全
&lt;ul>
&lt;li>驱动加密&lt;/li>
&lt;li>机密计算&lt;/li>
&lt;li>密码函数&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>存储安全
&lt;ul>
&lt;li>透明加密&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>合法合规
&lt;ul>
&lt;li>安全审计&lt;/li>
&lt;li>动态脱敏&lt;/li>
&lt;li>密钥管理&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>防御模型如下图所示：&lt;/p></description></item><item><title>ai</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/ai/</link><pubDate>Fri, 03 Jul 2026 17:45:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/ai/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 角色&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">你是一名 PostgreSQL &lt;span class="m">16&lt;/span> 内核开发工程师，精通 src/backend/access/transam 及相关模块源码。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 约束&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. 所有回答必须严格基于 PostgreSQL &lt;span class="m">16&lt;/span> Release 源码。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. 解释机制时，必须引用具体的 .c/.h 文件路径和关键函数名。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. 涉及数据结构时，请给出 struct 定义所在的头文件及字段含义。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. 禁止使用“可能”、“通常”等模糊词汇描述内核行为；若不确定或版本不符，请明确告知。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. 代码片段必须标注来源文件及大致行号范围（或函数上下文）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 当前任务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 请梳理 XactBegin&lt;span class="o">()&lt;/span> 到 XactCommit&lt;span class="o">()&lt;/span> 的核心调用链，重点说明 CriticalSection 的作用。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 解释 PG16 中 clog &lt;span class="o">(&lt;/span>pg_xact&lt;span class="o">)&lt;/span> 的写入与刷盘时机，结合 TransactionIdSetPageStatus 函数分析。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- MVCC 快照获取逻辑在 GetSnapshotData 中是如何与活跃事务列表交互的？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 两阶段提交 &lt;span class="o">(&lt;/span>2PC&lt;span class="o">)&lt;/span> 在 PG16 中的状态持久化流程是什么？涉及哪些 WAL record 类型？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 输出格式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. 核心流程图/调用链（文字描述即可）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. 关键源码位置（文件:函数）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. 设计意图与权衡（Why it is implemented this way）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. 相关 GUC 参数及其对代码路径的影响
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>工具 pg_xlogdump</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/pg-xlogdump/</link><pubDate>Wed, 10 Jun 2026 18:58:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/pg-xlogdump/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 单文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_xlogdump &lt;span class="m">000000010000000000000001&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 多文件，指定lsn开始&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_xlogdump -s 0/1000020 &lt;span class="m">000000010000000000000001&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 多文件，整个目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_xlogdump -p /opt/openGauss/data/pg_xlog
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SELECT pg_current_wal_lsn&lt;span class="o">()&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">\!&lt;/span> pg_xlogdump -p &lt;span class="nv">$GAUSSHOME&lt;/span>/data/pg_xlog -s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">num&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1640180680&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;%X/%X\n&amp;#34;&lt;/span> &lt;span class="k">$((&lt;/span>num &amp;gt;&amp;gt; &lt;span class="m">32&lt;/span>&lt;span class="k">))&lt;/span> &lt;span class="k">$((&lt;/span>num &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="m">0&lt;/span>xFFFFFFFF&lt;span class="k">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例： 0/61c32bc8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_xlogdump -s 0/61c32bc8 -x &lt;span class="m">131128&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;%x\n&amp;#34;&lt;/span> &lt;span class="m">1640180680&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例： 61c32bc8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_xlogdump -s &lt;span class="m">000000010000000100000061&lt;/span> -x &lt;span class="m">131128&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>工具 硬件资源</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/hardware-resource/</link><pubDate>Fri, 29 May 2026 16:57:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/hardware-resource/</guid><description>&lt;h1 id="1-磁盘">1 磁盘&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 各文件夹大小&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">du -sh ./* &lt;span class="p">|&lt;/span> sort -hr
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>强制访问控制</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/mandatory-access-control/</link><pubDate>Mon, 16 Mar 2026 14:28:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/mandatory-access-control/</guid><description>&lt;h1 id="1-背景">1 背景&lt;/h1>
&lt;h2 id="11-友商分析">1.1 友商分析&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>oracle&lt;/p>
&lt;ul>
&lt;li>范围：行级、列级&lt;/li>
&lt;li>实现：动态谓词过滤&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>金仓&lt;/p>
&lt;ul>
&lt;li>范围：列级&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>mysql&lt;/p>
&lt;ul>
&lt;li>无&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>sql server&lt;/p>
&lt;ul>
&lt;li>范围：行级&lt;/li>
&lt;li>实现：谓词过滤&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>oracle&lt;/p>
&lt;ul>
&lt;li>基于标签的访问控制OLS：绝密HS、机密S、秘密C、公开P
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA">https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 定义策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_SYSDBA&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_POLICY&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;HR_POLICY&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">column_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;HR_LABEL&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 定义标签
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;HR_POLICY&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;PUBLIC&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;P&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 设置标签属性
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_USER_ADMIN&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SET_LEVELS&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;HR_POLICY&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;SCOTT&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;S&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_USER_ADMIN&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SET_COMPARTMENTS&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;HR_POLICY&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;SCOTT&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;FIN&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 插入数据（主动定义标签）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">employees&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">emp_id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">emp_name&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">salary&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">HR_LABEL&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1001&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;John Doe&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">50000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CHAR_TO_LABEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;HR_POLICY&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;C:FIN&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>sql server：无&lt;/p>
&lt;/li>
&lt;li>
&lt;p>kngbase&lt;/p>
&lt;ul>
&lt;li>
&lt;p>行级&lt;/p>
&lt;/li>
&lt;li>
&lt;p>链接：&lt;a href="https://help.kingbase.com.cn/v8/safety/safety-guide/label-and-mac.html#id5">https://help.kingbase.com.cn/v8/safety/safety-guide/label-and-mac.html#id5&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>范围：table, view, index, procedure, function, package, sequence, trigger, synonym&lt;/p></description></item><item><title>claude</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/claude/</link><pubDate>Fri, 06 Mar 2026 17:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/claude/</guid><description>&lt;h1 id="安装">安装&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://unofficial-builds.nodejs.org/download/release/v20.18.1/node-v20.18.1-linux-x64-glibc-217.tar.xz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -Jxvf node-v20.18.1-linux-x64-glibc-217.tar.xz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv node-v20.18.1-linux-x64-glibc-217 node-20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch envn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export NODEHOME=`pwd`/node-20
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PATH=$NODEHOME/bin:$PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export LD_LIBRARY_PATH=$NODEHOME/lib:$LD_LIBRARY_PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt; envn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> envn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir npm-global
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config &lt;span class="nb">set&lt;/span> prefix &lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/npm-global
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config &lt;span class="nb">set&lt;/span> prefix &lt;span class="nv">$NODEHOME&lt;/span>/npm-global
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PATH=$NODEHOME/../npm-global/bin:$PATH&amp;#39;&lt;/span> &amp;gt;&amp;gt; envn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> envn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm pack @anthropic-ai/claude-code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install -g ./anthropic-ai-claude-code-2.1.162.tgz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://www.tapd.cn/43100420/markdown_wikis/show/#1143100420001007544
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>https://api.deepseek.com/anthropic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_AUTH_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;sk-e435fe4629934fc892c226fc26d7ac92&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_SUBAGENT_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_EFFORT_LEVEL&lt;/span>&lt;span class="o">=&lt;/span>max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 内网&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>http://172.16.99.137:8081
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_AUTH_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_SUBAGENT_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_EFFORT_LEVEL&lt;/span>&lt;span class="o">=&lt;/span>max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 内网 glm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>http://172.16.99.137:8081
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_AUTH_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_SUBAGENT_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_EFFORT_LEVEL&lt;/span>&lt;span class="o">=&lt;/span>max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 外网： http://172.16.105.104:3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_BASE_URL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.deepseek.com/anthropic&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_AUTH_TOKEN &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sk-e435fe4629934fc892c226fc26d7ac92&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_OPUS_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_SONNET_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_HAIKU_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_SUBAGENT_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_EFFORT_LEVEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;max&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 外网 海量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_BASE_URL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://172.16.105.104:3000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_AUTH_TOKEN &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_OPUS_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_SONNET_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;glm-5.2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_HAIKU_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;glm-5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_SUBAGENT_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;glm-5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_EFFORT_LEVEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;max&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>http://172.16.105.104:3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_AUTH_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_SUBAGENT_MODEL&lt;/span>&lt;span class="o">=&lt;/span>glm-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_EFFORT_LEVEL&lt;/span>&lt;span class="o">=&lt;/span>max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 外网 海量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_BASE_URL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://172.16.105.104:3000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_AUTH_TOKEN &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_OPUS_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_SONNET_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:ANTHROPIC_DEFAULT_HAIKU_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_SUBAGENT_MODEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$env&lt;/span>:CLAUDE_CODE_EFFORT_LEVEL &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;max&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>http://172.16.105.104:3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_AUTH_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-pro&lt;span class="o">[&lt;/span>1m&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_SUBAGENT_MODEL&lt;/span>&lt;span class="o">=&lt;/span>deepseek-v4-flash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CLAUDE_CODE_EFFORT_LEVEL&lt;/span>&lt;span class="o">=&lt;/span>max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_BASE_URL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;https://api.deepseek.com/anthropic&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_AUTH_TOKEN&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;sk-e435fe4629934fc892c226fc26d7ac92&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_MODEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;deepseek-v4-pro[1m]&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_OPUS_MODEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;deepseek-v4-pro[1m]&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_SONNET_MODEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;deepseek-v4-pro[1m]&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_DEFAULT_HAIKU_MODEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;CLAUDE_CODE_SUBAGENT_MODEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>System.Environment&lt;span class="o">]&lt;/span>::SetEnvironmentVariable&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;CLAUDE_CODE_EFFORT_LEVEL&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;max&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装nodejs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install -y nodejs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ~/.npm-global
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config &lt;span class="nb">set&lt;/span> prefix &lt;span class="s1">&amp;#39;~/.npm-global&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PATH=~/.npm-global/bin:$PATH&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装claude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install -g @anthropic-ai/claude-code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /data/postgresql17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. 启动 Claude Code 并进行首次认证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行后，终端会提供一个链接，在浏览器中完成账号授权即可&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 6. (可选但推荐) 生成项目记忆文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在 Claude 交互界面中，输入以下命令，它会分析项目并生成 CLAUDE.md 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># linux 使用代理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -L https://github.com/MetaCubeX/mihomo/releases/latest/download/mihomo-linux-amd64-compatible.gz &lt;span class="p">|&lt;/span> gunzip &amp;gt; /usr/local/bin/mihomo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x /usr/local/bin/mihomo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p /etc/clash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -o /etc/clash/config.yaml http://43.135.139.219:9999/clash.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 启动 Clash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nohup mihomo -f /etc/clash/config.yaml &amp;gt; /var/log/clash.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 设置代理环境变量（Clash 默认 mixed-port 7890）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7890
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">https_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7890
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. 测试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -I https://www.google.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.name &lt;span class="s2">&amp;#34;shenkun&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.email &lt;span class="s2">&amp;#34;shenkun@bupt.cn&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -t rsa -C &lt;span class="s2">&amp;#34;shenkun@bupt.cn&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ~/.ssh/id_rsa
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install proxychains-ng -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;socks5 10.255.255.254 1080&amp;#34;&lt;/span> &amp;gt;&amp;gt; /etc/proxychains.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># windows11 安装clash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://github.com/clash-verge-rev/clash-verge-rev/releases
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install -y shadowsocks-libev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &amp;gt; /etc/shadowsocks-libev/client.json &lt;span class="s">&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;server&amp;#34;: &amp;#34;43.135.139.219&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;server_port&amp;#34;: 443,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;local_address&amp;#34;: &amp;#34;127.0.0.1&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;local_port&amp;#34;: 1080,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;password&amp;#34;: &amp;#34;gauss@123&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&amp;#34;method&amp;#34;: &amp;#34;aes-256-gcm&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ss-local -c /etc/shadowsocks-libev/client.json -f /var/run/ss-local.pid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">https_proxy&lt;/span>&lt;span class="o">=&lt;/span>socks5://127.0.0.1:1080
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># githup&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="使用">使用&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --resume &lt;span class="c1"># 恢复最近一次对话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --continue &lt;span class="c1"># 继续上一次对话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --model &amp;lt;name&amp;gt; &lt;span class="c1"># 指定模型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions &lt;span class="c1"># 跳过所有权限确认&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/clear &lt;span class="c1"># 清楚所有对话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/compact &lt;span class="c1"># 压缩上下文，保留摘要&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/rewind &lt;span class="c1"># 回滚上一次对话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/memory &lt;span class="c1"># 编辑记忆文件，记住偏好&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/resume &lt;span class="c1"># 恢复历史会话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/context &lt;span class="c1"># 显示上下文窗口使用量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/init 初始化项目，生成CLAUDE.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/review &lt;span class="c1"># 代码审查&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/commit &lt;span class="c1"># 提交&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/config &lt;span class="c1"># 调整主题、模型等&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/model &lt;span class="o">[&lt;/span>name&lt;span class="o">]&lt;/span> &lt;span class="c1"># 切换模型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/permissions &lt;span class="c1"># 工具权限白名单&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/doctor &lt;span class="c1"># 检查环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/mcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/cost &lt;span class="c1"># token用量和费用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 扩展&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/skill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/自定义skill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 快捷键&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 快捷键 &lt;span class="p">|&lt;/span> 功能 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> :--- &lt;span class="p">|&lt;/span> :--- &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>Shift + Tab&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 循环切换三种模式：计划模式 → 默认模式 → 自动编辑模式 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>!command&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 直接在终端执行 bash 命令（不发给 AI） &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>Ctrl + B&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 将阻塞的进程放到后台，继续对话 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>Esc Esc&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 双击 Esc 等同于 &lt;span class="sb">`&lt;/span>/rewind&lt;span class="sb">`&lt;/span> 回滚 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>Ctrl + V&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 粘贴图片到对话框 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>Option/Ctrl + Enter&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> 输入框换行（Enter 是直接发送） &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">模型名称&lt;/th>
&lt;th style="text-align: left">厂商&lt;/th>
&lt;th style="text-align: left">发布时间&lt;/th>
&lt;th style="text-align: left">核心亮点（精简）&lt;/th>
&lt;th style="text-align: left">定位/优势场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">GPT-5.6 (Sol/Terra/Luna)&lt;/td>
&lt;td style="text-align: left">OpenAI&lt;/td>
&lt;td style="text-align: left">2026.07.09&lt;/td>
&lt;td style="text-align: left">7月9日刚全球开放；三档分层+速度拨盘；Codex与ChatGPT合一&lt;/td>
&lt;td style="text-align: left">全能旗舰、超级智能体&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">GPT-5.5&lt;/td>
&lt;td style="text-align: left">OpenAI&lt;/td>
&lt;td style="text-align: left">2026.04.24&lt;/td>
&lt;td style="text-align: left">首个从零重训基础模型；100万tokens；MoE+Verifier架构&lt;/td>
&lt;td style="text-align: left">真实工作流、编程调试&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">DeepSeek-V4 (Pro/Flash)&lt;/td>
&lt;td style="text-align: left">深度求索&lt;/td>
&lt;td style="text-align: left">2026.04.24&lt;/td>
&lt;td style="text-align: left">万亿参数MoE开源；百万token原生上下文；成本仅OpenAI 1/100&lt;/td>
&lt;td style="text-align: left">开源性价比之王、Agent&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Qwen3.7-Max&lt;/td>
&lt;td style="text-align: left">阿里巴巴&lt;/td>
&lt;td style="text-align: left">2026.05.20&lt;/td>
&lt;td style="text-align: left">国产Arena盲测第一；全域思考模式；Agentic Coding全球前三&lt;/td>
&lt;td style="text-align: left">国产旗舰、智能体编程&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Claude Opus 4.7/4.8&lt;/td>
&lt;td style="text-align: left">Anthropic&lt;/td>
&lt;td style="text-align: left">2026 Q2&lt;/td>
&lt;td style="text-align: left">代码质量最优；长文本推理首选；WebDev Arena排名第一&lt;/td>
&lt;td style="text-align: left">编程审校、深度推理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Gemini 3.5 Pro&lt;/td>
&lt;td style="text-align: left">Google&lt;/td>
&lt;td style="text-align: left">2026.06&lt;/td>
&lt;td style="text-align: left">Artificial Analysis智能指数登顶；集成计算机使用(CU)能力&lt;/td>
&lt;td style="text-align: left">复杂推理、多模态科研&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Grok 4 / 4.5&lt;/td>
&lt;td style="text-align: left">xAI&lt;/td>
&lt;td style="text-align: left">2026.05-07&lt;/td>
&lt;td style="text-align: left">实时接入X平台；编码与Agent能力持续强化；百亿~千亿参数&lt;/td>
&lt;td style="text-align: left">实时信息、社交分析&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Kimi-K2.6&lt;/td>
&lt;td style="text-align: left">月之暗面&lt;/td>
&lt;td style="text-align: left">2026 H1&lt;/td>
&lt;td style="text-align: left">长文本办公统治级；JSON输出稳定；指令遵循能力强&lt;/td>
&lt;td style="text-align: left">办公自动化、Agent&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">GLM-5.1&lt;/td>
&lt;td style="text-align: left">智谱AI&lt;/td>
&lt;td style="text-align: left">2026 Q2&lt;/td>
&lt;td style="text-align: left">国产第一梯队；编程能力进入Top7；综合能力稳居前列&lt;/td>
&lt;td style="text-align: left">通用对话、编程辅助&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">豆包 2.1 Pro&lt;/td>
&lt;td style="text-align: left">字节跳动&lt;/td>
&lt;td style="text-align: left">2026.06&lt;/td>
&lt;td style="text-align: left">中文口语最自然；移动端交互最佳；多模态细节强&lt;/td>
&lt;td style="text-align: left">C端用户、内容创作&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Meta Muse Spark 1.1&lt;/td>
&lt;td style="text-align: left">Meta&lt;/td>
&lt;td style="text-align: left">2026.07&lt;/td>
&lt;td style="text-align: left">首次开放Model API；正面争夺企业开发者市场&lt;/td>
&lt;td style="text-align: left">企业开发、开源生态&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Llama 4&lt;/td>
&lt;td style="text-align: left">Meta&lt;/td>
&lt;td style="text-align: left">2026(预计)&lt;/td>
&lt;td style="text-align: left">开源生态标杆；多模态原生；社区微调最丰富&lt;/td>
&lt;td style="text-align: left">开源基座、定制微调&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>高质量专项 全密态机密计算</title><link>https://my-blog.j8465383071.workers.dev/posts/security/confidential-computing/</link><pubDate>Mon, 19 Jan 2026 18:37:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/confidential-computing/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-%E6%9E%B6%E6%9E%84">1 架构&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84">1.1 整体架构&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E6%B5%81%E7%A8%8B">2 流程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E6%95%B4%E4%BD%93%E6%B5%81%E7%A8%8B">2.1 整体流程&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E8%AE%BE%E8%AE%A1">3 设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E9%A9%B1%E5%8A%A8%E5%8A%A0%E5%AF%86">3.1 驱动加密&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E6%9C%BA%E5%AF%86%E8%AE%A1%E7%AE%97">3.2 机密计算&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E6%8A%80%E6%9C%AF%E8%B0%83%E7%A0%94">一、技术调研&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E6%96%B9%E6%A1%88%E5%AF%B9%E6%AF%94">二、方案对比&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E6%8E%A5%E5%8F%A3">4 接口&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-%E5%AE%9E%E7%8E%B0">5 实现&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-架构">1 架构&lt;/h1>
&lt;h2 id="11-整体架构">1.1 整体架构&lt;/h2>
&lt;p>&lt;strong>全密态数据库&lt;/strong>是一种由数据库提供的安全特性，指数据库在处理数据的过程中，确保数据在传输、计算、存储等全生命周期阶段，于任何不可信的介质或环境中，始终处于加密状态。不可信环境包括：网络、内存、磁盘等。以常见的拓扑模型为例，在使用数据库的过程中，威胁面较广：&lt;/p>
&lt;p>&lt;img alt="risk" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/confidential-computing/risk.png">&lt;/p>
&lt;p>全密态数据库中，对于传输、存储安全，采用驱动加密方案。应用向数据库发送数据时，先在驱动中加密数据，再发送数据密文。应用从数据库接收数据时，先接收数据密文，再在驱动中解密数据。数据在网络、磁盘、服务端内存中，均处于加密状态。基本架构如下图所示：&lt;/p>
&lt;p>&lt;img alt="driver" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/confidential-computing/driver.png">&lt;/p>
&lt;p>全密态数据库中，对于计算安全，采用机密计算方案。驱动加密方案，解决传输、存储安全，但是，数据库端无法在密文上计算。为解决计算问题，业界有两种方案：&lt;/p>
&lt;ul>
&lt;li>基于密码学算法的密文计算方案：通过密码学算法，让数据库在直接在密文上进行计算，例如保序加密、可搜索加密、同态加密等&lt;/li>
&lt;li>基于硬件隔离的机密计算方案：在CPU、内存中，划分逻辑独立的可信执行环境，让数据库在可信执行环境中解密数据密文，进行计算。&lt;/li>
&lt;/ul>
&lt;p>在充分对比安全性、功能完备性、性能、实现难度等特点，选择机密计算方案。结合驱动加密方案、机密计算方案，全密态数据库整体架构如下图所示：&lt;/p>
&lt;p>&lt;img alt="all" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/confidential-computing/all.png">&lt;/p>
&lt;p>全密态数据库中，对于加密模型，采用多级密钥方案。数据由数据密钥加密，密钥由主密钥加密，主密钥由根密钥加密。在驱动加密模块中，只能获取数据密钥，无法获取主密钥。在更安全的加密方案中，驱动加密模块无法获取数据密钥，由硬件加密机加密。在数据库端，仅存储密钥信息，无法获取密钥。全密态数据库加密模型如下图所示：&lt;/p>
&lt;p>&lt;img alt="crypt" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/confidential-computing/crypt.png">&lt;/p>
&lt;h1 id="2-流程">2 流程&lt;/h1>
&lt;h2 id="21-整体流程">2.1 整体流程&lt;/h2>
&lt;p>使用全密态数据库时，用户需定义主密钥、数据密钥、加密表，在执行存储、查询数据时，全密态数据库自动完成加密、解密、计算等操作。完整的使用流程如图所示：&lt;/p>
&lt;p>&lt;img alt="flow" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/Security/confidential-computing/flow.png">&lt;/p>
&lt;h1 id="3-设计">3 设计&lt;/h1>
&lt;h2 id="31-驱动加密">3.1 驱动加密&lt;/h2>
&lt;h2 id="32-机密计算">3.2 机密计算&lt;/h2>
&lt;h3 id="一技术调研">一、技术调研&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>纯软路线&lt;/p>
&lt;ul>
&lt;li>同态加密&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>软硬路线&lt;/p>
&lt;ul>
&lt;li>x86
&lt;ul>
&lt;li>cpu
&lt;ul>
&lt;li>sgx：硬件&lt;/li>
&lt;li>tdx：硬件&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>固件
&lt;ul>
&lt;li>me：出厂自带&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>软件
&lt;ul>
&lt;li>sgx driver&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>amd
&lt;ul>
&lt;li>cpu
&lt;ul>
&lt;li>sev：Secure Encrypted Virtualization，CPU扩展电路，为每台虚拟机分配内存密钥，运行时加密整段内存。需BIOS开启。&lt;/li>
&lt;li>sev-snp/sev-es&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>固件
&lt;ul>
&lt;li>psp&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>软件
&lt;ul>
&lt;li>kvm sev&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>arm
&lt;ul>
&lt;li>cpu
&lt;ul>
&lt;li>trust-zone：每个核新增总线，&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>固件
&lt;ul>
&lt;li>arm trusted fimware&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>软件
&lt;ul>
&lt;li>op-tee&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>tee: &lt;a href="https://github.com/OP-TEE/build">https://github.com/OP-TEE/build&lt;/a>&lt;/p></description></item><item><title>工具 python</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/python/</link><pubDate>Mon, 29 Dec 2025 14:31:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/python/</guid><description>&lt;ol>
&lt;li>
&lt;p>查看python安装路径&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python -c &lt;span class="s2">&amp;#34;import sys, os; print(os.path.dirname(sys.executable))&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>python下载pgk&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol></description></item><item><title>操作系统 3 多进程与多线程</title><link>https://my-blog.j8465383071.workers.dev/posts/os/os-3-process-and-thread/</link><pubDate>Wed, 17 Dec 2025 16:08:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/os/os-3-process-and-thread/</guid><description>&lt;h1 id="1-数据传输">1 数据传输&lt;/h1>
&lt;h2 id="11-传输场景">1.1 传输场景&lt;/h2>
&lt;ul>
&lt;li>父子进程&lt;/li>
&lt;li>陌生进程&lt;/li>
&lt;/ul>
&lt;h2 id="12-传输接口">1.2 传输接口&lt;/h2>
&lt;h2 id="13-传输示例">1.3 传输示例&lt;/h2>
&lt;h1 id="2-并发控制">2 并发控制&lt;/h1>
&lt;h2 id="21-并发场景">2.1 并发场景&lt;/h2>
&lt;ul>
&lt;li>整型
&lt;ul>
&lt;li>多写&lt;/li>
&lt;li>一写多读&lt;/li>
&lt;li>多写一读&lt;/li>
&lt;li>多写多读&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>数据
&lt;ul>
&lt;li>多写&lt;/li>
&lt;li>多读&lt;/li>
&lt;li>一写多读&lt;/li>
&lt;li>多写一读&lt;/li>
&lt;li>多写多读&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="22-并发接口-glibc">2.2 并发接口 (glibc)&lt;/h2>
&lt;h3 id="一自选锁">一、自选锁&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;pthread.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">pthread_spinlock_t&lt;/span> &lt;span class="n">spin&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_spin_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">spin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PTHREAD_PROCESS_PRIVATE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_spin_lock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">spin&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_spin_unlock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">spin&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="二互斥锁">二、互斥锁&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;pthread.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">pthread_mutex_t&lt;/span> &lt;span class="n">lock&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">pthread_mutexattr_t&lt;/span> &lt;span class="n">attr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">thread_mutexattr_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_mutexattr_settype&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PTHREAD_MUTEX_NORMAL&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_mutex_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_mutex_lock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_mutex_unlock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">lock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="三读写锁">三、读写锁&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;pthread.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">pthread_mutex_t&lt;/span> &lt;span class="n">rdlock&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">pthread_mutexattr_t&lt;/span> &lt;span class="n">attr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlockattr_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlockattr_setpshared&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PTHREAD_PROCESS_SHARED&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlock_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">rdlock&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">attr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlock_rdlock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">rdlock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlock_wrlock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">rdlock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">pthread_rwlock_unlock&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">rdlock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="四信号量">四、信号量&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;semaphore.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">sem_t&lt;/span> &lt;span class="n">sem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">sem_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">sem&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">sem_wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">sem&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">sem_post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">sem&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="五原子写">五、原子写&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;pthread.h&amp;gt;/* C 11 */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">volatile&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">__atomic_store_n&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">__ATOMIC_SEQ_CST&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="n">cur&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">__atomic_load_n&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">__ATOMIC_SEQ_CST&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="23-并发代码">2.3 并发代码&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>整型数据&lt;/p></description></item><item><title>工具 gdb</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/gdb/</link><pubDate>Wed, 15 Oct 2025 16:41:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/gdb/</guid><description>&lt;ol>
&lt;li>
&lt;p>查看某个进程占用的内存&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ps -p &lt;span class="m">17286&lt;/span> --no-headers -o pid,comm,rss,%mem &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{printf &amp;#34;%-8s %-20s %8.2f MB %5s%%\n&amp;#34;, $1, $2, $3/1024, $4}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>gdb调试进程或coredump文件时，变量取值出现’optimized out’时，关闭编译优化&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 以编译PG为例：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">configure --enable-debug --disable-optimizations &lt;span class="nv">CFLAGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;-g -O0 -fno-inline -fno-omit-frame-pointer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>gdb启动调试阶段，自动执行命令&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">touch ~/.gdbinit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;handle SIGUSR2 nostop noprint&amp;#34;&lt;/span> &amp;gt;&amp;gt; ~/.gdbinit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>判断编译选项&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">readelf --debug-dump&lt;span class="o">=&lt;/span>info &lt;span class="sb">`&lt;/span>which bin_name&lt;span class="sb">`&lt;/span> &lt;span class="p">|&lt;/span> grep -E &lt;span class="s1">&amp;#39;DW_AT_producer.*O[0-9]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol></description></item><item><title>工具 git</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/git/</link><pubDate>Wed, 24 Sep 2025 16:35:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/git/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git log --author&lt;span class="o">=&lt;/span>shenkun --oneline
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>x86&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git status -uno &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{if (NR&amp;gt;1) print $3}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep src &lt;span class="p">|&lt;/span> xargs -I &lt;span class="o">{}&lt;/span> git add &lt;span class="o">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>arm&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git status -uno &lt;span class="p">|&lt;/span> grep modified &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{if (NR&amp;gt;1) print $2}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> xargs -I &lt;span class="o">{}&lt;/span> git add &lt;span class="o">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git tag -l
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git ls-remote --tags origin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git fetch --tags
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>工具 tcpdump</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/tcpdump/</link><pubDate>Thu, 04 Sep 2025 15:22:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/tcpdump/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tcpdump -i any -w ./vsql.pcap &lt;span class="s1">&amp;#39;tcp port 5432&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Vastbase SSL安全传输</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-ssl/</link><pubDate>Thu, 28 Aug 2025 09:47:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-ssl/</guid><description>&lt;h1 id="1-基于ssl证书实现身份认证">1 基于SSL证书实现身份认证&lt;/h1>
&lt;p>在应用与数据库传输数据时，为避免攻击者对数据进行窃听、篡改、伪造、重放等攻击，Vastbae支持采用SSL协议保障数据机密性与完整性。在SSL协议协商密钥的过程中，应用与数据库需通过证书验证对方身份，同时，该证书也可作为登入数据库的身份凭证。&lt;br>
此处介绍生成证书，并基于证书配置SSL协议，同时基于证书实现身份认证，操作流程可分为以下3个阶段：&lt;/p>
&lt;ul>
&lt;li>一、生成私钥与证书&lt;/li>
&lt;li>二、数据库端配置证书与私钥&lt;/li>
&lt;li>三、应用端配置证书与私钥&lt;/li>
&lt;/ul>
&lt;h2 id="一生成私钥与证书">一、生成私钥与证书&lt;/h2>
&lt;p>此处介绍基于openssl工具，生成自签名证书的流程&lt;/p>
&lt;ol>
&lt;li>
&lt;p>创建存放私钥与证书的文件夹&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir cadir
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadir
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;01&amp;#39;&lt;/span>&amp;gt;./demoCA/serial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch ./demoCA/index.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>配置openssl工具&lt;br>
从Vastbase安装包中，获取openssl工具以及openss配置文件。假设Vastbae安装包存放在$GAUSSHOME目录。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$GAUSSHOME&lt;/span>/bin/openssl ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>:&lt;span class="nv">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">which openssl &lt;span class="c1"># 确保openssl来源于Vastbase安装包，避免因版本不同造成证书不可用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$GAUSSHOME&lt;/span>/share/sslcert/gsql/openssl.cnf ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">OPENSSL_CONF&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/openssl.cnf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建CA私钥、CA证书&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out demoCA/private/cakey.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -config openssl.cnf -key demoCA/private/cakey.pem -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>VAST/OU&lt;span class="o">=&lt;/span>SEC/CN&lt;span class="o">=&lt;/span>CA -out cacert.req
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -selfsign -config openssl.cnf -batch -keyfile demoCA/private/cakey.pem -in cacert.req -out demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建数据库私钥、数据库证书&lt;/p></description></item><item><title>e100</title><link>https://my-blog.j8465383071.workers.dev/posts/database/e100/</link><pubDate>Tue, 29 Jul 2025 18:14:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/e100/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./configure --prefix&lt;span class="o">=&lt;/span>&lt;span class="nv">$PG_HOME&lt;/span> --enable_debug --with-openssl --enable-cassert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make -sj &lt;span class="m">6&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">pmake&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;make -sj 6 &amp;amp;&amp;amp; make install -sj&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">pinit&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;rm -rf $PG_HOME/data &amp;amp;&amp;amp; initdb -D $PG_HOME/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">pstart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;pg_ctl start -D $PG_HOME/data -l logfile&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">pstop&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;pg_ctl stop -D $PG_HOME/data -l logfile&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>pg_dump</title><link>https://my-blog.j8465383071.workers.dev/posts/database/dump/</link><pubDate>Tue, 29 Jul 2025 18:07:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/dump/</guid><description>&lt;h1 id="1-使用方式">1 使用方式&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">vsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">vastbase&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYSADMIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUPERUSER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u3.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rolsuper&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rolsystemadmin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_authid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vsql -d vastbase -c &lt;span class="s2">&amp;#34;SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 导出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_dumpall --roles-only -f ./u.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d vastbase -c &lt;span class="s2">&amp;#34; DROP USER IF EXISTS u1,u2,u3; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d vastbase -f ./u.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d vastbase -c &lt;span class="s2">&amp;#34;SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>libpq</title><link>https://my-blog.j8465383071.workers.dev/posts/database/libpq/</link><pubDate>Mon, 28 Jul 2025 10:38:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/libpq/</guid><description>&lt;h1 id="1-libpq编程">1 libpq编程&lt;/h1>
&lt;h2 id="11-配置数据库">1.1 配置数据库&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>安装数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 假设安装目录为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PG_HOME&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>启动数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 假设数据目录为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PG_HOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>配置数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;host all u1 0.0.0.0/0 md5&amp;#39;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;listen_addresses=&amp;#39;0.0.0.0&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$PG_HOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_ctl reload -D &lt;span class="nv">$PG_HOME&lt;/span>/data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建用户&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">psql -d postgres -c &lt;span class="s2">&amp;#34;create user u1 password &amp;#39;u1.password&amp;#39;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证一下&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h 127.0.0.1 -p &lt;span class="m">5432&lt;/span> -d postgres -U u1 -W &lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span> -c &lt;span class="s1">&amp;#39;\d&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="12-编写libpq-demo">1.2 编写libpq demo&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>生成源文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">touch pq.c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制 1.3 章节的源码 到 pq.c中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">LD_LIBRARY_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$PG_HOME&lt;/span>/lib:&lt;span class="nv">$LD_LIBRARH_PATH&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>编译&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gcc pq.c -o pq -I&lt;span class="nv">$PG_HOME&lt;/span>/include -L&lt;span class="nv">$PG_HOME&lt;/span>/lib -lpq
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>执行&lt;/p></description></item><item><title>海量 9 用例 E100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-testcase-e100-audit/</link><pubDate>Fri, 25 Jul 2025 15:33:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-testcase-e100-audit/</guid><description>&lt;h1 id="1-adt_scope_ddl">1 adt_scope_ddl&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">=============================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">Operate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> create
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> alter
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> drop
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> truncate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> prepare
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> dealocate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> abort
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> begin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> release savepoint
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> analyze
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> checkpoint
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> commit
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> commit prepared
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> end
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> rollback
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> rollback prepare
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> prepare
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> prepare transcation
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> rollback to savepoint
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> savepoint
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> start transaction
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> call
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> execute
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> close
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> explain
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> cluster
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> comment
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> copy
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> discard
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> do
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> declare
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> move
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> fetch
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> grant
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> revoke
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> import
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> listen
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> notify
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> unlisten
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> load
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> lock
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> reassign
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> refresh
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> reindex
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> reset
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> set
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> set constraints
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> set role
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> set session authorization
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> set transcation
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> show
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> values
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">Object:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> system
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> user
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> role
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> group
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> database
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> table space
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> schema
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> table
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> temp table
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> forgien table
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> index
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> view
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> materialized view
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> sequence
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> function
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> procedure
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> trigger
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> aggregate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> larger object
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> domain
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> type
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> cast
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> conversion
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> collation
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> language
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> rule
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> forgien data wrapper
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> server
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> user mapping
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> publication
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> subscription
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> privileges
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> policy
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> statistics
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> routine
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> text search configuration
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> text search dictionary
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> text search parser
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> text search template
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> operator
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> operator class
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> operator family
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> access method
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> extension
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">-- =============================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">*/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- fdw
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">atlasdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres_fdw&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">WRAPPER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres_fdw&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">host&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;172.16.100.134&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">port&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;5432&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;fdb1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">schema_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;public&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ft1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MAPPING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;fu1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;fu1.password&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- common
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tbl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tbl&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">generate_series&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;bbbbbbbbb&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- cursor | declare,fetch,move,close | (must in transaction block)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DECLARE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CURSOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tbl&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- consider it as a cache for select result
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">FETCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FETCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">MOVE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FORWARD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CLOSE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- channel | listen,unlisten,notify
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- session 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">LISTEN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ch1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- session 2 --&amp;gt; session 1, session 1 receive and cache message
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">NOTIFY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ch1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;hello&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_notify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ch1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;hello&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">UNLISTEN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ch1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- table | create,alter(rename,move),drop,lock,insert,update,select,delete
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tb1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tb1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ADD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">COLUMN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c3&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tb1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RENAME&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">COLUMN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">LOCK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tb1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ACCESS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXCLUSIVE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">MODE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tb1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- materialized view
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MATERIALIZED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VIEW&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">mv1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tbl&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- dictionary &amp;amp; configuration |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DICTIONARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsd1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">TEMPLATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">snowball&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">language&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">english&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DICTIONARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsd1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stopwords&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">english&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CONFIGURATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsc1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">copy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">english&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CONFIGURATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsc1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MAPPING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">asciiword&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">asciihword&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">hword_asciipart&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsd1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">simple&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">to_tsvector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tsc1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abc bb cc bb&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CONFIGURATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsc1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SEARCH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DICTIONARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tsd1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- domain | create,alter,drop
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DOMAIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">do1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONSTRAINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CHECK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VALUE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;^[0-9]+$&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFAULT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- consider a group of &amp;#39;check / not null / default&amp;#39; for column
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DOMAIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">do1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ADD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONSTRAINT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CHECK&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">LEFT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">VALUE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;5&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">do1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;12&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;89&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">default&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DOMAIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">do1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- conversion | create | (need define c code)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- CREATE FUNCTION f1(integer, cstring, integer, cstring) RETURNS integer AS &amp;#39;latin1_utf8&amp;#39;, &amp;#39;latin1_to_utf8&amp;#39; LANGUAGE C STRICT;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- CREATE CONVERSION co1 FOR &amp;#39;LATIN1&amp;#39; TO &amp;#39;UTF8&amp;#39; FROM f1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT CONVERT(&amp;#39;\xe4\xf6\xfc&amp;#39;::bytea, &amp;#39;latin1_utf8_cnv&amp;#39;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- DROP CONVERSION co1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- DROP FUNCTION f1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- user
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u2.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.newpass&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">u4&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- type
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TYPE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">int_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- synonym (only oracle)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYNONYM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PUBLIC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYNONYM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ps1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ps1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYNONYM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SYNONYM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ps1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- aggregate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_add_a_int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">bigint&lt;/span>&lt;span class="p">[],&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">val&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURNS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">bigint&lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LANGUAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">sql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">ARRAY&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">val&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_avg_final&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">bigint&lt;/span>&lt;span class="p">[])&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">RETURNS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">numeric&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LANGUAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">sql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="nb">numeric&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AGGREGATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a_int_avg&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">SFUNC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_add_a_int&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">STYPE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">bigint&lt;/span>&lt;span class="p">[],&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">FINALFUNC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_avg_final&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">INITCOND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;{0,0}&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a_int_avg&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">generate_series&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AGGREGATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a_int_avg&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_add_a_int&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FUNCTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f_avg_final&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-adt_scope_dcl">2 adt_scope_dcl&lt;/h1>
&lt;h1 id="3-adt_scope_dml">3 adt_scope_dml&lt;/h1>
&lt;h1 id="4-adt_scope_dql">4 adt_scope_dql&lt;/h1>
&lt;h1 id="5-adt_scope_tcl">5 adt_scope_tcl&lt;/h1>
&lt;h1 id="6-adt_scope_func">6 adt_scope_func&lt;/h1>
&lt;h1 id="7-adt_scope_mng">7 adt_scope_mng&lt;/h1>
&lt;h1 id="8-adt_scope_misc">8 adt_scope_misc&lt;/h1></description></item><item><title>jdbc</title><link>https://my-blog.j8465383071.workers.dev/posts/database/jdbc/</link><pubDate>Thu, 24 Jul 2025 19:03:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/jdbc/</guid><description>&lt;h1 id="1-使用jdbc的流程">1 使用JDBC的流程&lt;/h1>
&lt;ol>
&lt;li>准备java环境&lt;/li>
&lt;li>准备jdbc驱动&lt;/li>
&lt;li>编写java代码&lt;/li>
&lt;li>执行java代码&lt;/li>
&lt;/ol>
&lt;h1 id="2-使用jdbc">2 使用JDBC&lt;/h1>
&lt;h2 id="21-准备java环境">2.1 准备java环境&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>安装java工具包&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>验证java安装成功&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">java -version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># openjdk version &amp;#34;1.8.0_382&amp;#34; : 8表示java 8&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>执行java demo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编写代码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">public class Demo {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> public static void main(String[] args) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> System.out.println(&amp;#34;Hello World&amp;#34;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt;&amp;gt; Demo.java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编译代码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">javac Demo.java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 执行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">java Demo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="22-准备jdbc驱动">2.2 准备jdbc驱动&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">touch jdbc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> jdbc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir jars
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> jars
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://jdbc.postgresql.org/download/postgresql-42.7.7.jar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">目录架构：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>-- jdbc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- jars
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- postgresql-42.7.7.jar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://polydistortion.net/bc/index.html">https://polydistortion.net/bc/index.html&lt;/a>&lt;/p></description></item><item><title>海量 9 设计 E100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-design-e100-audit/</link><pubDate>Tue, 22 Jul 2025 14:28:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-design-e100-audit/</guid><description>&lt;h1 id="1-e100审计功能">1 E100审计功能&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;p>【审计功能】&lt;br>
审计是重要的安全特性，核心功能是收集数据库内的事件，例如：登录用户、创建对象、查询数据等，根据事件生成与审计日志，存储审计日志，向用户提供日志查询接口。使用方式请看需求文档。&lt;/p>
&lt;p>【审计架构】&lt;br>
审计整体架构如下图所示：（&lt;strong>“线程“替换为“进程”&lt;/strong>，原图不小心弄丢了，不好修改了，将就看）&lt;/p>
&lt;p>&lt;img alt="adt-1" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/9-design-e100-audit/adt-1.png">&lt;/p>
&lt;p>【审计流程】&lt;/p>
&lt;p>&lt;img alt="adt-2" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/9-design-e100-audit/adt-2.png">&lt;/p>
&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;h3 id="一启动审计进程">一、启动审计进程&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">1. 启动postmaster进程 &lt;span class="c1"># PostmasterMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2. 加载GUC参数 &lt;span class="c1"># SelectConfigFiles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2.1 &lt;span class="s1">&amp;#39;---加载审计GUC---&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3. 创建共享内存和信号量 &lt;span class="c1"># reset_shared -&amp;gt; CreateSharedMemoryAndSemaphores&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.1 计算共享内存总大小
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;计算审计共享内存大小：根据GUC配置&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.2 创建共享内存 &lt;span class="c1"># PGSharedMemoryCreate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.3 创建LwLock &lt;span class="c1"># CreateLWLocks&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.4 初始化wal-buffer共享内存 &lt;span class="c1"># XLOGShmemInit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.5 初始化share-buffer共享内存 &lt;span class="c1"># InitBufferPool&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3.6 &lt;span class="s1">&amp;#39;如果开启审计：初始化审计共享内存：划分共享内存，包括audit-buffer&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 4. 启动sys-log进程 &lt;span class="c1"># SysLogger_Start&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5. &lt;span class="s1">&amp;#39;如果开启审计：初始化审计模块&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.1 &lt;span class="s1">&amp;#39;日志目录：检验与创建审计日志目录&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.2 &lt;span class="s1">&amp;#39;日志文件：每次重启，使用新的日志文件，方便用户单个删除日志文件&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.3 &lt;span class="s1">&amp;#39;内存上下文：创建审计全局内存上下文&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.4 &lt;span class="s1">&amp;#39;审计缓存区：初始化audit-buffer&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.5 &lt;span class="s1">&amp;#39;审计文件：初始化审计文件（并发write, read, delete日志）&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5.6 &lt;span class="s1">&amp;#39;回调函数：在执行DDL、计划、函数等关键函数中，注册生成审计事件、日志的回调函数&amp;#39;&lt;/span> &lt;span class="c1"># 后面详细介绍&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6. &lt;span class="s1">&amp;#39;如果开启审计：启动审计进程&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.1 &lt;span class="s1">&amp;#39;信号：注册信号处理函数：sighup, sigquit, sigusr1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.2 &lt;span class="s1">&amp;#39;显示：设置ps命令显示的进程信息&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.3 主循环
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.4 &lt;span class="s1">&amp;#39;等待事件：关键是timeout&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.5 &lt;span class="s1">&amp;#39;存储日志：读取audit-buffer中待落盘的日志，并存储&amp;#39;&lt;/span> &lt;span class="c1"># 后面详细介绍&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6.6 &lt;span class="s1">&amp;#39;调整速率：按照每次落盘数据的长度，动态调整timeout&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 连续多次为0，timeout依次变为1ms, 100ms, 1s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 单次落盘长度大于16m，timeout&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7. &lt;span class="s1">&amp;#39;主循环&amp;#39;&lt;/span> &lt;span class="c1"># ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.1 接收客户端连接 &lt;span class="c1"># select&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.2 创建postgres进程 &lt;span class="c1"># BackendStartup -&amp;gt; BackendRun -&amp;gt; PostgresMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.3 检查与重启sys-log进程 &lt;span class="c1"># SysLogger_Start&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.4 &lt;span class="s1">&amp;#39;检查与重启审计进程&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.5 检查与重启checkpointer进程 &lt;span class="c1"># StartCheckpointer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7.6 检查与重启wal-writer进程 &lt;span class="c1"># StartWalWriter&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="二收集审计事件">二、收集审计事件&lt;/h3>
&lt;p>目前，只有以下2类进程，会生成审计事件：&lt;/p></description></item><item><title>海量 9 需求 E100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-requirement-e100-audit/</link><pubDate>Fri, 18 Jul 2025 10:50:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-requirement-e100-audit/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>审计是重要的安全特性，功能是收集数据库内的事件，例如创建对象、查询数据等，根据事件生成与存储审计日志，并向用户提供查询审计日志的接口。&lt;/p>
&lt;p>在303.7版本，E100首次引入审计特性，本文介绍E100审计特性的对外接口、功能约束、使用方式等信息。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>E100，303.7及之后的版本&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;p>无&lt;/p>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>G100审计特性：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549&lt;/a>&lt;/li>
&lt;li>Oracle审计特性：&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html">https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html&lt;/a>&lt;/li>
&lt;li>开源组件pgaudit：&lt;a href="https://www.modb.pro/db/105894">https://www.modb.pro/db/105894&lt;/a>&lt;/li>
&lt;li>G100审计重构方案：&lt;a href="https://doc.weixin.qq.com/doc/w3_AdwAfAa7AFkCNFLkO0AXJSUK7CICd?scode=AHUAfwdSAA8DKRU1G1AdwAfAa7AFk&amp;amp;version=4.1.38.6011&amp;amp;platform=win">https://doc.weixin.qq.com/doc/w3_AdwAfAa7AFkCNFLkO0AXJSUK7CICd?scode=AHUAfwdSAA8DKRU1G1AdwAfAa7AFk&amp;amp;version=4.1.38.6011&amp;amp;platform=win&lt;/a>&lt;/li>
&lt;li>pg 14完整语法：&lt;a href="https://www.postgresql.org/docs/14/sql-commands.html">https://www.postgresql.org/docs/14/sql-commands.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-e100审计特性">2 E100审计特性&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;p>【审计特性】&lt;br>
审计特性，主要功能是记录数据库内的各种事件，并向用户提供查询事件的接口。事件包括：&lt;/p>
&lt;ul>
&lt;li>启动、恢复、切换、停止集群&lt;/li>
&lt;li>登录、注销账号&lt;/li>
&lt;li>创建、修改、删除数据库对象，包括：DATABASE、SCHEMA、TABLE等&lt;/li>
&lt;li>插入、更新、删除、查询关系表&lt;/li>
&lt;li>…&lt;/li>
&lt;/ul>
&lt;p>【审计事件】&lt;br>
数据库内发生的事件，都可描述为&amp;lt;主体&amp;gt;&amp;lt;操作&amp;gt;&amp;lt;客体&amp;gt;&lt;/p>
&lt;ul>
&lt;li>主体：一般是数据库用户&lt;/li>
&lt;li>客体：集群、账号、数据对象等&lt;/li>
&lt;li>操作：针对不同客体，操作类型不一样。比如，对于TABLE，操作类型有：CREATE, INSERT, SELECT等。&lt;/li>
&lt;/ul>
&lt;p>【审计日志】&lt;br>
发生事件时，审计特性会收集事件中的信息，将事件封装审计日志，审计日志中的关键内容包括：&lt;/p>
&lt;ul>
&lt;li>主体信息：用户名&lt;/li>
&lt;li>操作信息：操作类型、操作时间、操作的SQL语句等&lt;/li>
&lt;li>客体信息：客体类型、客体名称、客体属于哪个database、客体属于哪个schema&lt;/li>
&lt;/ul>
&lt;p>【审计流程】&lt;br>
使用审计特性时，主要包括以下几个流程：&lt;/p>
&lt;ol>
&lt;li>配置审计功能：用户提前配置审计范围，即配置哪些事件需被审计。&lt;/li>
&lt;li>生成审计日志：用户操作数据库时，产生审计事件，例如创建表、删除表等。内核收集事件信息，生成审计日志。&lt;/li>
&lt;li>存储审计日志：内核存储审计日志至磁盘。&lt;/li>
&lt;li>查询审计日志：用户查询审计日志，内核从磁盘读取审计日志。&lt;/li>
&lt;li>删除审计日志&lt;/li>
&lt;/ol>
&lt;p>一个简单示例如下图所示：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1. 配置审计功能：确定哪些事件需审计
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 2. 生成审计日志：用户执行SQL，产生事件&amp;lt;用户&amp;gt;&amp;lt;创建&amp;gt;&amp;lt;表&amp;gt;，根据事件生成日志
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3. 存储审计日志：内核自动存储日志
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 4. 查询审计日志
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_audit_log&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 预期输出（横向输出）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">RECORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="c1">---------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">scope&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">subject&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 主体信息：用户名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">optype&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">create&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 操作信息：create操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">optime&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2025&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">07&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">18&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">400009&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">08&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 操作时间
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">opresult&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">object&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 客体信息：客体类型
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">objdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 客体信息：客体属于哪个database
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">objnsp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 客体信息：客体属于哪个schema
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">objname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 客体信息：客体名称
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">opxid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">optid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">pid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">sql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">create&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 触发操作的SQL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extra&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>【友商对比】&lt;br>
对比oracle、opengauss/g100、pgaudit&lt;/p></description></item><item><title>分享编写需求/设计文档的个人经验</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/writing-requirement-and-design-docs/</link><pubDate>Tue, 15 Jul 2025 10:54:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/writing-requirement-and-design-docs/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-分享的主题">1.1 分享的主题&lt;/h2>
&lt;p>分享一些编写需求、设计文档经验&lt;/p>
&lt;h2 id="12-分享的背景">1.2 分享的背景&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>背景：我写的需求文档，（相对）还算详细，所以有此次分享&lt;/p>
&lt;ul>
&lt;li>308.1，profile功能的需求文档：&lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>根因：前公司流程繁重，被迫养成这种习惯。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>分享的内容：可分享的干货不多，我觉得，在写文档的过程中，大部分人想的很详细，只是没有编写到文档中，毕竟每个人都有自己的编写风格。所以，本文的重点，是介绍前公司流程与要求，并以我做过的需求为例，为大家提供一点参考。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>分享人经历：交过10+个不算小的需求，完整写过10+次需求与设计文档，格式与海量的接近。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>分享的局限：交付的需求，主要是安全方向，也涉及SQL、存储等多个模块，所以，本文主要以安全需求的角度写，其他模块的需求不一定适用。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="scope" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/writing-requirement-and-design-docs/scope.png">&lt;/p>
&lt;h2 id="13-前公司的流程">1.3 前公司的流程&lt;/h2>
&lt;p>与海量相比，前公司的交付流程，几乎一样：&lt;/p>
&lt;ol>
&lt;li>客户：提出需求&lt;/li>
&lt;li>产品、项目、测试、架构等：审核需求&lt;/li>
&lt;li>开发：撰写需求/设计文档&lt;/li>
&lt;li>各角色：评审需求/设计文档&lt;/li>
&lt;li>开发：编写代码&lt;/li>
&lt;li>…&lt;/li>
&lt;/ol>
&lt;p>其中，在&lt;code>4.评审需求/设计文档&lt;/code>环节，前公司区别较大：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>一、评审人员多&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>编号&lt;/th>
&lt;th>角色&lt;/th>
&lt;th>评审人&lt;/th>
&lt;th>目的&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>开发&lt;/td>
&lt;td>安全组、SQL组、存储组、运维组、..&lt;/td>
&lt;td>避免影响其他模块，协助发现风险&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>测试&lt;/td>
&lt;td>测试人、测试组长&lt;/td>
&lt;td>学习新需求，识别测试重点&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>架构&lt;/td>
&lt;td>架构设计&lt;/td>
&lt;td>避免影响其他模块，确保后向兼容&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>资料&lt;/td>
&lt;td>资料优化、资料审核&lt;/td>
&lt;td>学习新需求&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>用例&lt;/td>
&lt;td>用例审核&lt;/td>
&lt;td>确保各种check可看护功能&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>其他&lt;/td>
&lt;td>流程提升&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>二、评审通过难&lt;/p>
&lt;ol>
&lt;li>组内评审&lt;/li>
&lt;li>线上评审：上述所有角色会上评审，不过，一般很多人会议冲突，关键靠线下评审&lt;/li>
&lt;li>线下评审（关键流程）：各类角色共10+必选评审人，通过在线需求文档、设计文档了解需求，提出疑问，提出意见。开发分析解决后，找提出人确认意见，才算闭环。最后，所有必选评审人评审通过，才算完成流程。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;p>在这种流程中，需求与设计文档，要满足很多要求：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>普适：考虑到其他组开发、测试、资料等角色，不熟悉本领域的基础知识，所以，需要详细介绍相关原理，很多原理需要从头介绍&lt;/p>
&lt;/li>
&lt;li>
&lt;p>完整：要充分例举所有可能涉及风险，否则，评审人会认为未考虑到&lt;/p>
&lt;blockquote>
&lt;p>举例：做了1个需求，可以为表设置加密属性，需要考虑：系统表、用户表（atore表、ustore表、分区表、临时表、toast表、unlogged表、segment表、hashbuckent表、物化视图…）&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;/ol>
&lt;h1 id="2-需求文档写作思路">2 需求文档写作思路&lt;/h1>
&lt;h2 id="21-分析过程">2.1 分析过程&lt;/h2>
&lt;p>首先，客户提出需求，很多需求不够清晰。&lt;/p>
&lt;blockquote>
&lt;p>示例：&lt;/p>
&lt;ul>
&lt;li>profile原始需求：
&lt;ul>
&lt;li>目前对于数据库用户的管理方式不够便捷，无法像Oracle为用户赋予一组安全策略。一些属性如密码有效期、密码过期天数、密码尝试次数等也只能全局设定，无法指定用户配置。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>然后，以我的个人习惯，分析需求的流程如下：&lt;/p></description></item><item><title>海量 9 接口 E100审计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-api-e100-audit/</link><pubDate>Tue, 17 Jun 2025 18:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/9-api-e100-audit/</guid><description>&lt;ol>
&lt;li>配置审计功能&lt;br>
通过GUC配置审计功能，新增GUC如下：&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>编号&lt;/th>
&lt;th>参数名&lt;/th>
&lt;th>默认值&lt;/th>
&lt;th>取值范围&lt;/th>
&lt;th>功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>enable_audit&lt;/td>
&lt;td>off&lt;/td>
&lt;td>on, off&lt;/td>
&lt;td>控制是否开启审计功能&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>aduit_directory&lt;/td>
&lt;td>空&lt;/td>
&lt;td>任意绝对路径&lt;/td>
&lt;td>审计日志存储目录，确保数据库用户有权访问。如果取值为空，则默认存储于”数据目录/vb_audit”下&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>audit_directory_size&lt;/td>
&lt;td>64M&lt;/td>
&lt;td>[64M, -]&lt;/td>
&lt;td>审计日志目录最大空间，如果文件目录达到限制时，最旧的日志文件将被新文件覆盖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>audit_scope&lt;/td>
&lt;td>ddl&lt;/td>
&lt;td>all, ddl, insert, update, select, delete, function&lt;/td>
&lt;td>审计范围。可设置多个范围，示例：”ddl, update, delete”&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>audit_buffer_size&lt;/td>
&lt;td>16M&lt;/td>
&lt;td>[1M, 1G]&lt;/td>
&lt;td>内存中，审计日志缓冲区大小&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>audit_detail&lt;/td>
&lt;td>basic,event,sql&lt;/td>
&lt;td>basic,event, sql&lt;/td>
&lt;td>控制审计日志详细程度&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>audit_unclassfied&lt;/td>
&lt;td>on&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="2">
&lt;li>启动审计功能&lt;br>
设置审计参数后，重启数据库，内核关键变化如下：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>申请共享内存：工作线程生成日志后，将日志写入共享内存，该内存为审计日志缓冲区，缓冲区大小由GUC参数audit_buffer_size控制&lt;/li>
&lt;li>新增进程：新增1个线程，负责将审计缓存区中的日志，存储至文件&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>生成审计日志&lt;br>
执行SQL语句时，如果SQL语句在审计范围内，内核一般会生成1条审计日志，如果SQL语句较复杂，语句中多个子操作会生成多条审计日志。&lt;/li>
&lt;/ol>
&lt;p>审计日志中，记录的内容如下：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>日志字段&lt;/th>
&lt;th>示例&lt;/th>
&lt;th>解释&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>主体类型&lt;/td>
&lt;td>user&lt;/td>
&lt;td>目前，主体类型只支持用户类型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>主体名称&lt;/td>
&lt;td>u1&lt;/td>
&lt;td>执行操作的用户，即执行SQL前，与数据库建立连接的用户&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作类型&lt;/td>
&lt;td>create&lt;/td>
&lt;td>针对不同类型的对象，操作不同，例如，针对表有create, insert, select, ..等操作&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作时间&lt;/td>
&lt;td>2025-05-01 12:00:01 678956&lt;/td>
&lt;td>格式：年-月-日 时-分-秒 微秒&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作XID&lt;/td>
&lt;td>20000&lt;/td>
&lt;td>事务ID&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作LSN&lt;/td>
&lt;td>0/170F5F0&lt;/td>
&lt;td>该日志对应的SQL语句，最新生成的XLOG的写入位置&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>对象类型&lt;/td>
&lt;td>table&lt;/td>
&lt;td>数据库对象类型，包括database, schema, table, view, …&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>对象名称&lt;/td>
&lt;td>t1&lt;/td>
&lt;td>数据库对象名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>对象数据库&lt;/td>
&lt;td>db1&lt;/td>
&lt;td>对象属于哪个database&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>对象命名空间&lt;/td>
&lt;td>sch1&lt;/td>
&lt;td>对象属于哪个schema&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SQL语句&lt;/td>
&lt;td>CREATE TABLE t1(c1 INT, c2 TEXT)&lt;/td>
&lt;td>执行操作的原始SQL语句&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>存储审计日志&lt;br>
在审计目录下，审计文件设计如下：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>命名：格式为：adt_年_月日_时分_秒_微秒.alog，文件名中包含文件创建时间&lt;br>
示例：&lt;/p></description></item><item><title>flamegraph 火焰图</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/graph/</link><pubDate>Mon, 09 Jun 2025 11:54:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/graph/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">yum install perf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/brendangregg/FlameGraph.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch perf.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">pids&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>pgrep &lt;span class="nv">$1&lt;/span> &lt;span class="p">|&lt;/span> head -n 4&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf ./tmp_graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./tmp_graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> pid in &lt;span class="nv">$pids&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;-- collecting data for &lt;/span>&lt;span class="nv">$pid&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> perf record -F &lt;span class="m">600&lt;/span> -p &lt;span class="nv">$pid&lt;/span> -g -- sleep &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> perf script -i perf.data &amp;gt; ./tmp_graph/perf.unfold.&lt;span class="nv">$pid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ./flame/stackcollapse-perf.pl ./tmp_graph/perf.unfold.&lt;span class="nv">$pid&lt;/span> &amp;gt; ./tmp_graph/perf.folded.&lt;span class="nv">$pid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ./tmp_graph/perf.folded.* &amp;gt; ./tmp_graph/all.folded
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./flame/flamegraph.pl ./tmp_graph/all.folded &amp;gt; ./all.svg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sh perf.sh 进程名
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">rm -rf ./tmp_graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./tmp_graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">pid&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;-- collecting data for &lt;/span>&lt;span class="nv">$pid&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">perf record -F &lt;span class="m">600&lt;/span> -p &lt;span class="nv">$pid&lt;/span> -g -- sleep &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">perf script -i perf.data &amp;gt; ./tmp_graph/perf.unfold.&lt;span class="nv">$pid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./flame/stackcollapse-perf.pl ./tmp_graph/perf.unfold.&lt;span class="nv">$pid&lt;/span> &amp;gt; ./tmp_graph/perf.folded.&lt;span class="nv">$pid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ./tmp_graph/perf.folded.* &amp;gt; ./tmp_graph/all.folded
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./flame/flamegraph.pl ./tmp_graph/all.folded &amp;gt; ./all.svg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>PostgreSQL fdw</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/fdw/</link><pubDate>Thu, 29 May 2025 14:20:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/fdw/</guid><description>&lt;h1 id="1-e100-fdw">1 E100 fdw&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">+----
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>定义外表&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- \c atlasdb
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- ALTER SYSTEM SET password_encryption = &amp;#39;scram-sha-256&amp;#39;;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SELECT pg_reload_conf();
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- SHOW password_encryption;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 外部数据库：fdb1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fdb1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fu1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORd&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;QAZ2wsx@123&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fdb1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ft1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ft1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">reset&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 配置本地数据库
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">atlasdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">EXTENSION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres_fdw&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">WRAPPER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres_fdw&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">host&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;172.16.100.134&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">port&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;5432&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;fdb1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOREIGN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">schema_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;public&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ft1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">MAPPING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OPTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;fu1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;QAZ2wsx@123&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 配置远程登录
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host all u1 0.0.0.0/0 md5&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">PG_HOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">atlasdb_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;host all fu1 0.0.0.0/0 md5&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">PG_HOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">atlasdb_hba&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">echo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;listen_addresses=&amp;#39;0.0.0.0&amp;#39;&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">PG_HOME&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">data&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">atlasdb&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">conf&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">pstop&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">pstart&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 访问外表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">role&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_user_mapping&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- clean
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SERVER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">s1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CASCADE&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fdb1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">fu1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-g100-fdw">2 G100 fdw&lt;/h1>
&lt;ol>
&lt;li>
&lt;p>安装外部集群&lt;/p></description></item><item><title>工具 多线程 thread</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/thread/</link><pubDate>Thu, 22 May 2025 19:29:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/thread/</guid><description>&lt;h1 id="1-多线程框架">1 多线程框架&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gcc thd.c -lpthread -o thd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdbool.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;pthread.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;unistd.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;semaphore.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="n">prtlog&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define ASSERT(cond) \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> if (!(cond)) {printf(&amp;#34;ASSERT | file: %s line: %d func: %s\n&amp;#34;, __FILE__, __LINE__, __FUNCTION__); exit(-1);}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define LOG(thdctl, fmt, ...) \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> do { \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> if (prtlog) { \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> char data_[2048]; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> snprintf(data_, 2048, (fmt), ##__VA_ARGS__); \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> thdctl != NULL ? \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> printf(&amp;#34; &amp;gt;%-3d %s\n&amp;#34;, ((ThdCtl *)(thdctl))-&amp;gt;id, data_) : \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> printf(&amp;#34;%s\n&amp;#34;, data_); \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> } \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> } while (0)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* ---------------------------------------------------------------------- */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="n">ThdCtl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="n">ThdData&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="nf">void&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">ThdHookFunc&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread info */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">stat&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">pthread_t&lt;/span> &lt;span class="n">thd&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread function */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">init_func&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">exec_func&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">exit_func&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread control */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">iswait&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">sem_t&lt;/span> &lt;span class="n">wait&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">thdnum&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">10000&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">ProCtl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* ---------------------------------------------------------------------- */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">multi_execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">initfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">execfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">exitfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">thdnum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">dataarr&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="n">ThdData&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;init&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">thdctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;execute, id: %d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">finish&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">thdctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;finish, id: %d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdData&lt;/span> &lt;span class="n">datas&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">multi_execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">init&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">execute&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">finish&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">datas&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* ---------------------------------------------------------------------- */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">thread_main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">arg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tctl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">arg&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">init_func&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nf">init_func&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* wait to be wake up */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// LOG(tctl, &amp;#34;sleep&amp;#34;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nf">sem_wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">wait&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* wake up now */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// LOG(tctl, &amp;#34;wakeup&amp;#34;);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">iswait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* ====== user funtion begin ========== */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">exec_func&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nf">exec_func&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* ====== user funtion finish ========== */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">exit_func&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="nf">exit_func&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">create_thread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ProCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">process&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">initfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">execfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">exitfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">thddata&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">thdid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">malloc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdCtl&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">t&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ASSERT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">false&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread info */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">stat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">thdid&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread function */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">init_func&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">initfunc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">exec_func&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">execfunc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">exit_func&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">exitfunc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">thddata&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">stat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">pthread_create&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">thread_main&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* thread control */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">iswait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">sem_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">wait&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">process&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">process&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdnum&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">process&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdnum&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ProCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nf">create_process&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">pro&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ProCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">malloc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ProCtl&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ASSERT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pro&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdnum&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">memset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">pro&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">multi_execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">initfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">execfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdHookFunc&lt;/span> &lt;span class="n">exitfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">thdnum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ThdData&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">dataarr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">pro&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">create_process&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;init ------------------------&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">thdnum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">create_thread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pro&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">initfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">execfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exitfunc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dataarr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;execute ------------------------&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdnum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ThdCtl&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">tctl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">sem_post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">tctl&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">wait&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdnum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pthread_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pro&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thdarr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">thd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">LOG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;finish ------------------------&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-多线程示例">2 多线程示例&lt;/h1></description></item><item><title>fepaser</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/feparser/</link><pubDate>Wed, 21 May 2025 16:27:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/feparser/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装nodejs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install -y nodejs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装claude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install -g @anthropic-ai/claude-code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /data/postgresql17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. 启动 Claude Code 并进行首次认证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行后，终端会提供一个链接，在浏览器中完成账号授权即可&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 6. (可选但推荐) 生成项目记忆文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在 Claude 交互界面中，输入以下命令，它会分析项目并生成 CLAUDE.md 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>数据库安全 传输加密</title><link>https://my-blog.j8465383071.workers.dev/posts/security/transport-encryption/</link><pubDate>Wed, 21 May 2025 09:37:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/transport-encryption/</guid><description>&lt;h1 id="非国密">非国密&lt;/h1>
&lt;ol>
&lt;li>生成证书&lt;/li>
&lt;li>数据库服务端：配置证书、配置传输加密算法&lt;/li>
&lt;li>数据库客户端：配置证书&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查openssl版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">which openssl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 确保使用的是vastbase发布包中的openssl，而非操作系统中的openssl&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$GAUSSHOME&lt;/span>/share/sslcert/gsql/openssl.cnf ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">OPENSSL_CONF&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">700&lt;/span> ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;01&amp;#39;&lt;/span>&amp;gt;./demoCA/serial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch ./demoCA/index.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ca&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl genrsa -out ./demoCA/private/cakey.pem &lt;span class="m">2048&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days &lt;span class="m">7300&lt;/span> -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl genrsa -out server.key &lt;span class="m">2048&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key server.key -out server.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in server.csr -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># client&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl genrsa -out client.key &lt;span class="m">2048&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key client.key -out client.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in client.csr -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -in client.crt -text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置权限&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CERT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export CERT=`pwd`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLMODE=verify-ca
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLROOTCERT=$CERT/demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLKEY=$CERT/client.key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLCERT=$CERT/client.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt; client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置服务端参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_ciphers = &amp;#39;ALL&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_ca_file = &amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/demoCA/cacert.pem&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_key_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.key&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_cert_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -d postgres -c &lt;span class="s2">&amp;#34; CREATE USER u1 PASSWORD &amp;#39;u1.password&amp;#39; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 连接数据库：需加-h参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -h localhost -d postgres -U u1 -W &lt;span class="s1">&amp;#39;u1.password&amp;#39;&lt;/span> -r
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">rm -f client.* server.*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_ciphers = &amp;#39;ECDHE-ECDSA-SM4-CBC-SM3&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days &lt;span class="m">7300&lt;/span> -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key server.key -out server.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in server.csr -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># client&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -new -key client.key -out client.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -in client.csr -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> client.key client.crt server.key server.crt ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -in client.crt -text
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="国密">国密&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># OpenSSL 1.1.1s Tassl 2.1.2 1 Nov 2022&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp ../tassl/install/openssl.cnf ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +w ./openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">[ gm_ca_cert ]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">subjectKeyIdentifier=hash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">authorityKeyIdentifier=keyid:always,issuer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">basicConstraints = critical,CA:true
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">keyUsage = critical, cRLSign, keyCertSign
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">[ gm_sign_cert ]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">basicConstraints = CA:FALSE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">keyUsage = critical, digitalSignature, nonRepudiation
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">[ gm_enc_cert ]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">basicConstraints = CA:FALSE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">keyUsage = critical, keyEncipherment, dataEncipherment, keyAgreement&amp;#39;&lt;/span> &amp;gt;&amp;gt; ./openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">700&lt;/span> ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;01&amp;#39;&lt;/span>&amp;gt;./demoCA/serial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch ./demoCA/index.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ca&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key ./demoCA/private/cakey.pem -sm3 -out ./demoCA/private/ca_cert_req.pem -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -extfile openssl.cnf -extensions gm_ca_cert -in ./demoCA/private/ca_cert_req.pem -sm3 -days &lt;span class="m">7300&lt;/span> -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -in server.key -passout pass:gauss@123 -sm4 -out server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key server.key -passin pass:gauss@123 -sm3 -out server.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in server.csr -sm3 -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># server.enc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out server_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -in server_enc.key -passout pass:gauss@123 -sm4 -out server_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key server_enc.key -passin pass:gauss@123 -sm3 -out server_enc.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in server_enc.csr -sm3 -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server_enc.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc encrypt -M server -D ./ -K gauss@123
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># client&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -in client.key -passout pass:gauss@123 -sm4 -out client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key client.key -passin pass:gauss@123 -sm3 -out client.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in client.csr -sm3 -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># client.enc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -name SM2 -genkey -out client_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -in client_enc.key -passout pass:gauss@123 -sm4 -out client_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key client_enc.key -passin pass:gauss@123 -sm3 -out client_enc.csr -subj &lt;span class="s2">&amp;#34;/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in client_enc.csr -sm3 -days &lt;span class="m">3650&lt;/span> -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client_enc.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc encrypt -M client -D ./ -K gauss@123
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># openssl x509 -in client.crt -text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CERT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export CERT=`pwd`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLMODE=verify-ca
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLTLCP=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLROOTCERT=$CERT/demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLKEY=$CERT/client.key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLCERT=$CERT/client.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLENCKEY=$CERT/client_enc.key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLENCCERT=$CERT/client_enc.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt; client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置服务端参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_ciphers = &amp;#39;ALL&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_use_tlcp=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_ca_file = &amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/demoCA/cacert.pem&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_key_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.key&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_cert_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_enc_key_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server_enc.key&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data/single_node -c &lt;span class="s2">&amp;#34;ssl_enc_cert_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server_enc.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启数据库&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>数据库安全 全密态</title><link>https://my-blog.j8465383071.workers.dev/posts/security/fully-encrypted-overview/</link><pubDate>Tue, 20 May 2025 18:22:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/fully-encrypted-overview/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">PQconnectStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">makeEmptyPGconn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">connectOptions1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parse_connection_string&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fillPGconn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">conninfo_getval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;enable_ce&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 解析 &amp;#39;enable_ce&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">connectDBStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQconnectPoll&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">CONNECTION_NEEDED&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 建立TCP连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">connect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">CONNECTION_MADE&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 发送连接参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqBuildStartupPacket3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">build_startup_packet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqPacketSend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">CONNECTION_AWAITING_RESPONSE&lt;/span> &lt;span class="c1"># 进行身份认证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_fe_sendauth&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">PQexec&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQexecStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQsendQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Processor&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">run_pre_query&lt;/span> &lt;span class="c1"># 加密SQL语句中的数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Parser&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">Parse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run_pre_statement&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run_pre_insert_statement&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CachedColumnManager&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">get_cached_columns&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RawValues&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">get_raw_values_from_insert_statement&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ValuesProcessor&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">process_values&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">process_inside_value&lt;/span> &lt;span class="c1"># 加密&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StatementData&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">replace_raw_values&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqPutMsgStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqPuts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqPutMsgEnd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqFlush&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQexecFinish&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQgetResult&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parseInput&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqParseInput3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqGetc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqGetInt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="s1">&amp;#39;D&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">getAnotherTuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqRowProcessor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ValuesProcessor&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">deprocess_value&lt;/span> &lt;span class="c1"># 解密服务端返回的数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqGets&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="s1">&amp;#39;Z&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Processor&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="n">run_post_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pqReadData&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>工具 使用benchmarksql测试tpcc</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/tpcc/</link><pubDate>Fri, 09 May 2025 11:41:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/tpcc/</guid><description>&lt;h1 id="2-安装数据库">2 安装数据库&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">scp shenkun@172.16.100.134:/home/shenkun/g100/pkg-5-19.tar.gz ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vast@123
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">GAUSSHOME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$PATH&lt;/span>:&lt;span class="nv">$GAUSSHOME&lt;/span>/bin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> LD_
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">vinit&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;vb_initdb -D $GAUSSHOME/data -w vb.12345 --nodename=db1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">vstart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;vb_ctl start -D $GAUSSHOME/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">vrestart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;vb_ctl restart -D $GAUSSHOME/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="3-安装benchmarksql">3 安装benchmarksql&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>一、下载benchmarksql&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.安装java openjdk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install java-1.8.0-openjdk-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2.下载benchmark安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://sourceforge.net/projects/benchmarksql/files/latest/download
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3.下载ant安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://dlcdn.apache.org//ant/binaries/apache-ant-1.10.15-bin.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.解压benchmark与ant安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 建议git初始化benchmark安装包，如果改错了可以回退&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>二、配置环境变量&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.生成环境变量脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch envbm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在envbm中添加一下内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">BMROOT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">BMCODE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$BMROOT&lt;/span>/benchmarksql-5.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$PATH&lt;/span>:&lt;span class="nv">$BMROOT&lt;/span>/apache-ant-1.10.15/bin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">DBIP&lt;/span>&lt;span class="o">=&lt;/span>127.0.0.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">DBPORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">5432&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2.配置环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> envbm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>三、配置benchmarksql配置文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1.生成配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir cfg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$BMCODE&lt;/span>/run/props.pg &lt;span class="nv">$BMROOT&lt;/span>/cfg/props.pg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2.编辑配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;/^user=/s/=.*/=u1/&amp;#39;&lt;/span> f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># user=bmuser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># password=bmuser@123&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># warehouses=10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># loadWorkers=10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># terminals=10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># runMins=5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># limitTxnsPerMin=0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 设置表的fillfictor=80&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$BMCODE&lt;/span>/run/sql.common/tableCreates.sql &lt;span class="nv">$BMCODE&lt;/span>/run/sql.common/_tableCreates.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;/^);/s/);.*/) with (fillfactor=80);/&amp;#39;&lt;/span> &lt;span class="nv">$BMCODE&lt;/span>/run/sql.common/tableCreates.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>四、生成便捷使用benchmarksql的脚本&lt;/p></description></item><item><title>数据库安全 重构审计</title><link>https://my-blog.j8465383071.workers.dev/posts/security/vastbase-audit-refactor/</link><pubDate>Mon, 31 Mar 2025 19:24:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/security/vastbase-audit-refactor/</guid><description>&lt;h1 id="1-审计的背景">1 审计的背景&lt;/h1>
&lt;h2 id="11-审计的原理">1.1 审计的原理&lt;/h2>
&lt;p>在使用数据库存取数据的大部分场景中，数据库具有以下特点：&lt;/p>
&lt;ul>
&lt;li>对象多：一个数据库集群中有多个database对象，1个database对象中有多个schema对象，1个schema对象中有多个table、index等对象&lt;/li>
&lt;li>用户多：一个数据库中，有多个用户，每个用户可访问的数据库对象不同&lt;/li>
&lt;li>应用多：多个应用将数据存储在同一数据库集群中，并同时访问数据库集群&lt;/li>
&lt;li>操作多：数据库提供丰富的功能，包括DDL、DML、DCL、运维等&lt;/li>
&lt;li>运行久：一个数据库集群，可能会保持数十年运行&lt;/li>
&lt;/ul>
&lt;p>审计的主要目的，使记录数据运行过程中发生了哪些事件。审计的3要素是：&lt;/p>
&lt;ul>
&lt;li>主体：一般指数据库用户&lt;/li>
&lt;li>客体：一般指数据库对象，包括：集群、数据对象（database、schema、table、index、function等）、用户等&lt;/li>
&lt;li>操作：主体对客体的操作，比如某个用户访问了某个表&lt;/li>
&lt;/ul>
&lt;h2 id="12-审计的目的">1.2 审计的目的&lt;/h2>
&lt;p>审计具有以下重要意义：&lt;/p>
&lt;ul>
&lt;li>合法合规：《网络安全法》等法律法规与表中中，要求应用通过《等保测评》等标准，标准中要求应用具备审计功能&lt;/li>
&lt;li>故障检测：当数据库出现故障时，协助快速定位问题&lt;/li>
&lt;li>攻击检测：通过检查审计日志，可判断是否发生网络安全攻击事件&lt;/li>
&lt;li>例行维护：通过检查审计日志，可跟踪对某个对象的访问信息&lt;/li>
&lt;li>…&lt;/li>
&lt;/ul>
&lt;p>等保测评要求标准（GB/T 28448）中，对审计的要求如下：&lt;/p>
&lt;ul>
&lt;li>审计范围
&lt;ul>
&lt;li>全面性&lt;/li>
&lt;li>细粒度：登录、访问、修改、删除等&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>审计内容
&lt;ul>
&lt;li>用户行为：登录、登出、权限变更&lt;/li>
&lt;li>数据访问：敏感数据查询、插入、更新、删除等&lt;/li>
&lt;li>异常行为：登录失败、非法访问&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>审计记录
&lt;ul>
&lt;li>详细性：时间戳、用户标识、操作类型、操作结果、IP地址等&lt;/li>
&lt;li>不可篡改：真实性、完整性&lt;/li>
&lt;li>存储安全：未经授权的访问和修改&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>审计管理
&lt;ul>
&lt;li>审计策略：审计的目标、范围、内容和频率&lt;/li>
&lt;li>审计分析：定期分析审计记录&lt;/li>
&lt;li>审计报告&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="13-审计的功能">1.3 审计的功能&lt;/h2>
&lt;p>审计功能包含以下3个部分：&lt;/p>
&lt;ol>
&lt;li>配置审计功能：日志存储策略等&lt;/li>
&lt;li>设置审计范围：设置哪类操作、哪类对象、..需要给设计&lt;/li>
&lt;li>生成审计日志：运行时，生成审计日志&lt;/li>
&lt;li>管理审计日志：查询，删除，归档审计日志&lt;/li>
&lt;/ol>
&lt;h2 id="14-oracle审计">1.4 oracle审计&lt;/h2>
&lt;p>oracle审计的发展：&lt;/p>
&lt;ul>
&lt;li>oracle 8i及更早：支持传统审计&lt;/li>
&lt;li>oracle 12c：新增支持统一审计&lt;/li>
&lt;li>oracle 23ai：不支持传统审计，仅支持统一审计&lt;/li>
&lt;/ul>
&lt;p>oracle统一审计的使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 设置审计范围：创建审计策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">AUDIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ap1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- privilege 子句，记录所有使用CreateTable, AlterUser权限的操作，oracle 12c中，支持256种权限
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ACTIONS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- aciton 子句，记录所有对表t1执行SELECT,INSERT,UPDATE的操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ROLES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- role 子句，记录所有使用r1角色的操作
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 启用审计策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">AUDIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ap1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 查看审计日志（完整日志）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">UNIFIED_AUDIT_TRAIL&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查看关键日志
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DBA_AUDIT_TRAIL&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- 其他：DBA_COMMON_AUDIT_TRAIL, DBA_AUDIT_SESSION, DBA_AUDIT_OBJECT, DBA_FGA_AUDIT_TRAIL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">os_username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">userhost&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">terminal&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">timestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">owner&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">action&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">action_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">------------+----------+----------+----------+-----------+-------+----------+--------+-------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">new_owner&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">new_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_privilege&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sys_privilege&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">admin_option&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grantee&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">audit_option&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ses_actions&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">----------+----------+---------------+---------------+--------------+---------+--------------+-------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">logoff_time&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_lread&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_pwrite&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logoff_dlock&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comment_text&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sessionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">entryid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">statementid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">returncode&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">-----------+--------------+---------------+--------------+--------------+-----------+---------+-------------+------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">priv_used&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">client_id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">econtext_id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">session_cpu&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">extended_timestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">proxy_sessionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">global_uid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">instance_number&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">-----------+-----------+-------------+-------------+--------------------+-----------------+------------+-----------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">os_process&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">transactionid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">scn&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sql_bind&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sql_text&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">obj_edition_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dbid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rls_info&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">current_user&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="c1">----------+---------------+-----+----------+----------+------------------+------+----------+--------------+
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中，可设置的权限、操作等范围如下：&lt;/p></description></item><item><title>openGauss 升级</title><link>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-upgrade/</link><pubDate>Thu, 06 Mar 2025 18:25:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-upgrade/</guid><description>&lt;p>virtCCA&lt;/p>
&lt;h1 id="1-升级的流程">1 升级的流程&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>升级分类：&lt;/p>
&lt;ul>
&lt;li>就地升级：暂停业务&lt;/li>
&lt;li>灰度升级：不暂停业务，一次升级所有节点&lt;/li>
&lt;li>节点升级：基于灰度升级，可升级部分节点&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>升级流程：（此处的命令是简化版命令，不能直接执行）&lt;/p>
&lt;ol>
&lt;li>
&lt;p>准备升级：检查安装包&lt;/p>
&lt;/li>
&lt;li>
&lt;p>开始升级：停止、启动集群，修改系统表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir new_pkg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_preinstall -X config.xml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_upgradectl -t auto-upgrade -X config.xml --grey
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>验证升级&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gsql -V
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gaussdb -V
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gsql -d postgres -p &lt;span class="m">5432&lt;/span> -c &lt;span class="s1">&amp;#39;select working_version_num();&amp;#39;&lt;/span> &lt;span class="c1"># 旧版本&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>提交升级&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gs_upgradectl -t commit-upgrade -X config.xml --grey
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>回滚升级&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gs_upgradectl -t auto-rollback -X config.xml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h1 id="2-升级的原理">2 升级的原理&lt;/h1>
&lt;h2 id="安装包">安装包&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="o">|&lt;/span>&lt;span class="c1">-- install
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- share
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- postgresql
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- postgresql.conf.sample
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- postgres.bki
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- system_views.sql
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- extension
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="c1">-- ...
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parseCommandLine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkParameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initGlobalInfos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initClusterInfo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UpgradeImplOLAP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Upgrade&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UpgradeImpl&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span> &lt;span class="c1"># UpgradeImpl.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initGlobalInfos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">commonCheck&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;auto_upgrade&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doGreyBinaryUpgrade&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">distributeXml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkUpgrade&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Check_Upgrade -t action -R oldapppath -l locallog -N newapppath -X config.xml&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doHealthCheck&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkClusterStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkConnection&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chooseUpgradeNodes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prepareGreyUpgrade&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">createBakPath&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;mkdir upgradeBackupPath&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initNodeStepInCsv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;touch upgrade_step.csv_bak&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initUpgradeProcessStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">recordNodeStepInplace&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">recordDirFile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;touch record_app_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">writeFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;oldClusterAppPath&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">copyBakVersion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;cp oldapppath/bin/upgrade_version upgradeBackupPath/upgrade_version&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">installNewBin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Install -t install_cluster -U user:group -R newapppath -P tmpdir -c clustername -l locallog -X config.cml -T -u&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpDolphinUpgradeScript&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;cp oldapppath/share/postgresql/extension/dolphin* newapppath/share/postgresql/extension/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prepareUpgradeSqlFolder&lt;/span> &lt;span class="c1"># catalog upgrade_sql.tar.gz, including guc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Upgrade_Utility -t prepare_upgrade_sql_folder -U user --upgrade_bak_path upgradeBackupPath -X config.xml -l locallog&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">updateCatalog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;cp upgradeBackupPath/upgrade_sql/ {upgrade-post, upgrade, rollback-post, rollback}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doUpgradeCatalog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setUpgradeFromParam&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;gs_guc set -Z cmagent -N all -I all -c upgrade_from=working_grand_version&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">reload_cm_proc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setUpgradeMode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">reloadCmAgent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">killKernalSnapshotThread&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">execRollbackUpgradedCatalog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;rollback&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">execRollbackUpgradedCatalog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;upgrade&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pgxcNodeUpdateLocalhost&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;upgrade&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rebuild_pg_proc_proname_args_nsp_new_index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upgradeAgain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">greySyncGuc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Upgrade_Utility -t grey_sync_guc -U user --upgrade_bak_path=upgradeBackupPath -l logcallog&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">greySyncGuc&lt;/span> &lt;span class="c1"># script/local/UpgradeUtility.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">readDeleteGuc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">greySyncInstanceGuc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">greyUpgradeSyncOldConfigToNew&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Upgrade_Utility -t grey_upgrade_config_sync -U user -V oldversionnumber --old_cluster_app_path=oldapppath --new_cluster_app_path=newapppath -l locallog&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">greyUpgradeSyncConfig&lt;/span> &lt;span class="c1"># 适配点, 参考 setUpradeModeGuc(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">getOneDNInst&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switchBin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Local_Upgrade_Utility -t switch_bin -U user -l localog -R new?oldapppath&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">restore_origin_disaster_user_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setNewVersionGuc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switchExistsProcess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_check_and_start_cluster&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;gs_om -t start&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">createCheckpoint&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switchDn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">waitClusterNormalDegrade&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doHealthCheck&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">waitClusterForNormal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">backupGlobalRelmapFile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printPrecommitBannervstart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="s1">&amp;#39;commit&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doGreyCommitUpgrade&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="参考">参考&lt;/h1>
&lt;ul>
&lt;li>opengauss om源码：&lt;a href="https://gitee.com/opengauss/openGauss-OM">https://gitee.com/opengauss/openGauss-OM&lt;/a>&lt;/li>
&lt;li>opengauss升级：&lt;a href="https://docs.opengauss.org/zh/docs/latest/docs/DatabaseOMGuide/upgrade.html">https://docs.opengauss.org/zh/docs/latest/docs/DatabaseOMGuide/upgrade.html&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>openGauss 身份认证 GUC参数</title><link>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-auth-guc/</link><pubDate>Fri, 28 Feb 2025 16:43:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-auth-guc/</guid><description>&lt;h1 id="1-身份认证">1 身份认证&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>身份认证&lt;br>
大部分数据库都支持基于口令的身份认证，以vastbase为例，身份认证的流程如下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>高权限用户创建新用户&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>数据库在&lt;code>pg_authid&lt;/code>系统表中存储用户以及密码的哈希&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolvalidbegin&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_authid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolname&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolvalidbegin&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rolpassword&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-------+---------+---------------+--------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">24576&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sha2565e3b533ca5db32acdffdb6aea03395af163ac3cfdc9ddb&lt;/span>&lt;span class="p">.......&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>数据库在&lt;code>pg_auth_history&lt;/code>系统表中存储密码创建时间&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">roloid&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">passwordtime&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_auth_history&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">oid&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">passwordtime&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">-------+-------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">24576&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2025&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">969642&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">08&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>新用户登录数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">gsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">postgres&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">U&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">u1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">W&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;u1.pass1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>数据库校验新用户信息：数据库接收用户建立连接的请求时，会进行一系列身份鉴别操作，包括：检查用户提供的密码与pg_authid中的值是否匹配，检查pg_auth_history中记录的密码生成日期与当前日期是否间隔较久等&lt;/p></description></item><item><title>mysql 1 安装mysql</title><link>https://my-blog.j8465383071.workers.dev/posts/database/mysql-install/</link><pubDate>Mon, 24 Feb 2025 11:24:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/mysql-install/</guid><description>&lt;h1 id="1-安装mysql">1 安装mysql&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># root&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum -y install wget cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum -y install cmake3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 普通用户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir mysql &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> mysql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.17.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf mysql-boost-8.0.17.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir backup &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> mv *.tar.gz backup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir install data boost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> mysql-boost*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cmake3 . -DCMAKE_INSTALL_PREFIX&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/../install -DMYSQL_DATADIR&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/../data -DSYSCONFDIR&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/../data -DMYSQL_TCP_PORT&lt;span class="o">=&lt;/span>&lt;span class="m">3306&lt;/span> -DWITH_BOOST&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/../boost &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>-DDEFAULT_CHARSET&lt;span class="o">=&lt;/span>utf8 -DDEFAULT_COLLATION&lt;span class="o">=&lt;/span>utf8_general_ci -DENABLED_LOCAL_INFILE&lt;span class="o">=&lt;/span>ON -DWITH_INNODB_MEMCACHED&lt;span class="o">=&lt;/span>ON -DWITH_INNOBASE_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> -DWITH_FEDERATED_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> -DWITH_BLACKHOLE_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> -DWITH_ARCHIVE_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> -DWITHOUT_EXAMPLE_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> -DWITH_PERFSCHEMA_STORAGE_ENGINE&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>openGauss 1 安装openGauss</title><link>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-1-install/</link><pubDate>Thu, 20 Feb 2025 14:06:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/opengauss-1-install/</guid><description>&lt;h1 id="1-安装wsl">1 安装wsl&lt;/h1>
&lt;p>请自行在网上了解wsl是什么，以及如何在wsl中安装centos 7：&lt;/p>
&lt;ol>
&lt;li>在windows 11中，启用wsl&lt;/li>
&lt;li>下载centos 7的wsl 安装包&lt;/li>
&lt;li>在wsl中，安装centos 7&lt;/li>
&lt;li>进入centos 7，创建普通用户，建议使用mobaxterm直接登录wsl中的centos系统&lt;/li>
&lt;li>配置centos 7的yum源&lt;/li>
&lt;/ol>
&lt;h1 id="2-准备环境">2 准备环境&lt;/h1>
&lt;ol>
&lt;li>
&lt;p>下载opengauss源码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git clone -b master git@gitee.com:opengauss/openGauss-server.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>下载第三方库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc10.3/openGauss-third_party_binarylibs_Centos7.6_x86_64.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>解压第三方库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 解压压缩包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf openGauss-third*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 归档压缩包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir tmp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv *.tar.gz tmp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重命名压缩包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv openGauss-third* third
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>下载依赖库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">yum install -y libaio-devel flex bison ncurses-devel patch readline-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 单独安装 glibc-devel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum install glibc-devel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果报错，提示安装了.i686版本的glibc-devel，则修改yum配置文件：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#34;exclude=*.i686&amp;#34; &amp;gt;&amp;gt; /etc/yum.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果报错，提示glibc-devel与glibc-common不匹配，则降级glibc和glibc-common&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># yum downgrade glibc glibc-devel glibc-common glibc-headers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 降级后，再重新安装 glibc-devel 即可&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># yum install glibc-devel&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>设置环境变量&lt;br>
首先，请确保目录结构如下：&lt;/p></description></item><item><title>Oracle 1 SQL</title><link>https://my-blog.j8465383071.workers.dev/posts/database/oracle-2-sql/</link><pubDate>Thu, 20 Feb 2025 14:06:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/oracle-2-sql/</guid><description>&lt;h1 id="1-oracle-集群管理">1 Oracle 集群管理&lt;/h1>
&lt;h2 id="12-登录数据库">1.2 登录数据库&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sqlplus / as sysdba
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-oracle-语法">2 Oracle 语法&lt;/h1>
&lt;h2 id="21-数据类型">2.1 数据类型&lt;/h2>
&lt;p>仅列举常见数据类型：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>大类&lt;/th>
&lt;th>类型&lt;/th>
&lt;th>解释&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>数值&lt;/td>
&lt;td>INT or INTGER&lt;/td>
&lt;td>整数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>NUMBESR(p, s)&lt;/td>
&lt;td>p: 精度，整数和小数总位数，s: 小数位数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>SMALLINT&lt;/td>
&lt;td>等于 NUMBESR(38)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>FLOAT(p)&lt;/td>
&lt;td>浮点数，p: 二进制精度，最大126&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>字符&lt;/td>
&lt;td>CHAR(n)&lt;/td>
&lt;td>固定长度字符，n: 长度，不足n用空格填充&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>VARCHAR2(n)&lt;/td>
&lt;td>可变长度字符，n: 最大长度，最大4000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>时间&lt;/td>
&lt;td>DATE&lt;/td>
&lt;td>日期&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>TIMESTAMP&lt;/td>
&lt;td>日期和时间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>二进制&lt;/td>
&lt;td>CLOB&lt;/td>
&lt;td>长文本数据&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="22-常用sql">2.2 常用SQL&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>常见语法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 创建表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 插入数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abcc&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ddee&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 查询数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 更新数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abbc&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 删除数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 6 删除表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>内置函数&lt;/p></description></item><item><title>Vastbase</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vastbase/</link><pubDate>Thu, 20 Feb 2025 14:06:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vastbase/</guid><description>&lt;h1 id="1-准备开发环境">1 准备开发环境&lt;/h1>
&lt;h2 id="11-登录远程windows">1.1 登录远程windows&lt;/h2>
&lt;ol>
&lt;li>连接vpn&lt;br>
下载vpn软件，使用入职时他人帮忙申请的vpn账号登录&lt;/li>
&lt;li>登录远程windows电脑&lt;br>
使用入职时他人帮忙申请的远程windows账号&lt;/li>
&lt;li>登录gitlab&lt;br>
入职时，有人已帮忙申请gutlab账号。&lt;a href="http://172.16.19.246/">http://172.16.19.246&lt;/a>&lt;/li>
&lt;li>查看vastbase代码&lt;br>
&lt;a href="http://172.16.19.246/VastbaseG100/src">http://172.16.19.246/VastbaseG100/src&lt;/a>
&lt;ul>
&lt;li>默认无权限，可能搜不到，请找小组领导开通权限&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="12-准备vastbase编译环境">1.2 准备vastbase编译环境&lt;/h2>
&lt;p>在远程windows中，登录远程centos&lt;/p>
&lt;ol>
&lt;li>
&lt;p>配置git&lt;br>
生成rsa密钥，配置到gitlab中&lt;/p>
&lt;/li>
&lt;li>
&lt;p>下载vastbase源码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone -b master git@172.16.19.246:VastbaseG100/src.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>下载vastbase依赖的二进制文件&lt;br>
需要自行通过svn下载，然后，上传到vastbase源码同级目录&lt;/p>
&lt;ul>
&lt;li>ip: 172.16.19.4&lt;/li>
&lt;li>用户名: clouder&lt;/li>
&lt;li>密码: 自行询问&lt;/li>
&lt;li>目录: /Database/Vastbase/third_party&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>配置用于编译vastbase的环境变量&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch venv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>请确保此时的目录结构如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ls g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>-- g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- src
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- binarylibs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- venv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>设置环境变量，在venv文件中，输入以下内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CODE_BASE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">BINARYLIBS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/binarylibs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装目录在源码里写死了，改不了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">GAUSSHOME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/src/mppdb_temp_install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">GCC_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$BINARYLIBS&lt;/span>/buildtools/gcc7.3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CC&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin/gcc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CXX&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin/g++
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">LD_LIBRARY_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GAUSSHOME&lt;/span>/lib:&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/lib64:&lt;span class="nv">$GCC_PATH&lt;/span>/isl/lib:&lt;span class="nv">$GCC_PATH&lt;/span>/mpc/lib/:&lt;span class="nv">$GCC_PATH&lt;/span>/mpfr/lib/:&lt;span class="nv">$GCC_PATH&lt;/span>/gmp/lib/:&lt;span class="nv">$LD_LIBRARY_PATH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GAUSSHOME&lt;/span>/bin:&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin:&lt;span class="nv">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 以下是vastbase增加的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$BINARYLIBS&lt;/span>/buildtools/cmake/bin:&lt;span class="nv">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>配置快捷命令&lt;/p></description></item><item><title>vastbase 身份认证</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-auth/</link><pubDate>Mon, 17 Feb 2025 14:43:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-auth/</guid><description>&lt;h1 id="国策用例">国策用例&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4、配置客户端认证方式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hostssl all all 0.0.0.0/0 cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1、生成国密证书
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">创建 CA 目录 cadir 并进入
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir cadir
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadir
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">copy 配置文件 openssl.cnf 到当前目录（不同环境，配置文件路径可能不一样）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp /etc/pki/tls/openssl.cnf .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">开始搭建CA环境
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">777&lt;/span> ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">创建serial文件,写入01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;01&amp;#39;&lt;/span>&amp;gt;./demoCA/serial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">创建文件index.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch ./demoCA/index.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">修改openssl.cnf配置文件中CA_default的参数
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">dir&lt;/span> &lt;span class="o">=&lt;/span> ./demoCA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">default_md&lt;/span> &lt;span class="o">=&lt;/span> sha256
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">至此CA环境搭建完成
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成CA私钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out demoCA/private/cakey.pem -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成根证书请求文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -key demoCA/private/cakey.pem -new -out cacert.req -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>VAST/OU&lt;span class="o">=&lt;/span>SEC/CN&lt;span class="o">=&lt;/span>CLIENT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成自签发根证书
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成根证书时，需要修改openssl.cnf文件，设置basicConstraints&lt;span class="o">=&lt;/span>CA:TRUE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成CA自签发根证书
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in cacert.req -keyfile demoCA/private/cakey.pem -selfsign -out demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成服务器私钥文件server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out server.key -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成服务器证书请求文件server.req
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -key server.key -new -out server.req -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>VAST/OU&lt;span class="o">=&lt;/span>SEC/CN&lt;span class="o">=&lt;/span>server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成服务端/客户端证书时，修改openssl.cnf文件，设置basicConstraints&lt;span class="o">=&lt;/span>CA:FALSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">对生成的服务器证书请求文件进行签发，签发后将生成正式的服务器证书server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in server.req -out server.crt -days &lt;span class="m">3650&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成客户端私钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out client.key -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成客户端证书请求文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key client.key -out client.req -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>VAST/OU&lt;span class="o">=&lt;/span>SEC/CN&lt;span class="o">=&lt;/span>client
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">对生成的客户端证书请求文件进行签发，签发后将生成正式的客户端证书client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in client.req -out client.crt -days &lt;span class="m">3650&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">注：中间会产生交互，按照以下内容进行填写（需注意每个交互的common name填不一样的内容，如分别写：test1,test2,test3）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Country Name &lt;span class="o">(&lt;/span>&lt;span class="m">2&lt;/span> letter code&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>AU&lt;span class="o">]&lt;/span>:CN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">State or Province Name &lt;span class="o">(&lt;/span>full name&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>Some-State&lt;span class="o">]&lt;/span>:shanxi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Locality Name &lt;span class="o">(&lt;/span>eg, city&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:xian
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Organization Name &lt;span class="o">(&lt;/span>eg, company&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>Internet Widgits Pty Ltd&lt;span class="o">]&lt;/span>:Abc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Organizational Unit Name &lt;span class="o">(&lt;/span>eg, section&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:hello
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--Common Name可以随意命名
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Common Name &lt;span class="o">(&lt;/span>eg, YOUR name&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:world
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--Email可以选择性填写
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Email Address &lt;span class="o">[]&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Please enter the following &lt;span class="s1">&amp;#39;extra&amp;#39;&lt;/span> attributes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">to be sent with your certificate request
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A challenge password &lt;span class="o">[]&lt;/span>: 1qaz!QAZ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">An optional company name &lt;span class="o">[]&lt;/span>:world
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ---------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://gitee.com/opengauss/openGauss-server/pulls/3254
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir certs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp ../../tassl/tassl_demo/cert/openssl.cnf certs/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> certs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#CA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out CA.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>YUNHEENMO/OU&lt;span class="o">=&lt;/span>MogDB/CN&lt;span class="o">=&lt;/span>FooCA -key CA.key -out CA.csr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -sm3 -req -days &lt;span class="m">1500&lt;/span> -in CA.csr -extfile openssl.cnf -extensions v3_ca -signkey CA.key -out CA.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>YUNHEENMO/OU&lt;span class="o">=&lt;/span>MogDB/CN&lt;span class="o">=&lt;/span>server -key server.key -out server.csr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -sm3 -req -days &lt;span class="m">1500&lt;/span> -in server.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out server.crt -CAcreateserial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#server_enc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out server_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>YUNHEENMO/OU&lt;span class="o">=&lt;/span>MogDB/CN&lt;span class="o">=&lt;/span>server -key server_enc.key -out server_enc.csr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -sm3 -req -days &lt;span class="m">1500&lt;/span> -in server_enc.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out server_enc.crt -CAcreateserial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#client&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>YUNHEENMO/OU&lt;span class="o">=&lt;/span>MogDB/CN&lt;span class="o">=&lt;/span>client -key client.key -out client.csr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -sm3 -req -days &lt;span class="m">1500&lt;/span> -in client.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out client.crt -CAcreateserial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#client_enc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -genkey -name SM2 -out client_enc.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -subj /C&lt;span class="o">=&lt;/span>CN/ST&lt;span class="o">=&lt;/span>BJ/L&lt;span class="o">=&lt;/span>HaiDian/O&lt;span class="o">=&lt;/span>YUNHEENMO/OU&lt;span class="o">=&lt;/span>MogDB/CN&lt;span class="o">=&lt;/span>client -key client_enc.key -out client_enc.csr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -sm3 -req -days &lt;span class="m">1500&lt;/span> -in client_enc.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out client_enc.crt -CAcreateserial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#修改权限&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">0600&lt;/span> *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#增加密码保护&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -sm4 -in server.key -out server.key -passout pass:123qweQWE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S 123qweQWE -D ./ -o server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -sm4 -in server_enc.key -out server_enc.key -passout pass:234werWER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S 234werWER -D ./ -o server_enc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -sm4 -in client.key -out client.key -passout pass:345ertERT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S 345ertERT -D ./ -o client
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ec -sm4 -in client_enc.key -out client_enc.key -passout pass:456rtyRTY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc generate -S 456rtyRTY -D ./ -o client_enc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">0600&lt;/span> *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#客户端：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CERT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export CERT=`pwd`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLMODE=verify-ca
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLTLCP=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLROOTCERT=$CERT/CA.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLKEY=$CERT/client.key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLCERT=$CERT/client.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLENCKEY=$CERT/client_enc.key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">export PGSSLENCCERT=$CERT/client_enc.crt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&lt;/span> &amp;gt; client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> client_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#服务器：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_ciphers = &amp;#39;ALL&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_use_tlcp=on&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_ca_file = &amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/CA.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_key_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.key&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_cert_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_enc_key_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server_enc.key&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$GAUSSHOME&lt;/span>/data -c &lt;span class="s2">&amp;#34;ssl_enc_cert_file=&amp;#39;&lt;/span>&lt;span class="nv">$CERT&lt;/span>&lt;span class="s2">/server_enc.crt&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1、生成国密证书
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建 CA 目录 cadir 并进入&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># copy 配置文件 openssl.cnf 到当前目录（不同环境，配置文件路径可能不一样）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp /etc/pki/tls/openssl.cnf .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 开始搭建CA环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">777&lt;/span> ./demoCA/private
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建serial文件,写入01&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;01&amp;#39;&lt;/span>&amp;gt;./demoCA/serial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建文件index.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch ./demoCA/index.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 至此CA环境搭建完成&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成CA私钥&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out demoCA/private/cakey.pem -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成根证书请求文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -key demoCA/private/cakey.pem -new -out cacert.req
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成自签发根证书&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成根证书时，需要修改openssl.cnf文件，设置basicConstraints=CA:TRUE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成CA自签发根证书&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in cacert.req -keyfile demoCA/private/cakey.pem -selfsign -out demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成服务器私钥文件server.key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out server.key -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成服务器证书请求文件server.req&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -key server.key -new -out server.req
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成服务端/客户端证书时，修改openssl.cnf文件，设置basicConstraints=CA:FALSE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi openssl.cnf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 对生成的服务器证书请求文件进行签发，签发后将生成正式的服务器证书server.crt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in server.req -out server.crt -days &lt;span class="m">3650&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成客户端私钥&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ecparam -out client.key -name SM2 -genkey
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成客户端证书请求文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl req -config openssl.cnf -new -key client.key -out client.req
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 对生成的客户端证书请求文件进行签发，签发后将生成正式的客户端证书client.crt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl ca -config openssl.cnf -in client.req -out client.crt -days &lt;span class="m">3650&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 注：中间会产生交互，按照以下内容进行填写（需注意每个交互的common name填不一样的内容，如分别写：test1,test2,test3）：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Country Name &lt;span class="o">(&lt;/span>&lt;span class="m">2&lt;/span> letter code&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>AU&lt;span class="o">]&lt;/span>:CN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">State or Province Name &lt;span class="o">(&lt;/span>full name&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>Some-State&lt;span class="o">]&lt;/span>:shanxi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Locality Name &lt;span class="o">(&lt;/span>eg, city&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:xian
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Organization Name &lt;span class="o">(&lt;/span>eg, company&lt;span class="o">)&lt;/span> &lt;span class="o">[&lt;/span>Internet Widgits Pty Ltd&lt;span class="o">]&lt;/span>:Abc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Organizational Unit Name &lt;span class="o">(&lt;/span>eg, section&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:hello
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--Common Name可以随意命名
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Common Name &lt;span class="o">(&lt;/span>eg, YOUR name&lt;span class="o">)&lt;/span> &lt;span class="o">[]&lt;/span>:world
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--Email可以选择性填写
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Email Address &lt;span class="o">[]&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Please enter the following &lt;span class="s1">&amp;#39;extra&amp;#39;&lt;/span> attributes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">to be sent with your certificate request
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A challenge password &lt;span class="o">[]&lt;/span>: 1qaz!QAZ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">An optional company name &lt;span class="o">[]&lt;/span>:world
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2、配置客户端文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> client.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> client.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> ./demoCA/cacert.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> server.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">600&lt;/span> server.crt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3、配置服务器端参数
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp server.crt server.key ./demoCA/cacert.pem &lt;span class="nv">$PGDATA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp client.crt client.key /home/vastbase/data/vastbase/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PGSSLCERT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/home/vastbase/cadir/client.crt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PGSSLKEY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/home/vastbase/cadir/client.key&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PGSSLMODE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;verify-ca&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PGSSLROOTCERT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/home/vastbase/data/vastbase/cacert.pem&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ssl&lt;/span> &lt;span class="o">=&lt;/span> on
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">require_ssl&lt;/span> &lt;span class="o">=&lt;/span> on
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ssl_cert_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;server.crt&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ssl_key_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;server.key&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ssl_ca_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;cacert.pem&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ssl_crl_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4、配置客户端认证方式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hostssl all all 0.0.0.0/0 cert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5、重启数据库服务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql - vastbase -r
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--创建生成客户端证书时Common Name同名用户
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">create user test3 password&lt;span class="s1">&amp;#39;Test@123&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1、客户端vsql连接到服务端
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vsql -dvastbase -r -h IP -U test3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--预期
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">连接成功，提示SSL connection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="1-需求背景">1 需求背景&lt;/h1>
&lt;h2 id="12-oracle-profile功能">1.2 Oracle Profile功能&lt;/h2>
&lt;h3 id="一查看profile信息">一、查看profile信息&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>设置sqlplus输出格式&lt;/p></description></item><item><title>vastbase 加密函数</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-encrypt/</link><pubDate>Sun, 09 Feb 2025 16:10:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-encrypt/</guid><description>&lt;h1 id="1-需求背景">1 需求背景&lt;/h1>
&lt;h2 id="11-数据加密背景">1.1 数据加密背景&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>加密的原理&lt;br>
不同场景中，适合的加密算法类型不同。对存储数据加密，通常采用对称密码算法，此处主要介绍对称密码算法：&lt;/p>
&lt;ul>
&lt;li>加密原理：输入1个明文，输入1个密钥，对明文和密钥进行一些运算（比如异或，代换），可得到1个密文。密钥通常是随机生成的。&lt;/li>
&lt;li>加密算法：DES算法，发布于1977年，已确定为不安全加密算法。3DES算法，调用3次DES算法，生成3个密钥，安全性与DES差别不大，也属于不安全的加密算法。AES算法，发布于2001年，通用的国际标准&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>数据库加密函数&lt;br>
几乎所有数据库，都提供内置加密函数，让用户通过SQL语句调用。最典型的场景如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 假设，数据库提供函数encrypt(明文，密钥，加密算法)，输出为密文
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 用户想表&amp;#39;t1&amp;#39;中存储数据&amp;#39;shenkun&amp;#39;，则存储的语法如下：（用户自己保管密钥）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;shenkun&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;一串随机的密钥&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aes&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="12-oracle-加密包">1.2 oracle 加密包&lt;/h2>
&lt;p>早期版本的oracle中，包含1个名为dbms_obfuscation_toolkit的包，提供7个函数，主要实现加密、解密等功能：&lt;/p>
&lt;ul>
&lt;li>版本信息：oracle 8i版本开始提供，oracle 10g版本开始不被推荐使用，由dbms_crypto代替，oracle 21c版本正式移除&lt;/li>
&lt;li>函数列表：
&lt;ul>
&lt;li>生成随机数：desgetkey(seed) -&amp;gt; key&lt;/li>
&lt;li>加密：desencrypt(input, key) -&amp;gt; encrypted_data&lt;/li>
&lt;li>解密：descdecrypt(input, key) -&amp;gt; decrypted_data&lt;/li>
&lt;li>生成随机数：des3getkey(which=&amp;gt;0, seed) -&amp;gt; key&lt;/li>
&lt;li>加密：des3encrypt(input, key, which=&amp;gt;0, iv=&amp;gt;012345678abcdef) -&amp;gt; encrypted_data&lt;/li>
&lt;li>解密：des3decrypt(input, key, which=&amp;gt;0, iv=&amp;gt;012345678abcdef) -&amp;gt; decrypted_data&lt;/li>
&lt;li>哈希：md5(input) -&amp;gt; checksum&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>函数参数：函数参数有3种数据类型：varchar2, raw。与raw类型相比，如果是varchar2类型，参数名需加上_string后缀。比如，raw类型的入参名为input，则varcha2类型入参名为input_string&lt;/li>
&lt;li>函数限制：
&lt;ul>
&lt;li>desgetkey：seed长度最短为80字节&lt;/li>
&lt;li>desencrypt：input长度是8字节的整数倍；key最短为8字节，超过8字节的部分被丢弃&lt;/li>
&lt;li>descdecrypt：input长度是8字节的整数倍；key最短为8字节，超过8字节的部分被丢弃&lt;/li>
&lt;li>des3getkey: seed长度最短为80字节&lt;/li>
&lt;li>des3encrypt：input长度是8字节的整数倍；which为0时，key最短为16字节，超过16字节的部分被丢弃；which为1时，key最短为24字节，超过24字节的部分被丢弃&lt;/li>
&lt;li>des3dencrypt：input长度是8字节的整数倍；which为0时，key最短为16字节，超过16字节的部分被丢弃；which为1时，key最短为24字节，超过24字节的部分被丢弃&lt;/li>
&lt;li>md5：无&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>参考文档
&lt;ul>
&lt;li>函数介绍：函数背景、注意事项等：&lt;a href="https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm">https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm&lt;/a>&lt;/li>
&lt;li>函数参数：参数类型、调用示例等：&lt;a href="https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm">https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下是上述函数的调用示例：&lt;/p></description></item><item><title>Vastbase 搭建环境、编译代码、安装数据库</title><link>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-build/</link><pubDate>Sat, 08 Feb 2025 16:44:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/vastbase-build/</guid><description>&lt;h1 id="1-准备开发环境">1 准备开发环境&lt;/h1>
&lt;h2 id="11-登录远程windows">1.1 登录远程windows&lt;/h2>
&lt;ol>
&lt;li>连接vpn&lt;br>
下载vpn软件，使用入职时他人帮忙申请的vpn账号登录&lt;/li>
&lt;li>登录远程windows电脑&lt;br>
使用入职时他人帮忙申请的远程windows账号&lt;/li>
&lt;li>登录gitlab&lt;br>
入职时，有人已帮忙申请gutlab账号。&lt;a href="http://172.16.19.246/">http://172.16.19.246&lt;/a>&lt;/li>
&lt;li>查看vastbase代码&lt;br>
&lt;a href="http://172.16.19.246/VastbaseG100/src">http://172.16.19.246/VastbaseG100/src&lt;/a>
&lt;ul>
&lt;li>默认无权限，可能搜不到，请找小组领导开通权限&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="12-准备vastbase编译环境">1.2 准备vastbase编译环境&lt;/h2>
&lt;p>在远程windows中，登录远程centos&lt;/p>
&lt;ol>
&lt;li>
&lt;p>配置git&lt;br>
生成rsa密钥，配置到gitlab中&lt;/p>
&lt;/li>
&lt;li>
&lt;p>下载vastbase源码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone -b master git@172.16.19.246:VastbaseG100/src.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>下载vastbase依赖的二进制文件&lt;br>
需要自行通过svn下载，然后，上传到vastbase源码同级目录&lt;br>
在文件管理器中，输出&lt;code>ftp://172.16.19.4&lt;/code>后，会提示输出账号和密码&lt;/p>
&lt;ul>
&lt;li>ip: 172.16.19.4&lt;/li>
&lt;li>用户名: clouder&lt;/li>
&lt;li>密码: 自行询问&lt;/li>
&lt;li>目录: /Database/Vastbase/third_party&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>配置用于编译vastbase的环境变量&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch venv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>请确保此时的目录结构如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ls g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>-- g100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- src
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- binarylibs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>-- venv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>设置环境变量&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CODE_BASE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">BINARYLIBS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/binarylibs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装目录在源码里写死了，改不了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">GAUSSHOME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="sb">`&lt;/span>/src/mppdb_temp_install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">GCC_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$BINARYLIBS&lt;/span>/buildtools/gcc7.3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CC&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin/gcc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">CXX&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin/g++
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">LD_LIBRARY_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GAUSSHOME&lt;/span>/lib:&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/lib64:&lt;span class="nv">$GCC_PATH&lt;/span>/isl/lib:&lt;span class="nv">$GCC_PATH&lt;/span>/mpc/lib/:&lt;span class="nv">$GCC_PATH&lt;/span>/mpfr/lib/:&lt;span class="nv">$GCC_PATH&lt;/span>/gmp/lib/:&lt;span class="nv">$LD_LIBRARY_PATH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$GAUSSHOME&lt;/span>/bin:&lt;span class="nv">$GCC_PATH&lt;/span>/gcc/bin:&lt;span class="nv">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 以下是vastbase增加的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$BINARYLIBS&lt;/span>/buildtools/cmake/bin:&lt;span class="nv">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>配置快捷命令&lt;/p></description></item><item><title>Oracle 安全特性</title><link>https://my-blog.j8465383071.workers.dev/posts/database/oracle-security/</link><pubDate>Fri, 07 Feb 2025 11:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/oracle-security/</guid><description>&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;ul>
&lt;li>
&lt;p>来源：&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg">https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>基础安全&lt;/p>
&lt;ul>
&lt;li>身份认证
&lt;ul>
&lt;li>密码最小长度&lt;/li>
&lt;li>连续失败锁定&lt;/li>
&lt;li>账户锁定&lt;/li>
&lt;li>新旧密码重复&lt;/li>
&lt;li>密码有效期&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>访问控制&lt;/li>
&lt;li>敏感数据发现&lt;/li>
&lt;li>传输加密&lt;/li>
&lt;li>安全审计&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>高级安全&lt;/p>
&lt;ul>
&lt;li>透明加密&lt;/li>
&lt;li>数据脱敏&lt;/li>
&lt;li>访问控制
&lt;ul>
&lt;li>行级访问控制&lt;/li>
&lt;li>数据库保险柜：细粒度访问控制&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Oracle 基本介绍</title><link>https://my-blog.j8465383071.workers.dev/posts/database/oracle-overview/</link><pubDate>Sat, 25 Jan 2025 11:24:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/oracle-overview/</guid><description>&lt;h1 id="1-oracle-集群管理">1 Oracle 集群管理&lt;/h1>
&lt;h2 id="12-登录数据库">1.2 登录数据库&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sqlplus / as sysdba
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="2-oracle-语法">2 Oracle 语法&lt;/h1>
&lt;h2 id="21-数据类型">2.1 数据类型&lt;/h2>
&lt;p>仅列举常见数据类型：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>大类&lt;/th>
&lt;th>类型&lt;/th>
&lt;th>解释&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>数值&lt;/td>
&lt;td>INT or INTGER&lt;/td>
&lt;td>整数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>NUMBESR(p, s)&lt;/td>
&lt;td>p: 精度，整数和小数总位数，s: 小数位数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>SMALLINT&lt;/td>
&lt;td>等于 NUMBESR(38)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>FLOAT(p)&lt;/td>
&lt;td>浮点数，p: 二进制精度，最大126&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>字符&lt;/td>
&lt;td>CHAR(n)&lt;/td>
&lt;td>固定长度字符，n: 长度，不足n用空格填充&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>VARCHAR2(n)&lt;/td>
&lt;td>可变长度字符，n: 最大长度，最大4000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>时间&lt;/td>
&lt;td>DATE&lt;/td>
&lt;td>日期&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>-&lt;/td>
&lt;td>TIMESTAMP&lt;/td>
&lt;td>日期和时间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>二进制&lt;/td>
&lt;td>CLOB&lt;/td>
&lt;td>长文本数据&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="22-常用sql">2.2 常用SQL&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>常见语法&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 创建表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">VARCHAR2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 插入数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abcc&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ddee&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 查询数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 更新数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abbc&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 删除数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 6 删除表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>内置函数&lt;/p></description></item><item><title>工具 配置新环境</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/new-machine/</link><pubDate>Fri, 24 Jan 2025 16:14:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/new-machine/</guid><description>&lt;ol start="0">
&lt;li>
&lt;p>设置bash&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PS1&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;[\e[35;1m][\$(date +&amp;#39;%m-%d/%H:%M:%S&amp;#39;)][\e[36;1m]\w [\e[0m]\n&amp;gt; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>安装code-servels&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://blog.zhaokeyong.cn/archives/CentOScode-server">https://blog.zhaokeyong.cn/archives/CentOScode-server&lt;/a>&lt;br>
安装3.4版本，方便&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1 从本地机器上，找到code-server所在文件夹&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/shenkun/vscode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir allpkg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 放插件的目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ~/.local allpkg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r ./code-server allpkg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zcvf allpkg.tar.gz allpkg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/shenkun/vscode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf allpkg.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv allpkg/code-server ./
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf ~/.local/share/code-server/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv allpkg/.local/share/code-server/* ~/.local/share/code-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nohup ./code-server &lt;span class="p">&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi ~/.config/code-server/config.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bind-addr: 0.0.0.0:3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">auth: password
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">password: password
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cert: &lt;span class="nb">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nohup ./code-server &lt;span class="p">&amp;amp;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常用插件：&lt;/p>
&lt;/li>
&lt;li>
&lt;p>c/c++&lt;/p>
&lt;/li>
&lt;li>
&lt;p>gitlens&lt;/p>
&lt;/li>
&lt;li>
&lt;p>markdown preview enhanced&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>安装 oracle&lt;/p></description></item><item><title>kkdb 1 预览</title><link>https://my-blog.j8465383071.workers.dev/posts/projects/kkdb-1-preview/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projects/kkdb-1-preview/</guid><description>&lt;h1 id="1-基本介绍">1 基本介绍&lt;/h1>
&lt;h2 id="要求">要求&lt;/h2>
&lt;ul>
&lt;li>数据库基本原理&lt;/li>
&lt;li>C语言&lt;/li>
&lt;li>数据结构&lt;/li>
&lt;li>操作系统&lt;/li>
&lt;/ul>
&lt;h2 id="数据存储需求">数据存储需求&lt;/h2>
&lt;h2 id="数据存储方案">数据存储方案&lt;/h2>
&lt;ul>
&lt;li>文件&lt;/li>
&lt;li>excel&lt;/li>
&lt;li>数据库&lt;/li>
&lt;/ul>
&lt;h1 id="2-kkdb">2 kkdb&lt;/h1>
&lt;h2 id="成果展示">成果展示&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>初始化&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 系统表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sys_class: 存储所有表
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sys_attr: 存储所有列
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dbinit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls ~/dbdata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>基本语法&lt;/p>
&lt;ul>
&lt;li>
&lt;p>CREATE&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">输入：CREATE TABLE t1 &lt;span class="o">(&lt;/span>c1 INT, c2 TEXT&lt;span class="o">)&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">语法解析：表名、列名、列数据类型
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">系统表：存储表信息、列信息
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">表文件：创建文件
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>INSERT&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">输入：INSERT INTO t1 VALUES &lt;span class="o">(&lt;/span>1, &lt;span class="s1">&amp;#39;first&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">语法解析：表名、列数据
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">数据处理：封装数据
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">表文件：写入数据
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>SELECT&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">输入：SELECT * FROM t1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">语法解析：表名、列
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">表文件：读取数据
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">数据处理：解析数据
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>UPDATE&lt;/p>
&lt;/li>
&lt;li>
&lt;p>DELETE&lt;/p>
&lt;/li>
&lt;li>
&lt;p>DROP&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>并发访问&lt;/p>
&lt;ul>
&lt;li>
&lt;p>CS模式&lt;/p>
&lt;ul>
&lt;li>
&lt;p>服务器&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">dbserver start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>客户端&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">dbclient 127.0.0.1 &lt;span class="m">8888&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SELECT * FROM t1&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>服务器多线程&lt;/p></description></item><item><title>tool.flex.词法解析工具</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/flex/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/flex/</guid><description>&lt;p>目录：&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-%E6%A6%82%E8%BF%B0">1 概述&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-flex">2 flex&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83%EF%BC%9A">参考：&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;p>&lt;strong>需求&lt;/strong>&lt;br>
判断字符串，是否满足规定的规则。&lt;/p>
&lt;p>&lt;strong>示例&lt;/strong>&lt;br>
字符串：&lt;/p>
&lt;blockquote>
&lt;p>‘abc’, ‘a1’, ‘a+’, …&lt;/p>&lt;/blockquote>
&lt;p>规则：&lt;/p>
&lt;blockquote>
&lt;p>字符串中只包含字母&lt;/p>&lt;/blockquote>
&lt;p>编码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* 省略 */&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>问题：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>复杂性&lt;/strong>：在字符串较长，规则繁多时，判断逻辑将会很复杂，编码工作量大&lt;/p>&lt;/blockquote>
&lt;p>方案：&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>通过通用的&lt;strong>正则表达式&lt;/strong>制定规则&lt;/li>
&lt;li>通过很多开源或非开源的词法解析工具，实现判断逻辑。&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;p>正则表达式：&lt;/p>
&lt;blockquote>
&lt;p>[a-zA-Z]+ ： 字符串中只包含字母&lt;/p>&lt;/blockquote>
&lt;p>如此，我们仅需简单制定正则表达式，通过第三方词法解析工具实现判断逻辑。&lt;/p>
&lt;h1 id="2-flex">2 flex&lt;/h1>
&lt;p>&lt;strong>1 词法解析&lt;/strong>&lt;br>
词法解析工具有很多，本文仅介绍flex。&lt;br>
flex编写的规则文件，后缀为.l&lt;/p>
&lt;p>&lt;strong>2 编译流程&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;ol>
&lt;li>编写 [规则.l] 文件&lt;/li>
&lt;li>通过flex，将 [规则.l] 文件，转换为 [规则.c] 文件&lt;/li>
&lt;li>将 [规则.c] 文件，以其他文件一起，正常编译即可&lt;/li>
&lt;/ol>&lt;/blockquote>
&lt;p>&lt;strong>3 文件格式&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="o">%&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* include */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">%&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* define */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">%%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">rule&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nf">code&lt;/span>&lt;span class="p">();}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">%%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">usercode&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">yylex&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>4 正则表达式&lt;/strong>&lt;br>
&lt;strong>单字符&lt;/strong>&lt;/p></description></item><item><title>tool.markdown.轻量级语言语法</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/markdown/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/markdown/</guid><description>&lt;blockquote>
&lt;p>说明：原始markdow语法见本文底部&lt;/p>&lt;/blockquote>
&lt;p>目录：&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1">标题：1&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1-1">标题：1.1&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1-1-1">标题：1.1.1&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1-1-1-1">标题：1.1.1.1&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1-1-1-1-1">标题：1.1.1.1.1&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E6%A0%87%E9%A2%98%EF%BC%9A1-1-1-1-1-1">标题：1.1.1.1.1.1&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;p>加粗：&lt;strong>test&lt;/strong>&lt;br>
横线：&lt;del>test&lt;/del>&lt;br>
斜体：&lt;em>test&lt;/em>&lt;/p>
&lt;h1 id="标题1">标题：1&lt;/h1>
&lt;h2 id="标题11">标题：1.1&lt;/h2>
&lt;h3 id="标题111">标题：1.1.1&lt;/h3>
&lt;h4 id="标题1111">标题：1.1.1.1&lt;/h4>
&lt;h5 id="标题11111">标题：1.1.1.1.1&lt;/h5>
&lt;h6 id="标题111111">标题：1.1.1.1.1.1&lt;/h6>
&lt;p>$~~$缩进&lt;/p>
&lt;p>节点：&lt;/p>
&lt;ul>
&lt;li>a&lt;/li>
&lt;li>b
&lt;ul>
&lt;li>ba&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>序号：&lt;/p>
&lt;ol>
&lt;li>a&lt;/li>
&lt;li>b
&lt;ol>
&lt;li>c&lt;/li>
&lt;li>d&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;p>分割线&lt;/p>
&lt;hr>
&lt;p>链接：&lt;a href="http://www.baidu.com/" title="点我">点我&lt;/a>&lt;/p>
&lt;p>链接：&lt;a href="http://www.baidu.com/">[id]&lt;/a>&lt;br>
something&lt;br>
something&lt;/p>
&lt;p>图片：&lt;code>[![desc](/path/to/img.png)](http://www.baidu.com/ &amp;quot;desc&amp;quot;)&lt;/code>&lt;/p>
&lt;p>引用：&lt;/p>
&lt;blockquote>
&lt;p>line 1&lt;br>
line 2&lt;/p>&lt;/blockquote>
&lt;p>ada&lt;/p>
&lt;p>代码&lt;code>func(int a, int b)&lt;/code>&lt;/p>
&lt;p>代码块：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">def&lt;/span> &lt;span class="nf">func&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">func&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;abc&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>表格：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">c1&lt;/th>
&lt;th style="text-align: right">c2&lt;/th>
&lt;th style="text-align: center">c3&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">1&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;td style="text-align: center">3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">2&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;td style="text-align: center">3&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>html转换：&lt;br>
♥&lt;/p>
&lt;p>分页符：&lt;/p>
&lt;p>[========]&lt;/p>
&lt;p>abc&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">目录：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 标题：1标题：1.1标题：1.1.1标题：1.1.1.1标题：1.1.1.1.1标题：1.1.1.1.1.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">加粗：**test**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">横线：~~test~~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">斜体：*test*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># 标题：1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>&lt;span class="gu">## 标题：1.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### 标题：1.1.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">#### 标题：1.1.1.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">##### 标题：1.1.1.1.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">###### 标题：1.1.1.1.1.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$~~$
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">节点：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> ba
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">序号：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">1.&lt;/span> c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">2.&lt;/span> d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">分割线
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">链接：[&lt;span class="nt">点我&lt;/span>](&lt;span class="na">http://www.baidu.com &amp;#34;点我&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">链接：[[id]][linkid]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">something
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">something
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[linkid]: http://www.baidu.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">图片：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[&lt;span class="nt">![desc&lt;/span>](&lt;span class="na">../../1.PNG&lt;/span>)](http://www.baidu.com &amp;#34;desc&amp;#34;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">引用：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">&amp;gt; &lt;/span>&lt;span class="ge">line 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ge">&lt;/span>&lt;span class="k">&amp;gt; &lt;/span>&lt;span class="ge">line 2
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ge">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ada
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">代码&lt;span class="sb">`func(int a, int b)`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">代码块：
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">def func(int a, int b)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> return 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">def func(a, b):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> c = &amp;#34;abc&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> return a + b
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">表格：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| c1 | c2 | c3 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| :- | -: | :-: |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| 1 | 2 | 3|
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| 2 | 2 |3|
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">html转换：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ni">&amp;amp;hearts;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">分页符：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[========]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">abc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>tool.webssh.网页版SSH工具</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/webssh/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/webssh/</guid><description>&lt;p>&lt;strong>感谢&lt;/strong>&lt;br>
开源项目：&lt;a href="https://gitee.com/careyjike_173/webssh">https://gitee.com/careyjike_173/webssh&lt;/a>&lt;/p></description></item><item><title>tool.yacc.语法解析工具</title><link>https://my-blog.j8465383071.workers.dev/posts/tools/yacc/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/tools/yacc/</guid><description>&lt;p>目录：&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-%E6%A6%82%E8%BF%B0">1 概述&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-概述">1 概述&lt;/h1>
&lt;p>&lt;strong>需求&lt;/strong>&lt;br>
判断语法是否正确&lt;/p></description></item><item><title>操作系统 1 总结</title><link>https://my-blog.j8465383071.workers.dev/posts/os/os-1-summary/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/os/os-1-summary/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol start="0">
&lt;li>
&lt;p>架构&lt;/p>
&lt;/li>
&lt;li>
&lt;p>CPU&lt;/p>
&lt;/li>
&lt;li>
&lt;p>内存管理&lt;/p>
&lt;/li>
&lt;li>
&lt;p>进程线程&lt;/p>
&lt;/li>
&lt;li>
&lt;p>文件系统&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#1-CPU%E7%BB%93%E6%9E%84">1 CPU结构&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-1-CPU%E7%BB%93%E6%9E%84">1.1 CPU结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-CPU%E5%AF%BB%E5%9D%80">1.2 CPU寻址&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#2-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86">2 内存管理&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E5%86%85%E5%AD%98%E7%94%B3%E8%AF%B7">2.1 内存申请&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E5%86%85%E5%AD%98%E5%AF%BB%E5%9D%80">2.2 内存寻址&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#3-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86">3 进程管理&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E8%BF%9B%E7%A8%8B%E7%BB%93%E6%9E%84">3.1 进程结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6">3.2 进程调度&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E4%B8%AD%E6%96%AD%E5%92%8C%E5%BC%82%E5%B8%B8">一、中断和异常&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E3%80%81%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86">二、中断处理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89%E3%80%81%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8">三、系统调用&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-2-%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1">3.2 进程通信&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-3-%E9%94%81">3.3 锁&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#4-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86">4 文件管理&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#5-%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86">5 设备管理&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h1 id="1-cpu结构">1 CPU结构&lt;/h1>
&lt;h2 id="11-cpu结构">1.1 CPU结构&lt;/h2>
&lt;p>&lt;img alt="os-1-cpu" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/OS/os-1-summary/os-1-cpu.png">&lt;/p>
&lt;h2 id="12-cpu寻址">1.2 CPU寻址&lt;/h2>
&lt;ul>
&lt;li>5种寻址方式
&lt;ul>
&lt;li>直接寻址 : [1]&lt;/li>
&lt;li>寄存器间接寻址 [bx]&lt;/li>
&lt;li>寄存器相对寻址 [bx + 1]&lt;/li>
&lt;li>基址变址寻址 [bx + si]&lt;/li>
&lt;li>相对基址变址寻址 [bx + si + 1]&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h1 id="2-内存管理">2 内存管理&lt;/h1>
&lt;h2 id="21-内存申请">2.1 内存申请&lt;/h2>
&lt;ul>
&lt;li>libc内部free list&lt;/li>
&lt;li>libc申请新逻辑页
&lt;ul>
&lt;li>内核使用伙伴算法，分配物理页，插入页表&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="os-2-1-malloc" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/OS/os-1-summary/os-2-1-malloc.png">&lt;/p></description></item><item><title>操作系统 2 原理</title><link>https://my-blog.j8465383071.workers.dev/posts/os/os-2-principles/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/os/os-2-principles/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol start="0">
&lt;li>
&lt;p>架构&lt;/p>
&lt;/li>
&lt;li>
&lt;p>CPU&lt;/p>
&lt;/li>
&lt;li>
&lt;p>内存管理&lt;/p>
&lt;/li>
&lt;li>
&lt;p>进程线程&lt;/p>
&lt;/li>
&lt;li>
&lt;p>文件系统&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#0-%E6%9E%B6%E6%9E%84">0 架构&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#0-1-OS%E5%8A%9F%E8%83%BD">0.1 OS功能&lt;/a>&lt;/li>
&lt;li>&lt;a href="#0-2-OS%E7%89%B9%E5%BE%81">0.2 OS特征&lt;/a>&lt;/li>
&lt;li>&lt;a href="#0-3-OS%E7%BB%93%E6%9E%84">0.3 OS结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#0-4-OS%E5%88%86%E7%B1%BB">0.4 OS分类&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#1-CPU">1 CPU&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-1-CPU-%E7%BB%93%E6%9E%84">1.1 CPU 结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E5%AF%84%E5%AD%98%E5%99%A8">1.2 寄存器&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4">1.3 汇编指令&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-%E7%A8%8B%E5%BA%8F">1.4 程序&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-5-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">1.5 操作系统&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#2-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86">2 内存管理&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#%E7%BB%93%E6%9E%84">结构&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="#3-%E8%BF%9B%E7%A8%8B%E7%BA%BF%E7%A8%8B">3 进程线程&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E6%A6%82%E8%BF%B0">1.1 概述&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E8%BF%9B%E7%A8%8B%E9%80%9A%E4%BF%A1">2 进程通信&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E5%88%86%E7%B1%BB">2.1 分类&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-1-%E4%BB%A3%E7%A0%81">2.1 代码&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80-%E4%BF%A1%E5%8F%B7">一 信号&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C-%E4%BF%A1%E5%8F%B7%E9%87%8F-%EF%BC%88Posix%EF%BC%89">二 信号量 （Posix）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97">三 消息队列&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%9B%9B-%E7%AE%A1%E9%81%93">四 管道&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%94-%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98">五 共享内存&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%AD-%E5%A5%97%E6%8E%A5%E5%AD%97">六 套接字&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-3-%E5%91%BD%E4%BB%A4">2.3 命令&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F">4 文件系统&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="0-架构">0 架构&lt;/h1>
&lt;h2 id="01-os功能">0.1 OS功能&lt;/h2>
&lt;p>从资源管理角度划分：&lt;/p>
&lt;ul>
&lt;li>进程/线程管理&lt;/li>
&lt;li>内存管理&lt;/li>
&lt;li>文件管理&lt;/li>
&lt;li>设备管理&lt;/li>
&lt;li>用户接口&lt;/li>
&lt;/ul>
&lt;h2 id="02-os特征">0.2 OS特征&lt;/h2>
&lt;ul>
&lt;li>并发&lt;/li>
&lt;li>共享&lt;/li>
&lt;li>虚拟&lt;/li>
&lt;li>随机：不可预测的事件，状态随机&lt;/li>
&lt;/ul>
&lt;h2 id="03-os结构">0.3 OS结构&lt;/h2>
&lt;p>整体架构：&lt;/p></description></item><item><title>计算机网络 1 总结</title><link>https://my-blog.j8465383071.workers.dev/posts/network/network-1-summary/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/network/network-1-summary/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol start="0">
&lt;li>
&lt;p>整体架构&lt;/p>
&lt;/li>
&lt;li>
&lt;p>物理层&lt;/p>
&lt;/li>
&lt;li>
&lt;p>链路层&lt;/p>
&lt;/li>
&lt;li>
&lt;p>传输层&lt;/p>
&lt;/li>
&lt;li>
&lt;p>应用层&lt;/p>
&lt;/li>
&lt;li>
&lt;p>socket编程&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#0-%E6%A6%82%E8%BF%B0">0 概述&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#0-1-%E4%B8%83%E5%B1%82%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84">0.1 七层体系结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#0-2-%E6%8A%A5%E6%96%87%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86">0.2 报文基本原理&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#1-%E5%BA%94%E7%94%A8%E5%B1%82">1 应用层&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#1-1-HTTP%E5%8D%8F%E8%AE%AE">1.1 HTTP协议&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-1-HTTP-%E7%BB%93%E6%9E%84">1.1.1 HTTP 结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-1-2-HTTP-%E5%BA%94%E7%94%A8">1.1.2 HTTP 应用&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#1-2-DNS-%E5%8D%8F%E8%AE%AE">1.2 DNS 协议&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#2-%E4%BC%A0%E8%BE%93%E5%B1%82">2 传输层&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#2-1-TCP">2.1 TCP&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-1-TCP-%E7%9A%84%E7%BB%93%E6%9E%84">2.1.1 TCP 的结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-1-2-TCP-%E7%9A%84%E5%BA%94%E7%94%A8">2.1.2 TCP 的应用&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#3-%E7%BD%91%E7%BB%9C%E5%B1%82">3 网络层&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#3-1-IP">3.1 IP&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-IP-%E5%8D%8F%E8%AE%AE">3.1 IP 协议&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-1-2-IP-%E8%B7%AF%E7%94%B1">3.1.2 IP 路由&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-2-ICMP">3.2 ICMP&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#4-%E9%93%BE%E8%B7%AF%E5%B1%82">4 链路层&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#4-1-%E9%93%BE%E8%B7%AF%E5%B1%82%E8%83%8C%E6%99%AF">4.1 链路层背景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-2-%E9%93%BE%E8%B7%AF%E5%B1%82%E7%BB%93%E6%9E%84">4.2 链路层结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-3-%E9%93%BE%E8%B7%AF%E5%B1%82%E5%8A%9F%E8%83%BD">4.3 链路层功能&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-4-%E9%93%BE%E8%B7%AF%E5%B1%82%E8%AE%BE%E5%A4%87">4.4 链路层设备&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#5-%E7%89%A9%E7%90%86%E5%B1%82">5 物理层&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="#6-socket%E7%BC%96%E7%A8%8B">6 socket编程&lt;/a>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="#6-1-%E5%9F%BA%E6%9C%AC%E6%8E%A5%E5%8F%A3">6.1 基本接口&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-2-%E9%98%BB%E5%A1%9E%E6%A8%A1%E5%9E%8B">5.2 阻塞模型&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%9C%BA%E6%99%AF">场景&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80-%E9%98%BB%E5%A1%9EIO">一 阻塞IO&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C-%E9%9D%9E%E9%98%BB%E5%A1%9EIO">二 非阻塞IO&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%89-IO%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-select-%E4%B8%BB%E5%8A%A8%E6%A3%80%E6%9F%A5">三 IO多路复用 - select() 主动检查&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%9B%9B-%E4%BF%A1%E5%8F%B7%E9%A9%B1%E5%8A%A8IO">四 信号驱动IO&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%94-%E5%BC%82%E6%AD%A5IO">五 异步IO&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-3-IO%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8">5.3 IO多路复用&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#5-3-1-select">5.3.1 select()&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-3-2-poll">5.3.2 poll()&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-3-3-epoll">5.3.3 epoll()&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;h1 id="0-概述">0 概述&lt;/h1>
&lt;h2 id="01-七层体系结构">0.1 七层体系结构&lt;/h2>
&lt;p>计算机网络使用自顶向下的多层网络结构：&lt;/p></description></item><item><title>海量 10 设计 SSL协议</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/10-design-ssl/</link><pubDate>Tue, 09 Sep 2025 18:48:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/10-design-ssl/</guid><description>&lt;h1 id="1-tls协议支持第三方流量审计">1 TLS协议支持第三方流量审计&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;p>【需求背景】&lt;br>
TLS协议，是保障通信安全的加密协议，可分为4个子功能：&lt;/p>
&lt;ol>
&lt;li>密钥生成：通过密钥交换或密钥协商等协议，让双方生成相同的密钥&lt;/li>
&lt;li>身份认证：在开始阶段，双方均向对方发送自己的证书。双方接收证书后，基于PKI体系，校验证书是否合法。&lt;/li>
&lt;li>数据加密：发送方发生数据前，使用密钥加密数据，发送数据密文。接受方接受密文后，使用密钥解密，获取数据。&lt;/li>
&lt;li>数据校验：在加密数据的同时，生成数据完整性校验码，与数据密文拼接在一起。（简单理解：生成数据的哈希值，并使用密钥加密哈希值）接收方解密数据后，同样生成数据完整性校验码，与接收的相比，判断是否一致。&lt;/li>
&lt;/ol>
&lt;p>开源软件libssl.so提供TLS功能，应用只需调用接口，即可实现TLS协议。同时，libssl.so提供100+算法套件，可让应用选择不同的参数组合，1个算法套件，包含4个关键参数：&lt;/p>
&lt;ol>
&lt;li>密钥生成：密钥生成协议&lt;/li>
&lt;li>身份认证：证书算法类型&lt;/li>
&lt;li>数据加密：加密算法类型&lt;/li>
&lt;li>数据校验：哈希算法类型&lt;/li>
&lt;/ol>
&lt;p>例如，libssl.so中，常用的算法套件为：ECDHE-RSA-AES128-SHA256，该套件中，参数的含义如下：&lt;/p>
&lt;ol>
&lt;li>密钥生成协议：ECDHE协议。（常见协议类型:DHE、ECDHE、RSA等）&lt;/li>
&lt;li>证书算法类型：RSA&lt;/li>
&lt;li>加密算法类型：AES-128&lt;/li>
&lt;li>哈希算法类型：SHA-256&lt;/li>
&lt;/ol>
&lt;p>【需求分析】&lt;br>
vastbase支持TLS协议，当vsql与vastbase通信时，双方可使用TLS模块，生成密钥，并使用密钥加密、解密通信数据，包括：SQL语句、SQL执行结果等。&lt;br>
客户可能采用第三方工具，截取网络流量，获取传输中的SQL等数据，进行流量审计。但是，在使用TLS协议的情况下，网络中的数据是密文形式，无法进行流量审计。&lt;/p>
&lt;p>vastbase提供1个GUC参数ssl_ciphers，用于配置TLS协议采用的算法套件，旧版本，该参数的取值范围如下：&lt;/p>
&lt;ul>
&lt;li>ECDHE-ECDSA-AES256-GCM-SHA384&lt;/li>
&lt;li>ECDHE-RSA-AES256-GCM-SHA384&lt;/li>
&lt;li>DHE-RSA-AES256-GCM-SHA384&lt;/li>
&lt;li>ECDHE-ECDSA-AES128-GCM-SHA256&lt;/li>
&lt;li>DHE-RSA-AES128-GCM-SHA256&lt;/li>
&lt;li>ECDHE-RSA-AES128-SHA256&lt;/li>
&lt;li>ECDHE-ECDSA-SM4-CBC-SM3&lt;/li>
&lt;li>4个仅tassl支持的国密算法套件&lt;/li>
&lt;/ul>
&lt;p>上述7个套件中，密钥生成协议为：ECDHE、DHE，此类DH协议，无法让第三方工具获取密钥。&lt;/p>
&lt;p>本版本，新增4个算法套件：&lt;/p>
&lt;ul>
&lt;li>AES128-SHA256&lt;/li>
&lt;li>AES256-SHA256&lt;/li>
&lt;li>AES128-GCM-SHA256&lt;/li>
&lt;li>AES256-GCM-SHA384&lt;/li>
&lt;/ul>
&lt;p>上述4个套件，密钥生成协议为：RSA，该协议可让第三方工具获取密钥，使其可解密网络流量，获取SQL语句、SQL执行结果等。&lt;/p>
&lt;p>【需求实现】&lt;br>
之前，vastbase限制ssl_ciphers的取值范围，仅放开7个算法套件，本版本，将新增放开4个算法套件。&lt;/p>
&lt;p>实现时，仅修改ssl_ciphers的取值范围，新增支持4个算法套件[AES128-SHA256、AES256-SHA256、AES128-GCM-SHA256、AES256-GCM-SHA384]，4个算法套件将直接传递给libssl.so，内核不做任何处理。&lt;/p>
&lt;p>因此，本需求无复杂设计。本文主要介绍完整的TLS协议工作原理。&lt;/p>
&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;h3 id="一ecdhe与rsa的区别">一、ECDHE与RSA的区别&lt;/h3>
&lt;p>此处简化ECDHE与RSA的步骤与算法，提取最核心的原理，方便快速理解。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>一、ECDHE密钥协商协议&lt;br>
第三方工具、攻击者完全无法获取密钥。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">client server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+-----------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &amp;lt;---- 0. 双方随机约定一些公开参数 ------&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. 生成随机私钥 client_priv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 2. 基于client_priv，计算公钥 client_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 3. 发送公钥 client_pub ------------&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. 接收公钥 client_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 5. 生成随机私钥 server_priv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6. 基于server_priv，计算公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;------------ &lt;span class="p">|&lt;/span> 7. 发送公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 8. 接收公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 9. 基于client_priv，server_pub，计算密钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 10. 基于server_priv，client_pub，计算密钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">（第9步和第10步，可以计算出相同的密钥）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">简单举个例子
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">client server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+-----------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &amp;lt;----- 0. generate and send &lt;span class="o">(&lt;/span>2,11&lt;span class="o">)&lt;/span> ----&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. generate &lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 2. caculate &lt;span class="o">(&lt;/span>&lt;span class="m">8&lt;/span> * 2&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 3. send &lt;span class="m">5&lt;/span> ----------&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. receive &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 5. generate &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6. caculate &lt;span class="o">(&lt;/span>&lt;span class="m">10&lt;/span> * 2&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;------------ &lt;span class="p">|&lt;/span> 7. send &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 8. receive &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 9. &lt;span class="nv">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">(&lt;/span>&lt;span class="m">8&lt;/span> * 9&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 10. &lt;span class="nv">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">(&lt;/span>&lt;span class="m">10&lt;/span> * 5&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">攻击者：截获网络流量，获取2,11,5,9，无法计算出密钥为6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>二、RSA密钥交换协议&lt;/p></description></item><item><title>海量 10 需求 SSL协议</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/10-requirement-ssl/</link><pubDate>Wed, 03 Sep 2025 11:07:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/10-requirement-ssl/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>在应用与数据库传输数据时，为避免攻击者对数据进行窃听、篡改、伪造、重放等攻击，Vastbase支持采用TLS协议保障数据机密性与完整性。&lt;br>
通过TLS协议，应用传输数据指至服务端路程如下：&lt;/p>
&lt;ol>
&lt;li>建立连接：与数据建立TCP连接&lt;/li>
&lt;li>生成密钥(TLS)：采用TLS协议协商生成密钥(连接级)&lt;/li>
&lt;li>加密数据(TLS)：使用密钥加密数据(SQL等)&lt;/li>
&lt;li>发送数据：通过TCP协议，发送数据密文至数据库&lt;/li>
&lt;/ol>
&lt;p>客户可能采用第三方工具，截取网络流量，获取传输中的SQL等数据，进行流量审计。但是，在使用TLS协议的情况下，网络中的数据是密文形式，无法进行流量审计。为解决该问题，本文介绍如何让第三方工具获取密钥，以解密网络中的数据密文。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>本文适用于3.0.8 psu4以之后版本。未来本需求将同步至2.2.15版本。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>SSL: Secure Sockets Layer，于保障网络通信安全的加密协议，早期协议，存在设计缺陷，目前由TLS协议替代。但是，SSL也可不特指SSL协议，可泛指所有通信安全加密协议。同时，由于历史原因，以及前向兼容，数据库中的很多参数与接口采用SSL命令，实际使用的是TLS协议。无需纠结TLS与SSL差异，vastbase中SSL等于TLS。&lt;/li>
&lt;li>TLS: Transport Layer Security，更安全的传输加密协议。早期版本1.0,1.1已不安全，主流版本为1.2,1.3。&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>原始需求：&lt;a href="https://www.tapd.cn/tapd_fe/60475194/story/detail/1160475194001084569">https://www.tapd.cn/tapd_fe/60475194/story/detail/1160475194001084569&lt;/a>&lt;/li>
&lt;li>openssl支持的所有cipers： &lt;a href="https://docs.openssl.org/3.0/man1/openssl-ciphers/">https://docs.openssl.org/3.0/man1/openssl-ciphers/&lt;/a>&lt;/li>
&lt;li>ssl与tls原理：博客写了一点点，没整理&lt;/li>
&lt;/ul>
&lt;h1 id="2-tls协议支持第三方流量审计">2 TLS协议支持第三方流量审计&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;p>【需求现状】&lt;br>
目前，大部分第三方流量审计工具，可在一些特定场景下，解密由TLS协议加密后的数据。以vastbase为例，使用TLS协议分为以下阶段：&lt;/p>
&lt;ol>
&lt;li>生成证书、私钥文件&lt;/li>
&lt;li>vastbase端配置证书、私钥文件&lt;/li>
&lt;li>vsql端配置证书、私钥文件&lt;/li>
&lt;li>vsql连接vastbase&lt;br>
4.1 建立tcp连接&lt;br>
4.2 使用证书校验对方身份&lt;br>
4.3 双发协商选择算法套件：包括密钥生成协议、加密算法等&lt;br>
4.4 双方协商生成密钥&lt;/li>
&lt;li>vsql与vastbase传输数据&lt;br>
5.1 发送数据前，使用密钥加密数据&lt;br>
5.2 发送数据密文&lt;br>
在4.3步骤中，可配置不同的密钥生成协议，对于其中一部分协议，在步骤4.4中，第三方工具可获取密钥，第步骤5.2中，第三方工具截取数据密文后，即可解密数据。&lt;br>
但是，4.3步骤中，目前vastbase仅支持2种密钥生成协议，这2种协议都无法让第三方工具获取密钥。&lt;/li>
&lt;/ol>
&lt;p>【密钥生成协议】&lt;br>
此处介绍2类常见的密钥生成协议：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>一、DHE密钥协商协议&lt;br>
Vastbase目前支持的2种协议，都属于此类协议&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">client server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+-----------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &amp;lt;-------- 0. 双方随机约定一些参数 ------&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. 生成随机私钥 client_priv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 2. 基于client_priv，计算公钥 client_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 3. 发送公钥 client_pub ------------&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. 接收公钥 client_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 5. 生成随机私钥 server_priv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6. 基于server_priv，计算公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;------------ &lt;span class="p">|&lt;/span> 7. 发送公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 8. 接收公钥 server_pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 9. 基于client_priv，server_pub，计算密钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 10. 基于server_priv，client_pub，计算密钥
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">（第9步和第10步，可以计算出相同的密钥）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">简单举个例子
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">client server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+-----------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &amp;lt;----- 0. generate and send &lt;span class="o">(&lt;/span>2,11&lt;span class="o">)&lt;/span> ----&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. generate &lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 2. caculate &lt;span class="o">(&lt;/span>&lt;span class="m">8&lt;/span> * 2&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 3. send &lt;span class="m">5&lt;/span> ----------&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. receive &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 5. generate &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6. caculate &lt;span class="o">(&lt;/span>&lt;span class="m">10&lt;/span> * 2&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;------------ &lt;span class="p">|&lt;/span> 7. send &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 8. receive &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 9. &lt;span class="nv">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">(&lt;/span>&lt;span class="m">8&lt;/span> * 9&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 10. &lt;span class="nv">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">(&lt;/span>&lt;span class="m">10&lt;/span> * 5&lt;span class="o">)&lt;/span> % &lt;span class="nv">11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">攻击者：截获网络流量，获取2,11,5,9，无法计算出密钥为6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>二、RSA密钥交换协议&lt;br>
该协议支持第三方工具解密流量，客户选择的工具已适配该协议。TLS还支持其他PSK、SRP等协议，但是，由于这些协议比较少见，且客户选择的工具未适配，本次不适配其他协议。&lt;/p></description></item><item><title>海量 11 需求 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/11-requirement-logical-replication/</link><pubDate>Fri, 06 Feb 2026 14:30:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/11-requirement-logical-replication/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>&lt;strong>逻辑复制&lt;/strong>是一种在多个数据库实例之间复制数据的功能，通常用于从一个数据库实例中，将针对指定表的insert、delete、update等写操作，复制到其他另一个数据库实例。在数据库术语中，统一称逻辑复制的发送方为&lt;strong>发布端&lt;/strong>，称接收方为&lt;strong>订阅端&lt;/strong>。Oracle、Postgresql、Vastbase等数据库产品，均提供逻辑复制功能。&lt;/p>
&lt;p>当前版本，逻辑复制性能较低，以tpcc场景为例，发布端40w tmpc时，订阅端的复制速度约10m/s。在滚动升级等场景，通过逻辑复制在不同实例间同步大量数据，要求逻辑复制性能达到70-100m/s。&lt;/p>
&lt;p>发布端、订阅端均存在性能瓶颈，均需要优化。但是，由于交付时间较短，以及订阅端方案仍有瑕疵等因素，本版本交付发布端性能优化，下版本交付订阅端性能优化。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>本文主要用于向开发、测试等角色，介绍G100 3.0.9 psu2及之后版本，逻辑复制的性能优化的设计方向与使用方法。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>发布端：逻辑复制场景，发送数据方。&lt;/li>
&lt;li>订阅端：逻辑复制场景，接收数据方。&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>Vastbase G100产品文档中逻辑复制使用介绍：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-g100审计功能重构">2 G100审计功能重构&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="需求背景逻辑复制使用">需求背景：逻辑复制使用&lt;/h3>
&lt;p>使用逻辑复制的流程如下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>发布端：配置逻辑复制&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置wal日志详细级别，设计身份等参数，重启集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -c &lt;span class="s1">&amp;#39;wal_level=logical&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -h &lt;span class="s2">&amp;#34;host all all 0.0.0.0/0 md5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -h &lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 md5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl restart -D &lt;span class="nv">$PGDATA&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建发布，即指定哪些表需复制&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建逻辑复制槽，用于存储复制状态等信息&lt;/p></description></item><item><title>海量 透明加密 设计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/13-design-tde/</link><pubDate>Mon, 23 Mar 2026 20:52:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/13-design-tde/</guid><description>&lt;h1 id="1-透明加密">1 透明加密&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;p>关于透明加密的基本概念，请看需求文档。&lt;br>
用户使用透明加密的示例如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tde_key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">source&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">local&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;pass.123&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">POLICY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ep1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FRO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">tde_key&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;data1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;data1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;h3 id="121-整体架构">1.2.1 整体架构&lt;/h3>
&lt;p>透明加密的核心目标，是通过数据加密方案，解决攻击者绕过数据库安全机制，直接从磁盘窃取数据的问题。&lt;br>
在加密数据后，需要确保不影响内核在数据上进行计算。因此，需要在存储层底层，对数据进行加密。另外，为确保存储底层能够识别哪些数据加密，哪些数据不加密，以及使用什么算法加密等，上层需传递加密信息。透明加密逻辑架构如下：&lt;/p>
&lt;p>&lt;img alt="1-struct" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/13-design-tde/1-struct.png">&lt;/p>
&lt;h3 id="122-工作流程">1.2.2 工作流程&lt;/h3>
&lt;p>为适配存储底层设计，同时兼顾加密性能，以Page为粒度进行加密，并且，在Page中，存储加密信息。&lt;/p>
&lt;p>&lt;img alt="2-flow" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/13-design-tde/2-flow.png">&lt;/p>
&lt;h3 id="123-详细流程">1.2.3 详细流程&lt;/h3>
&lt;h4 id="一启动进程">一、启动进程&lt;/h4>
&lt;p>在启动进程阶段，故障恢复时，如果回放到属于加密表的xlog，涉及到解密Page，因此，需在故障恢复前加载密钥。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">main&lt;/span> &lt;span class="c1"># 1. 启动数据库进程（基于pg-16代码）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostmasterMain&lt;/span> &lt;span class="c1"># 2. 启动postmaster进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SelectConfigFiles&lt;/span> &lt;span class="c1"># 3. 读取GUC文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;tde_load_encryption_key&amp;#39;&lt;/span> &lt;span class="c1"># 4. 读取密钥文件（后文介绍密钥如何生成）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SysLogger_Start&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartupDataBase&lt;/span> &lt;span class="c1"># 5. 开始故障恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartupProcessMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartupXLOG&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadControlFile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PerformWalRecovery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">loop&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadRecord&lt;/span> &lt;span class="c1"># 6. 读取xlog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ApplyWalRecord&lt;/span> &lt;span class="c1"># 7. 重放xlog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GetRmgr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rm_redo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_xlog_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogReadBufferForRedo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogReadBufferForRedoExtended&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">XLogReadBufferExtended&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadBufferWithoutRelcache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ReadBuffer_common&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">smgrread&lt;/span> &lt;span class="c1"># 8. 读取数据文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 需解密，后文统一介绍&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ServerLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">loop&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ConnCreate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendStartup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackendRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostgresMain&lt;/span> &lt;span class="c1"># 9. 启动postgres进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartCheckpointer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartBackgroundWriter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">StartChildProcess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AuxiliaryProcessMain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BackgroundWriterMain&lt;/span> &lt;span class="c1"># 10. 启动bgwriter进程&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="二生成密钥">二、生成密钥&lt;/h4>
&lt;p>当前版本，所有表，使用同一个数据密钥。因此，暂时无需新增系统表，存储密钥对象。&lt;/p></description></item><item><title>海量 透明加密 需求</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/13-requirement-tde/</link><pubDate>Fri, 20 Mar 2026 10:47:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/13-requirement-tde/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>透明加密特性提供数据加密功能，核心原理是在数据库将数据存储至磁盘时，先加密再存储。&lt;br>
本需求将从0设计透明加密特性，在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下，让特性达到商用标准。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>Vastbase V5版本。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>TDE：Transparent Data Encryption，透明数据加密，由数据库提供的数据加密特性&lt;/li>
&lt;/ul>
&lt;h2 id="14-参考资料">1.4 参考资料&lt;/h2>
&lt;ul>
&lt;li>oracle 透明加密特性：&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/dbtde/preface.html">https://docs.oracle.com/en/database/oracle/oracle-database/26/dbtde/preface.html&lt;/a>&lt;/li>
&lt;li>sql server 透明加密特性：&lt;a href="https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver17">https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver17&lt;/a>&lt;/li>
&lt;li>oceanbase 透明加密特性：&lt;a href="https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475958">https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475958&lt;/a>&lt;/li>
&lt;li>kingbase 透明加密特性：&lt;a href="https://docs.kingbase.com.cn/cn/KES-V9R1C10/safe/transparent-data-Encyption">https://docs.kingbase.com.cn/cn/KES-V9R1C10/safe/transparent-data-Encyption&lt;/a>&lt;/li>
&lt;li>dm8 透明加密特性：&lt;a href="https://eco.dameng.com/document/dm/zh-cn/pm/storage-encryption.html#7.1.1%20%E5%85%A8%E5%BA%93%E5%8A%A0%E5%AF%86">https://eco.dameng.com/document/dm/zh-cn/pm/storage-encryption.html#7.1.1%20%E5%85%A8%E5%BA%93%E5%8A%A0%E5%AF%86&lt;/a>&lt;/li>
&lt;li>gaussdb 透明加密特性：&lt;a href="https://support.huaweicloud.com/intl/zh-cn/fg-gaussdb-dist-v8/gaussdb-18-0019.html">https://support.huaweicloud.com/intl/zh-cn/fg-gaussdb-dist-v8/gaussdb-18-0019.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-透明加密">2 透明加密&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="一基本原理">一、基本原理&lt;/h3>
&lt;p>通常，用户将数据传输给数据库后，数据库将数据存储到磁盘。攻击者可能利用多种数据库内部或外部漏洞，例如操作系统漏洞等，绕过数据库安全机制，直接从磁盘读取数文件，窃取用户数据。&lt;/p>
&lt;p>&lt;strong>透明加密&lt;/strong>，是一种由数据库提供的加密特性，可有效解决攻击者从磁盘窃取数据的问题。开启透明加密后，数据库将数据存储到磁盘时，先加密数据，再存储数据密文；数据库从磁盘读取数据时，先解密数据密文，再进行其他计算。用户访问透明加密表时，包括存储、读取数据等，与访问普通表无任何区别，加密和解密过程由数据库自动完成，即对用户透明。&lt;/p>
&lt;h3 id="二竞品分析">二、竞品分析&lt;/h3>
&lt;p>几乎所有商用关系数据库中，都支持透明加密特性，包括oracle, sql server, oceanbase, kingbase, dm8等，postgresql不支持透明加密特性。&lt;br>
使用透明加密时，通常包括3个阶段：&lt;/p>
&lt;ol>
&lt;li>定义用于加密的密钥&lt;/li>
&lt;li>使用SQL语法，定义哪些对象需加密，不同产品，定义加密对象的粒度不同&lt;/li>
&lt;li>使用SQL语法，访问透明加密表，以及进行其他运维等操作&lt;/li>
&lt;/ol>
&lt;p>各产品中，定义加密对象的SQL语法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 一、oracle
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLESPACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ts1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DATAFILE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;AES192&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 二、sql server
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ALGORITHM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">AES_256&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">db1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 三、oceanbase
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLESPACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ts1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">encryption&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;y&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- mysql cmpt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLESPACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ts1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USING&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;aes-256&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- oracle cmpt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 四、kingbase
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLESPACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ENCRYPTION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TRUE&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ENCRYPTED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;this is a key&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 五、dm8
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">intdb&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPT_NAME&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLESPACE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ENCRYPT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 六、gaussdb
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">..&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">enable_tde&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>各产品中，按定义加密对象的粒度，区别如下：&lt;/p></description></item><item><title>海量 mac 设计</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/14-design-mac/</link><pubDate>Mon, 23 Mar 2026 21:41:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/14-design-mac/</guid><description>&lt;h1 id="1-强制访问控制">1 强制访问控制&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;p>从实现的角度看，当用户执行SQL时，强制访问控制主要实现以下功能：&lt;/p>
&lt;ol>
&lt;li>CREATE ACCESS POLICY ..：在系统表中，记录ACCESS POLICY，以及其中的LABLE等信息&lt;/li>
&lt;li>CREATE TABLE ..：创建表时，如果设置acess_policy字段，则自动为表新增1列隐藏列，列名为access_label&lt;/li>
&lt;li>INSERT ..：向表插入数据时，根据当前用户的write_label，自动为数据生成access_label列的值。&lt;/li>
&lt;li>SELECT ..：从表查询数据时，根据当前用户的read_label，自动为查询语句添加过滤条件has_mac_permission(access_label, read_label)&lt;/li>
&lt;/ol>
&lt;p>另外，如果为表设置访问策略，需在索引中同时设置访问策略：&lt;/p>
&lt;ol>
&lt;li>CREATE INDEX ..：自动为索引新增1列，列名为access_label&lt;/li>
&lt;/ol>
&lt;p>对于一些其他语法，也许单独适配，包括：&lt;/p>
&lt;ol>
&lt;li>COPY ..：自动修改旧数据的access_label值&lt;/li>
&lt;/ol>
&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;h3 id="121-整体流程">1.2.1 整体流程&lt;/h3>
&lt;p>本文重点从源码角度，介绍强制访问控制策略如何基于隐藏列，实现强制访问控制，包括：创建、填充、匹配隐藏列等流程。&lt;br>
核心功能的大致流程如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">User Vastbase Disk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+---------------------------------------------------+---------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 管理员&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 1. CREATE ACCESS POLICY .. LEVEL .. LABEL .. --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 2. 存储access policy至系统表vb_access_policy --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 3. 存储access level至系统表vb_access_level --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 4. 存储access label至系统表vb_access_label --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 5. CREATE TABLE .. &lt;span class="o">(&lt;/span>&lt;span class="nv">access_policy&lt;/span>&lt;span class="o">=&lt;/span>..&lt;span class="o">)&lt;/span> --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 6. 识别是否设置access_policy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 7. 自动添加隐藏列access_label
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 8. 存储access_policy至系统表pg_class --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 9. 存储accessl_label定义至系统表pg_attribute --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 10. CREATE USER ..
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ACCESS POLICY .. READ LABEL .. WRITE LABEL --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 11. 存储access_policy, read_label, write_label至系统表pg_authid --&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 普通用户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 12. vsql -U username -W password --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 14. &lt;span class="nb">set&lt;/span> &lt;span class="nv">read_label&lt;/span> &lt;span class="o">=&lt;/span> .. / &lt;span class="nv">write_label&lt;/span> &lt;span class="o">=&lt;/span> .. --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 15. 查询pg_authid，判断read_label/write_label是否合法 &amp;lt;--
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 16. 设置临时的read_label/write_label
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 17. 如何用户未自动设置read_label/write_label，自动根据pgauthid设置
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 18. INSERT .. --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 19. 查询pg_class，判断表是否有access_policy &amp;lt;--
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 20. 自动为隐藏列赋值，取值为write_label
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> 21. SELECT .. --&amp;gt; &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 22. 查询pg_class，判断表是否有access_policy &amp;lt;--
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 23. 语义分析
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 24. 查询重写：自动新增过滤条件：WHERE has_mac_permission&lt;span class="o">(&lt;/span>access_label, read_label&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> 24. 计划执行：扫描Tuple，根据过滤条件，过滤不满足权限检查的Tuple
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="122-详细流程">1.2.2 详细流程&lt;/h3>
&lt;h4 id="一创建策略">一、创建策略&lt;/h4>
&lt;p>当用户创建策略时，例如：&lt;/p></description></item><item><title>海量 mac 需求</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/14-requirement-mac/</link><pubDate>Mon, 23 Mar 2026 21:40:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/14-requirement-mac/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>本文主要包括以下关键内容：&lt;/p>
&lt;ol>
&lt;li>介绍访问控制的基本概念&lt;/li>
&lt;li>调研其他厂商实现强制控制的方式&lt;/li>
&lt;li>设计Vastbase强制访问控制特性，介绍如何使用强制访问特性&lt;/li>
&lt;/ol>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>Vastbase V5版本。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>MAC：Mandatory Access Control，强制访问控制，主体访问客体时，基于主体、客体属性，强制控制访问权限。&lt;/li>
&lt;li>DAC：Discretionary Access Control，自主访问控制，数据拥有者可自行设置访问权限。&lt;/li>
&lt;/ul>
&lt;h2 id="14-参考资料">1.4 参考资料&lt;/h2>
&lt;ul>
&lt;li>oracle 强制访问控制（标签访问控制 RLS）：&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA">https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA&lt;/a>&lt;/li>
&lt;li>oceanbase 强制访问控制（兼容oracle）：&lt;a href="https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475944">https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475944&lt;/a>&lt;/li>
&lt;li>kingbase 强制访问控制：&lt;a href="https://bbs.kingbase.com.cn/kingbase-doc/v8.6.7.24/safety/safety-guide/label-and-mac.html">https://bbs.kingbase.com.cn/kingbase-doc/v8.6.7.24/safety/safety-guide/label-and-mac.html&lt;/a>&lt;/li>
&lt;li>dm 强制访问控制：&lt;a href="https://eco.dameng.com/document/dm/zh-cn/pm/mandatory-access-control.html">https://eco.dameng.com/document/dm/zh-cn/pm/mandatory-access-control.html&lt;/a>&lt;/li>
&lt;li>GB/T-20009-数据库管理系统安全评估准则：&lt;a href="https://drive.weixin.qq.com/s?k=AHUAfwdSAA82aDcvvD">https://drive.weixin.qq.com/s?k=AHUAfwdSAA82aDcvvD&lt;/a>&lt;/li>
&lt;li>postgresql 行级访问控制 RLS：&lt;a href="https://www.postgresql.org/docs/current/ddl-rowsecurity.html">https://www.postgresql.org/docs/current/ddl-rowsecurity.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-强制访问控制">2 强制访问控制&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="一基本概念">一、基本概念&lt;/h3>
&lt;p>&lt;strong>访问控制&lt;/strong>的定义：对主体访问客体的行为，系统按照安全策略进行限制与管理的安全机制。&lt;br>
按安全策略分类，可将访问控制分为很多类，其中，常见的策略有：&lt;/p>
&lt;ul>
&lt;li>自主访问控制DAC：客体的拥有者，可自行向其他主体赋予访问权限。&lt;/li>
&lt;li>强制访问控制MAC：系统为主体、客体分配安全标签，通过主体、客体的安全标签控制访问权限，很多情况下，即使客体的拥有者也无法向其他主体赋予访问权限。&lt;/li>
&lt;li>角色访问控制RBAC：不在本文讨论范围。&lt;/li>
&lt;/ul>
&lt;p>在数据库领域，主体通常指数据库用户，客体通常指数据库对象，例如DATABASE、SCHEMA、TABLE、COLUMN、ROW、FUNCTION等。&lt;br>
自主访问控制比较成熟，几乎所有关系数据库，都提供自主访问控制特性，例如，TABLE（客体）的属主（主体），可通过&lt;code>GRANT .. TO ..&lt;/code>等语法，为其他用户（主体）赋予权限。&lt;br>
强制访问控制理论比较成熟，但是，除oracle支持强制访问控制，以及oceanbase等几款产品兼容oracle强制访问控制之外，大部分关系数据库不支持强制访问控制。&lt;/p>
&lt;p>实现强制访问控制时，通常将主体、客体的安全标签，简化为安全等级，当主体访问客体时，比较主体、客体等级高低，以判断访问权限。在机密性场景，遵循不上读、不下写原则。在完整性场景，遵循不下读、不上写原则。&lt;/p>
&lt;p>本需求将从0设计强制访问控制特性，在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下，让特性达到商用标准。&lt;/p>
&lt;h3 id="二竞品分析">二、竞品分析&lt;/h3>
&lt;p>oracle支持强制访问控制，客体是ROW，即行级强制访问控制。oceanbase、kingbase、dm的访问控制，与oracle一致。sql server、postgresql等其他产品不支持强制访问控制。&lt;br>
oracle强制访问控制使用示例如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1 定义策略
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_SYSDBA&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_POLICY&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">column_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;lab_col1&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2 定义级别
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">level_num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">short_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">long_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x3&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3 定义组件
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">comp_num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">short_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">long_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;security&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_COMPONENTS&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LEVEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;stg&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;storage&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4 创建标签
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_SYSDBA&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LABEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">label_tag&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec_normal&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">label_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1:security&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">data_label&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TRUE&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_SYSDBA&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CREATE_LABEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec_leader&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x3:security&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5 为主体设置属性
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">SA_USER_ADMIN&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SET_LEVELS&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;user1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">max_level&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">min_level&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">default_level&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">row_level&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_USER_ADMIN&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SET_COMPARTMENTS&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;user1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">read_comps&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">write_comps&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">default_comps&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">row_comps&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;sec&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 6 为客体设置属性
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">SA_USER_ADMIN&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">APPLY_TABLE_POLICY&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">policy_name&lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">shema_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;s1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">table_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;t1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">table_options&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;READ_CONTROL, WRITE_CONTROL, CHECK_CONTROL&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">label_function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;f_create_t1_label(level, comp)&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 7 插入数据（主动定义标签）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lab_col1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">CHAR_TO_LABEL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;p1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;x1:sec&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="三实现思路">三、实现思路&lt;/h3>
&lt;p>在数据库领域，除oracle外，没有其他可借鉴的方案。oracle的设计，太复杂，易用性太低。&lt;br>
本需求将参考oracle的思想，简化oracle设计。&lt;/p></description></item><item><title>海量 15 设计 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-design-logical-replication/</link><pubDate>Wed, 06 May 2026 17:48:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-design-logical-replication/</guid><description>&lt;h1 id="1-逻辑复制性能优化">1 逻辑复制性能优化&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;ul>
&lt;li>原理：&lt;br>
假设，发布端执行&lt;code>INSERT INTO t1 VALUES(1,'data1')&lt;/code>，更改1行数据，产生1条wal日志。逻辑复制功能将读取这条wal，解码并生成1条message，将message发送至订阅端。订阅端应用这条message，等价于重新执行&lt;code>INSERT INTO t1 VALUES(1,'data1')&lt;/code>。 &lt;img alt="rep" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/15-design-logical-replication/rep.png">&lt;/li>
&lt;li>问题：&lt;br>
308.1 psu1以及之前版本，逻辑复制性能较低。以tpcc场景为例，40w tmpc时，发布端产生wal日志速度约100m/s，订阅端的复制速度约10+m/s。&lt;/li>
&lt;li>客户：&lt;br>
滚动升级场景中，备机停机升级，主机持续执行业务，备机升级后使用逻辑复制追赶主机数据。长存客户场景，主机产生wal日志速度约40-50m/s，旧版本逻辑复制速度10+m/s，由于逻辑复制速度太慢，备机无法追赶主机，最终导致升级失败。&lt;/li>
&lt;li>优化&lt;br>
本需求设计与实现并行逻辑复制机制，大幅提高逻辑复制速度，在上述场景中，订阅端速度可达到70-90m/s。并行逻辑复制分为3个关键子机制：
&lt;ol>
&lt;li>发布端多线程并行解码&lt;/li>
&lt;li>发布端与订阅端流复制传输协议&lt;/li>
&lt;li>订阅端多线程并行应用&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;p>本章分3个章节，分别介绍3个关键子机制。&lt;/p>
&lt;h3 id="121-发布端并行解码机制">1.2.1 发布端并行解码机制&lt;/h3>
&lt;p>在旧版本中，发布端采用串行解码机制，只有1个walsender线程，串行执行：1次读取1条wal日志，解码1条wal生成1条message，缓存或发送message。&lt;/p>
&lt;p>旧版本代码中，发布端有实现并行解码的代码，但是，无法直接使用，订阅端只能是工具，不能是数据库实例，且存在大量问题。本需求基于旧版本并行解码，实现权限的并行解码机制。&lt;/p>
&lt;p>并行解码机制，将启动多个线程，包括1个reader、多个decoder、1个walsender，它们的功能如下：&lt;/p>
&lt;ul>
&lt;li>reader：1次读取1条wal日志，将wal发送给decoder&lt;/li>
&lt;li>decoder：1次接收1条reader发送的wal，解码生成message，将message发送给walsender&lt;/li>
&lt;li>walsender：1次接收1条decoder发送的message，将message发送给订阅端&lt;/li>
&lt;/ul>
&lt;p>线程架构图如下：&lt;/p>
&lt;p>&lt;img alt="pa-pub" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/15-design-logical-replication/pa-pub.png">&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">lsn 1-10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d1 &lt;span class="m">1&lt;/span> &lt;span class="m">4&lt;/span> collect 阻塞 &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d2 &lt;span class="m">2&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d3 &lt;span class="m">3&lt;/span> &lt;span class="m">6&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="122-发布端与订阅端流复制协议">1.2.2 发布端与订阅端流复制协议&lt;/h3>
&lt;h4 id="一握手阶段">一、握手阶段&lt;/h4>
&lt;p>订阅端与发布端建立连接时，订阅端会根据CRETE SUBSCRIPTION语法设置的参数，生成连接命令，根据连接命令，发布端和订阅端决定采用哪种通信协议，究竟是采用事务复制协议（旧版本）还是流复制协议（新版本）。&lt;/p>
&lt;h5 id="事务复制协议旧版本">事务复制协议（旧版本）&lt;/h5>
&lt;p>订阅端发送的连接命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SLOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;$slot_name&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGICAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">start_lsn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proto_version&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">publication_names&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;$publication_name&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="流复制协议新版本">流复制协议（新版本）&lt;/h5>
&lt;p>如果CRETE SUBSCRIPTION时，指定worker_number&amp;gt;1，即启用并行逻辑复制机制，将使用新的连接命令，订阅端发送的连接命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SLOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;$slot_name&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGICAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">start_lsn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proto_version&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">publication_names&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;$publication_name&amp;#34;&amp;#39;&lt;/span>&lt;span class="err">，&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">streaming&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;extreme&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">parallel&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;20&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">max&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">recordbuffer&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">memory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;100&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">max&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">txn&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">memory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;100&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上述命令中新增了多个参数：&lt;/p></description></item><item><title>海量 15 需求 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-requirement-logical-replication/</link><pubDate>Wed, 06 May 2026 10:05:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-requirement-logical-replication/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>&lt;strong>逻辑复制&lt;/strong>是一种在多个数据库实例之间复制数据的功能，通常用于从一个数据库实例中，将针对指定表的insert、delete、update等写操作，复制到其他另一个数据库实例。在数据库术语中，统一称逻辑复制的发送方为&lt;strong>发布端&lt;/strong>，称接收方为&lt;strong>订阅端&lt;/strong>。Oracle、Postgresql、Vastbase等数据库产品，均提供逻辑复制功能。&lt;/p>
&lt;p>当前版本，逻辑复制性能较低。以tpcc场景为例，发布端40w tmpc时，产生wal日志速度约100+m/s，订阅端的复制速度约10+m/s。在滚动升级场景，主机和备机可能是不同的产品版本，主备复制数据时，不能使用物理复制，只能使用逻辑复制。在长存客户场景中，主机产生wal日志速度在50+m/s左右，备机使用逻辑复制，复制速度约10+m/s，备机将追赶不上主机进度，导致滚动升级失败。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">主a 备b 备c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-----------------------+---------------------------+-----------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="nv">1&lt;/span> &lt;span class="o">==&lt;/span>&amp;gt;执行业务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">2&lt;/span> 开始滚动升级，暂停流复制 &lt;span class="nv">lag&lt;/span>&lt;span class="o">=&lt;/span>400M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">3&lt;/span> 暂停流复制（物理复制）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">4&lt;/span> 创建逻辑复制槽 &lt;span class="nv">lsn1&lt;/span>&lt;span class="o">=&lt;/span>1G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">5&lt;/span> 恢复流复制
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">6&lt;/span> 物理复制追赶，到逻辑复制槽
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">6&lt;/span> 开始单节点升级
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">7&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 停止进程
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 替换二进制等
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">9&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 启动进程
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">10&lt;/span> 单节点升级成功
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">11&lt;/span> 持续执行业务 &lt;span class="nv">lsn2&lt;/span>&lt;span class="o">=&lt;/span>2G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">12&lt;/span> 创建订阅，启动逻辑复制，lsn1&lt;span class="o">=&lt;/span>1G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">13&lt;/span> 逻辑复制开始追赶（初始差距：lsn2-lsn1&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">14&lt;/span> 持续执行业务 &lt;span class="nv">lsn3&lt;/span>&lt;span class="o">=&lt;/span>2.5G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">15&lt;/span> 逻辑复制持续追赶 &lt;span class="nv">lsn&lt;/span>&lt;span class="o">=&lt;/span>1.6G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">16&lt;/span> &lt;span class="o">(&lt;/span>可重置lag&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">17&lt;/span> 差距持续缩小（从lsn2-lsn1降低到lag）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">18&lt;/span> 发送停机命令
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">19&lt;/span> 停止业务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">20&lt;/span> 差距持续缩小，从lag缩小至0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">21&lt;/span> 停止进程成功
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此，需大幅提高逻辑复制速度，在长存客户场景中，逻辑复制速度至少需达到70+m/s。目前，发布端、订阅端均存在性能瓶颈，均需要优化。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>G100 3.0.9 psu2及之后版本&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>发布端：逻辑复制场景，发送数据方。&lt;/li>
&lt;li>订阅端：逻辑复制场景，接收数据方。&lt;/li>
&lt;/ul>
&lt;h2 id="14-参考资料">1.4 参考资料&lt;/h2>
&lt;ul>
&lt;li>Vastbase G100产品文档中逻辑复制使用介绍：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6&lt;/a>&lt;/li>
&lt;li>oracle goldengate并行复制：&lt;a href="https://oracle.hydrogen.sagittarius.connect.product.adaptavist.com/en/database/goldengate/core/26/coredoc/replicat-parallel-replicat.html#GUID-F1CD8E03-8DA1-4A78-95D3-C0516F1DA09A">https://oracle.hydrogen.sagittarius.connect.product.adaptavist.com/en/database/goldengate/core/26/coredoc/replicat-parallel-replicat.html#GUID-F1CD8E03-8DA1-4A78-95D3-C0516F1DA09A&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-逻辑复制性能优化">2 逻辑复制性能优化&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="一逻辑复制使用示例">一、逻辑复制使用示例&lt;/h3>
&lt;p>使用逻辑复制，可概括为3个阶段：&lt;/p></description></item><item><title>G100学习笔记</title><link>https://my-blog.j8465383071.workers.dev/posts/database/g100%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link><pubDate>Fri, 11 Sep 2026 12:09:29 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/g100%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid><description>&lt;h1 id="g100学习笔记">G100学习笔记&lt;/h1>
&lt;h2 id="1-page相关">1. page相关&lt;/h2>
&lt;h3 id="11-page的关键数据结构">1.1 page的关键数据结构&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PageXLogRecPtr&lt;/span> &lt;span class="n">pd_lsn&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 当前页的最后一次修改对应的WAL记录的LSN */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16&lt;/span> &lt;span class="n">pd_checksum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 当前页的checksum校验和，用来维护页面的完整性，使用特定的算法生成固定大小的值，在写入时计算，读取时校验，读取时计算checksum，与本记录比对 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16&lt;/span> &lt;span class="n">pd_flags&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* 页状态标志位 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16&lt;/span> &lt;span class="n">pd_lower&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">}
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Babelfish搭建指南</title><link>https://my-blog.j8465383071.workers.dev/posts/database/babelfish_build/</link><pubDate>Fri, 27 Feb 2026 14:30:01 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/babelfish_build/</guid><description>&lt;h1 id="babelfish-编译环境搭建指南">Babelfish 编译环境搭建指南&lt;/h1>
&lt;blockquote>
&lt;p>适用环境：CentOS 7，离线环境，vastbase-server + sqlserver-extensions&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="一创建用户">一、创建用户&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建用户并设置密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">useradd vast
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;vast:gauss@123&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> chpasswd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 授予 sudo 权限（加入 wheel 组）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">usermod -aG wheel vast
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 验证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id vast
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="二配置环境变量">二、配置环境变量&lt;/h2>
&lt;p>将以下内容写入 &lt;code>~/.bash_profile&lt;/code>，&lt;strong>每次登录自动生效&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cat &amp;gt;&amp;gt; ~/.bash_profile &lt;span class="s">&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># Babelfish 基础路径
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export BABELFISH_HOME=~/vastbase-server/install
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export BINARYLIBS=~/vastbase-server/binarylibs
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export GCC_PATH=$BINARYLIBS/buildtools/gcc7.3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># 编译器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export CC=$GCC_PATH/gcc/bin/gcc
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export CXX=$GCC_PATH/gcc/bin/g++
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># cmake（优先使用项目自带版本，放在 PATH 最前面）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export PATH=$BINARYLIBS/buildtools/cmake/bin:$GCC_PATH/gcc/bin:$BABELFISH_HOME/bin:$PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># 动态库路径
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export LD_LIBRARY_PATH=$GCC_PATH/gcc/lib64:$BABELFISH_HOME/lib:$BINARYLIBS/kernel/dependency/openssl/comm/lib:$LD_LIBRARY_PATH
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># cmake 变量（防止 Makefile 调用系统旧版本）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export cmake=$(which cmake)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"># PG 相关
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export PG_CONFIG=$BABELFISH_HOME/bin/pg_config
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">export PG_SRC=`pwd`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bash_profile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>验证工具版本：&lt;/p></description></item><item><title>避免用户错误使用到pg插件</title><link>https://my-blog.j8465383071.workers.dev/posts/database/forbid-extension/</link><pubDate>Wed, 25 Feb 2026 10:15:33 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/forbid-extension/</guid><description>&lt;h2 id="基本概念">基本概念&lt;/h2>
&lt;p>这里是融合版的一个需求，属于兼容性需求类别，主要实现的是一个黑名单，是要把一个列表中的多个插件不允许在MSSQL兼容安装包中出现，或只能在5432端口（PG模式）中使用，不能在1433端口（MSSQL模式）中使用。&lt;/p>
&lt;h2 id="初步分析">初步分析&lt;/h2>
&lt;p>根据需求列表，可以基本将需要修改的插件分为三类：&lt;/p>
&lt;ul>
&lt;li>禁止在双端口安装使用；&lt;/li>
&lt;li>在5432端口允许使用，1433端口禁止安装使用；&lt;/li>
&lt;li>双端口都允许使用；&lt;/li>
&lt;/ul>
&lt;p>其中，需求描述特别提到，允许在编译阶段进行修改，由此可以对应的提出三类插件的修改方案：&lt;/p>
&lt;ul>
&lt;li>在编译阶段不安装，也就是在contrib/Makefile中的SUBDIR安装插件，删除这些不允许在双端口安装的插件；&lt;/li>
&lt;li>在hooks.c中增加一个名单，名单中包含这些允许在5432不允许在1433安装的插件，首先检测当前dialect是否为tsql，如果为tsql，检查是否是T_CreExtensionStmt，如果是则检查插件名单是否在这个名单之内，如果没有则放行，有则报错；&lt;/li>
&lt;li>不做任何处理；&lt;/li>
&lt;/ul>
&lt;p>理论上，以上方案实施后，能够达到双端口不可用则直接无法找到插件，用户自行安装则不保证可能出现的任何问题；对于5432可用1433不可用，会进行报错；其他类型不做处理；应该可以达到需求描述的目的实现；&lt;/p>
&lt;h2 id="边界考虑">边界考虑&lt;/h2>
&lt;ul>
&lt;li>由于删除了某些插件编译且对某些插件在一定场景进行了屏蔽，考虑数据库升级场景，如果以前使用过此插件，现在进行了屏蔽，可能导致升级失败；&lt;/li>
&lt;/ul>
&lt;h2 id="灵活性">灵活性&lt;/h2>
&lt;ul>
&lt;li>现在的屏蔽方式是使用直接修改编译文件与硬编码名单的方式实现，如果在一个版本内，由于某些特殊原因想启用已屏蔽的插件，则在当前版本是无法实现的。如果将名单作成guc参数，则可以提供灵活性，但是一旦被手动篡改，则无法预料可能产生的问题；&lt;/li>
&lt;/ul></description></item><item><title>深度优先遍历</title><link>https://my-blog.j8465383071.workers.dev/posts/algorithm/dfs/</link><pubDate>Tue, 24 Feb 2026 12:02:52 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/algorithm/dfs/</guid><description>&lt;p>今天的每日一题：1202. 从根到叶的二进制数之和。&lt;/p>
&lt;p>简单来说，就是给定一颗层序遍历的数组，表示一颗树，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">输入：root &lt;span class="o">=&lt;/span> &lt;span class="o">[&lt;/span>1,0,1,0,1,0,1&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">输出：22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">解释：&lt;span class="o">(&lt;/span>100&lt;span class="o">)&lt;/span> + &lt;span class="o">(&lt;/span>101&lt;span class="o">)&lt;/span> + &lt;span class="o">(&lt;/span>110&lt;span class="o">)&lt;/span> + &lt;span class="o">(&lt;/span>111&lt;span class="o">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">4&lt;/span> + &lt;span class="m">5&lt;/span> + &lt;span class="m">6&lt;/span> + &lt;span class="nv">7&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">22&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以表示为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / &lt;span class="se">\ &lt;/span> / &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="m">0&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>思路就是使用dfs来遍历这个树，代码为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C++" data-lang="C++">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * Definition for a binary tree node.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * struct TreeNode {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * int val;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * TreeNode *left;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * TreeNode *right;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * TreeNode() : val(0), left(nullptr), right(nullptr) {}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * };
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Solution&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">dfs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TreeNode&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">val&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">val&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">left&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">right&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nf">dfs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">left&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">dfs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">right&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="nf">sumRootToLeaf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TreeNode&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">dfs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>拿到这个题就知道用dfs，但是这个计算的方式确实没想到，二进制移位操作，并且使用局部变量保存临时结果，就不需要复杂的字符串拼接然后转换10进制了，例如上例：&lt;/p></description></item><item><title>逻辑复制</title><link>https://my-blog.j8465383071.workers.dev/posts/database/logical_replication/</link><pubDate>Tue, 10 Feb 2026 16:15:52 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/database/logical_replication/</guid><description>&lt;h2 id="基本概念">基本概念&lt;/h2>
&lt;p>逻辑复制是数据同步的一种方式，逻辑二字主要指的是传输数据的格式，与之相对的是物理复制。&lt;/p>
&lt;h3 id="逻辑数据格式">逻辑数据格式&lt;/h3>
&lt;p>逻辑数据格式是指，能够由一定规则描述的，符合SQL直觉的一种数据格式，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>MsgType：Insert，Relation：test，New Tuple：&lt;span class="o">[&lt;/span>a, int, 100&lt;span class="o">]]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从这种数据格式上，能够通过解析等方式，将数据还原为SQL语句，这也同时表现了逻辑复制的第一个特点：&lt;strong>无视物理结构上的差异，可以在异构、跨版本的数据库之间进行数据同步&lt;/strong>。&lt;/p>
&lt;p>接上例，通过一定的解析步骤，我们总能够得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">Insert&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">into&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">values&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于不同内核来说，可能在语法上稍有差异，但只需要修改一些解析方式，也能够得到自身看的懂、可以运行的命令。&lt;/p>
&lt;h3 id="与物理复制的区别">与物理复制的区别&lt;/h3>
&lt;p>逻辑复制的另外一个特点，是相对于另一种主流的数据同步方式：物理复制，来作为比较的。&lt;/p>
&lt;p>几乎所有的数据库内核，在进行数据存储的时候，都是采用随机写的方式，最大化利用性能优势，将数据存储在磁盘上。那么从物理上看，一个relation的所有数据，可能并不是连续的：他们可能分布在不同的page上，由指针进行连接。那么从磁盘角度看，一个page的分布，可能是这样的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Page Header
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tuple &lt;span class="m">1&lt;/span> &lt;span class="k">for&lt;/span> r1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tuple &lt;span class="m">2&lt;/span> &lt;span class="k">for&lt;/span> r1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tuple &lt;span class="m">1&lt;/span> &lt;span class="k">for&lt;/span> r2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tuple &lt;span class="m">1&lt;/span> &lt;span class="k">for&lt;/span> r3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tuple &lt;span class="m">2&lt;/span> &lt;span class="k">for&lt;/span> r2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如此一来，想要在物理层面进行数据传输时，以page为单位，是无法将不同relation的tuple分开的，也就是细粒度不够。&lt;/p>
&lt;p>逻辑复制的另一个特点，是可以以表为单位，进行数据同步，由一个Reader完成。&lt;/p>
&lt;p>Reader逐行的去读取物理中的tuple，筛选那些符合要求的tuple，进行下一步工作。&lt;/p>
&lt;p>逻辑复制提高的数据同步的细粒度，可以在库、表、甚至行上进行数据过滤，显然是一种更灵活的同步方式，在某些场景下，其效果更好，常见的有：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>应用场景&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>某数据库使用厂商需要进行版本升级，但升级前后版本由于迭代问题，在物理存储上存在差异，导致无法进行直接替换；&lt;/li>
&lt;li>某数据库使用厂商需要将原有的数据库数据迁移到一款新的数据库产品上，而这两个数据库的内核架构完全不同，物理存储存在本质差异；&lt;/li>
&lt;li>某厂商部门之间使用的数据库产品不同，但部门之间存在协作，需要进行数据传递；
&amp;hellip;&lt;/li>
&lt;/ol>&lt;/blockquote>
&lt;h2 id="架构">架构&lt;/h2>
&lt;p>&lt;img alt="alt text" loading="lazy" src="image.png">&lt;/p>
&lt;p>如图所示，逻辑复制功能，是两个实例（或生产者与消费者）之间完成的数据同步，通常我们把作为数据源端的实例，称为发布端（Publisher），而准备接收数据并进行回放的实例称为订阅端（Subscriber）。&lt;/p>
&lt;h3 id="发布端">发布端&lt;/h3>
&lt;p>发布端的组成部分，共分为以下几个部分：WALReader、Decoder、Sender，通常是由三个独立的线程，按照其角色完成不同的工作：&lt;/p>
&lt;ul>
&lt;li>WALReader：主要完成对Xlog日志的读取，即从磁盘上将当前已罗盘的Xlog record读取到内存，并发送给Decoder；&lt;/li>
&lt;li>Decoder：解码线程，由于WALReader发送来的数据，是物理层面的记录，Decoder会按照特定的规则，将物理信息转换为逻辑信息，从内存上看，使用一个结构体，保存Xlog record中的xid、LSN、DMLType等信息。同时，Decoder还需要将这些信息，按照约定好的协议（Protocol）将数据进行打包，其中应用最广泛的端到端协议是pgoutput（后面会介绍他的协议格式以及细节实现）。Decoder会将这些按照协议进行拼接的逻辑数据存储到私有内存中，当达到一定条件时，将数据发送给Sender线程执行发送。&lt;/li>
&lt;li>Sender：将Decoder发送来的数据通过网络发送给订阅端。&lt;/li>
&lt;/ul>
&lt;h4 id="发布端如何保证事务一致性">发布端如何保证事务一致性&lt;/h4>
&lt;p>对于数据同步来说，最重要的是事务一致性，如果不能保证一致性，那么逻辑复制将是毫无意义的。而要保证事务一致性，通常主要责任在于发布端，发布端需要确保自己发送逻辑信息的顺序，是严格的，即使不能保证发送顺序一定与WAL日志写入顺序完全一致，但必须保证事务的最终一致性。为了保证事务一致性，在发布端，通常会有以下几个部分保证：&lt;/p>
&lt;ul>
&lt;li>严格按照commit顺序进行事务发送：事务的提交顺序非常重要，Decoder解码到一条逻辑数据时，并不会立刻发送给Sender，而是将条变更存储起来，直到解码到该事务对应的commit，才将整个事务完发送；&lt;/li>
&lt;li>错误重发：当订阅端接收到一个事务的commit时，即代表这个事务经传输完毕，订阅端会发送一个确认LSN给发布端，发布端需要确认LSN是在当前处理LSN的前面，如果此时LSN发生错乱，发布端会立即这条返回的LSN开始，重新发送这些变更；&lt;/li>
&lt;li>commit时间确认：在Decoder将Xlog信息解码为逻辑协议信息时对于某些类型的消息，会携带commit timestampz，这是该事务提时的瞬时时间戳；&lt;/li>
&lt;/ul>
&lt;h4 id="发布端对于内存的管理">发布端对于内存的管理&lt;/h4>
&lt;p>在业务系统中，有时不可避免的会出现大事务，通常包含几M甚至百M的事务变更数据，在逻辑复制模块中，上文提到，通常是将所有事务存储于内存，当遇到该事务的commit时，才进行发送。对于这种大事务来说，如果多几条，可能很容易造成内存压力，引起CPU抖动，有影响系统整体性能的可能性。&lt;/p>
&lt;p>为了保证系统整体性能，当遇到这种大事务的时候，通常会设计一个内存阈值，当在内存中已经存储了多条事务变更时，一旦当前内存占用达到阈值，发布端会选择当前内存中一个最大的事务（不一定是完整的，只是transaction size最大）spill to disk；诚然，这会带来一定的IO开销，因为当我们读到被spill的事务的commit时，需要把它从磁盘上读出来，但相比于其带来的内存负荷，这是合理的取舍。&lt;/p></description></item><item><title>0.Readme</title><link>https://my-blog.j8465383071.workers.dev/posts/readme/</link><pubDate>Tue, 10 Feb 2026 16:05:44 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/readme/</guid><description>&lt;h1 id="关于">关于&lt;/h1>
&lt;p>把这里当成第一步，开始积累自己的东西，当有一天面对外部变化，能够从从容容、游刃有余。&lt;/p>
&lt;p>我是贾旭辉，我希望能够养成良好的习惯，开始随手记录一些工作中、生活中积累到的东西。&lt;/p>
&lt;p>种下一棵树最好的时间是十年前，其次就是现在了。&lt;/p>
&lt;pre>&lt;code> -- 2026.02.10
&lt;/code>&lt;/pre></description></item><item><title>海量 0 机密计算</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/0-confidential-computing/</link><pubDate>Mon, 12 Jan 2026 16:49:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/0-confidential-computing/</guid><description>&lt;h1 id="概述">概述&lt;/h1>
&lt;h2 id="11-机密计算">1.1 机密计算&lt;/h2>
&lt;h2 id="12-可信执行环境">1.2 可信执行环境&lt;/h2></description></item></channel></rss>