<?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>数据库 on Kernel Notes</title><link>https://my-blog.j8465383071.workers.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/</link><description>Recent content in 数据库 on Kernel Notes</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><lastBuildDate>Fri, 14 Aug 2026 17:47:31 +0800</lastBuildDate><atom:link href="https://my-blog.j8465383071.workers.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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/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></channel></rss>