1
0
wiki/Tech/database-system/PostgreSQL/安装配置.html

1212 lines
514 KiB
HTML
Raw Normal View History

2024-07-19 18:08:14 +08:00
<!DOCTYPE html>
<html><head><title>安装配置</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="安装配置"/><meta property="og:description" content="Postgresql 安装配置."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../../static/icon.png"/><meta name="description" content="Postgresql 安装配置."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><script async src="https://umami.7wate.com/script.js" data-website-id="c061efdc-95dd-4d21-9d04-a1ffda0a85b9"></script><script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?94d8ccb156eb7c65abf317e6e01cdba9";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-MHMEL0F832"></script><script>
(function() {
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-MHMEL0F832');
})();
</script><link href="../../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&amp;family=Schibsted Grotesk:wght@400;700&amp;family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&amp;display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../../../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="Tech/database-system/PostgreSQL/安装配置"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="../../..">📚 X·Eden</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg></label><label id="toggle-label-dark" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background='new 0 0 100 100'" xmlSpace="preserve"><title>Dark mode</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.
<p>对于初学者和有经验的开发者来说,正确地安装和配置 PostgreSQL 是至关重要的。一个恰当的配置不仅可以确保数据库的稳定运行,还可以充分发挥其性能,满足复杂的业务需求。然而,由于 PostgreSQL 的功能丰富和配置项繁多,很多人在安装和配置过程中可能会遇到困惑和挑战。</p>
<p>PostgreSQL 提供了多种安装方式,其中源码安装和编译安装是最为基础和原始的方法。这两种方法虽然相对复杂,但为用户提供了极大的灵活性,允许他们根据自己的需求进行定制和优化。</p>
<h2 id="依赖">依赖<a aria-hidden="true" tabindex="-1" href="#依赖" class="internal"> §</a></h2>
<table><thead><tr><th>依赖</th><th>版本</th><th>用途</th><th>状态</th><th>备注</th></tr></thead><tbody><tr><td>GNU make</td><td>3.81 或更高</td><td>构建 PostgreSQL</td><td></td><td>必需; 其他版本或其他 make 程序不可用</td></tr><tr><td>ISO/ANSI C compiler</td><td>C99 兼容</td><td>编译 PostgreSQL</td><td></td><td>必需; 推荐使用 GCC 的最新版本</td></tr><tr><td>tar</td><td>无特定版本</td><td>解压源代码分发包</td><td></td><td>必需; 需要配合 gzip 或 bzip2 使用</td></tr><tr><td>GNU Readline library</td><td>无特定版本</td><td>提高 PostgreSQL 命令行 SQL 解释器的用户体验</td><td></td><td>必需; 可以选择不使用或使用 libedit 库作为替代</td></tr><tr><td>zlib</td><td>无特定版本</td><td>支持 pg_dump 和 pg_restore 中的压缩存档功能</td><td></td><td>必需; 可以选择不使用</td></tr><tr><td>Perl</td><td>5.8.3 或更高</td><td>构建 PL/Perl 服务器编程语言</td><td>🟢</td><td>可选; 需要 libperl 共享库和头文件</td></tr><tr><td>Python</td><td>3.2 或更高</td><td>构建 PL/Python 服务器编程语言</td><td>🟢</td><td>可选; 需要 libpython 共享库和头文件</td></tr><tr><td>Tcl</td><td>8.4 或更高</td><td>构建 PL/Tcl 程序语言</td><td>🟢</td><td>可选; 需要 Tcl 安装</td></tr><tr><td>OpenSSL</td><td>1.0.1 或更高</td><td>支持加密的客户端连接和随机数生成</td><td>🟢</td><td>可选; 用于支持加密的客户端连接和随机数生成</td></tr><tr><td>Gettext API</td><td>无特定版本</td><td>实现 Native Language Support (NLS)</td><td>🟢</td><td>可选; 用于显示程序的非英语消息</td></tr><tr><td>Kerberos</td><td>无特定版本</td><td>支持 Kerberos 认证</td><td>🟢</td><td>可选; 用于支持 Kerberos 认证</td></tr><tr><td>OpenLDAP</td><td>无特定版本</td><td>支持 OpenLDAP 认证</td><td>🟢</td><td>可选; 用于支持 OpenLDAP 认证</td></tr><tr><td>PAM</td><td>无特定版本</td><td>支持 PAM 认证</td><td>🟢</td><td>可选; 用于支持 PAM 认证</td></tr><tr><td>LZ4</td><td>无特定版本</td><td>支持 LZ4 数据压缩</td><td>🟢</td><td>可选; 用于支持 LZ4 数据压缩</td></tr><tr><td>Zstandard</td><td>1.4.0 或更高</td><td>支持 Zstandard 数据压缩</td><td>🟢</td><td>可选; 用于支持 Zstandard 数据压缩</td></tr></tbody></table>
<ul>
<li>✅ 表示必需</li>
<li>🟢 表示可选</li>
</ul>
<h3 id="基本依赖">基本依赖<a aria-hidden="true" tabindex="-1" href="#基本依赖" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># YUM 更新软件仓库 &amp;&amp; 安装必需的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;&amp;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gcc</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tar</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gzip</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">bzip2</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">readline</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">readline-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">zlib</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">zlib-devel</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># APT 更新软件仓库 &amp;&amp; 安装必需的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;&amp;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gcc</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tar</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gzip</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">bzip2</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libreadline-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">zlib1g-dev</span></span></code></pre></div>
<h3 id="拓展依赖">拓展依赖<a aria-hidden="true" tabindex="-1" href="#拓展依赖" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># YUM 更新软件仓库 &amp;&amp; 安装可选的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;&amp;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">perl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">perl-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">python3</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">python3-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tcl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tcl-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">openssl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">openssl-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gettext</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">krb5</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">krb5-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">openldap</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">openldap-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">pam</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">pam-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">lz4</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">lz4-devel</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">zstd</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">zstd-devel</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># APT 更新软件仓库 &amp;&amp; 安装可选的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;&amp;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-y</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">perl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libperl-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">python3</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">python3-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tcl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tcl-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libssl-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gettext</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">krb5-user</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libkrb5-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libldap2-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libpam0g-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">liblz4-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libzstd-dev</span></span></code></pre></div>
<h3 id="依赖检查">依赖检查<a aria-hidden="true" tabindex="-1" href="#依赖检查" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);">#!/bin/bash</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 检查包管理器</span></span>
<span data-line><span style="color:var(--shiki-token-comment);"># 可自定义依赖检查项目</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">command</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-v</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> /dev/null; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> PACKAGE_MANAGER</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string-expression);">&quot;yum&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> REQUIRED_DEPENDENCIES</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-string-expression);">&quot;make&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gcc&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tar&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gzip&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;bzip2&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;readline&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;readline-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;zlib&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;zlib-devel&quot;</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> OPTIONAL_DEPENDENCIES</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-string-expression);">&quot;perl&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;perl-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;python3&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;python3-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tcl&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tcl-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;openssl&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;openssl-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gettext&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;krb5&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;krb5-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;openldap&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;openldap-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;pam&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;pam-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;lz4&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;lz4-devel&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;zstd&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;zstd-devel&quot;</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">elif</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">command</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-v</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt-get</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-punctuation);">&amp;</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> /dev/null; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> PACKAGE_MANAGER</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string-expression);">&quot;apt-get&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> REQUIRED_DEPENDENCIES</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-string-expression);">&quot;make&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gcc&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tar&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gzip&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;bzip2&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libreadline-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;zlib1g-dev&quot;</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> OPTIONAL_DEPENDENCIES</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-string-expression);">&quot;perl&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libperl-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;python3&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;python3-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tcl&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;tcl-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libssl-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;gettext&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;krb5-user&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libkrb5-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libldap2-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libpam0g-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;liblz4-dev&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;libzstd-dev&quot;</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">else</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;❌ 不支持的包管理器。&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">exit</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">1</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 定义一个函数来检查依赖是否安装,并显示版本信息</span></span>
<span data-line><span style="color:var(--shiki-token-function);">check_dependency</span><span style="color:var(--shiki-token-punctuation);">()</span><span style="color:var(--shiki-color-text);"> {</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">local</span><span style="color:var(--shiki-color-text);"> package_name</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">$1</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> [ </span><span style="color:var(--shiki-token-keyword);">-z</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;$package_name&quot;</span><span style="color:var(--shiki-color-text);"> ]; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;错误:未提供依赖项名称。&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">exit</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">1</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> [ </span><span style="color:var(--shiki-token-string-expression);">&quot;$PACKAGE_MANAGER&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">==</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;yum&quot;</span><span style="color:var(--shiki-color-text);"> ]; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">rpm</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-q</span><span style="color:var(--shiki-color-text);"> $package_name </span><span style="color:var(--shiki-token-punctuation);">&amp;</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> /dev/null; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> version</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string-expression);">$(</span><span style="color:var(--shiki-token-function);">rpm</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-string);">-q</span><span style="color:var(--shiki-token-string-expression);"> $package_name)</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">printf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot; ✅ %-20s 版本: %s\n&quot;</span><span style="color:var(--shiki-color-text);"> $package_name </span><span style="color:var(--shiki-token-string-expression);">&quot;$version&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">else</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">printf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot; ❌ %-20s 未安装\n&quot;</span><span style="color:var(--shiki-color-text);"> $package_name</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">elif</span><span style="color:var(--shiki-color-text);"> [ </span><span style="color:var(--shiki-token-string-expression);">&quot;$PACKAGE_MANAGER&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">==</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;apt-get&quot;</span><span style="color:var(--shiki-color-text);"> ]; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">dpkg</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-s</span><span style="color:var(--shiki-color-text);"> $package_name </span><span style="color:var(--shiki-token-punctuation);">&amp;</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> /dev/null; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> version</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string-expression);">$(</span><span style="color:var(--shiki-token-function);">dpkg</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-string);">-s</span><span style="color:var(--shiki-token-string-expression);"> $package_name </span><span style="color:var(--shiki-token-keyword);">|</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-string);">Version</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-keyword);">|</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-function);">cut</span><span style="color:var(--shiki-token-string-expression);"> </span><span style="color:var(--shiki-token-string);">-d</span><span style="color:var(--shiki-token-string-expression);">' ' </span><span style="color:var(--shiki-token-string);">-f2</span><span style="color:var(--shiki-token-string-expression);">)</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">if</span><span style="color:var(--shiki-color-text);"> [ </span><span style="color:var(--shiki-token-keyword);">-z</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;$version&quot;</span><span style="color:var(--shiki-color-text);"> ]; </span><span style="color:var(--shiki-token-keyword);">then</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> version</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string-expression);">&quot;未知&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">printf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot; ✅ %-20s 版本: %s\n&quot;</span><span style="color:var(--shiki-color-text);"> $package_name </span><span style="color:var(--shiki-token-string-expression);">&quot;$version&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">else</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">printf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot; ❌ %-20s 未安装\n&quot;</span><span style="color:var(--shiki-color-text);"> $package_name</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">fi</span></span>
<span data-line><span style="color:var(--shiki-color-text);">}</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 定义一个函数来检查依赖项数组</span></span>
<span data-line><span style="color:var(--shiki-token-function);">check_dependencies</span><span style="color:var(--shiki-token-punctuation);">()</span><span style="color:var(--shiki-color-text);"> {</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">local</span><span style="color:var(--shiki-color-text);"> dependencies</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-string-expression);">&quot;$@&quot;</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">for</span><span style="color:var(--shiki-color-text);"> dependency </span><span style="color:var(--shiki-token-keyword);">in</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;${dependencies[@]}&quot;</span><span style="color:var(--shiki-color-text);">; </span><span style="color:var(--shiki-token-keyword);">do</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">check_dependency</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;$dependency&quot;</span></span>
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">done</span></span>
<span data-line><span style="color:var(--shiki-color-text);">}</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 检查必需的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;Postgres 依赖检查&quot;</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;=> 必需的依赖:&quot;</span></span>
<span data-line><span style="color:var(--shiki-token-function);">check_dependencies</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;${REQUIRED_DEPENDENCIES[@]}&quot;</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 检查可选的依赖</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;&quot;</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;=> 可选的依赖:&quot;</span></span>
<span data-line><span style="color:var(--shiki-token-function);">check_dependencies</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;${OPTIONAL_DEPENDENCIES[@]}&quot;</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 输出检查完成信息</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;&quot;</span></span>
<span data-line><span style="color:var(--shiki-token-function);">echo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;=> 依赖检查完成!&quot;</span></span></code></pre></div>
<h2 id="安装">安装<a aria-hidden="true" tabindex="-1" href="#安装" class="internal"> §</a></h2>
<h3 id="源码安装">源码安装<a aria-hidden="true" tabindex="-1" href="#源码安装" class="internal"> §</a></h3>
<h4 id="1-准备工作">1. 准备工作<a aria-hidden="true" tabindex="-1" href="#1-准备工作" class="internal"> §</a></h4>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 创建用户</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">adduser</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">passwd</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 创建目录</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">mkdir</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-p</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/opt/postgresql/{data,archive,scripts,backup,pg16,source,logs,config,temp,extensions,upgrade_scripts}</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 配置目录权限,后续默认以 postgres 用户操作</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">chown</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-R</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres:postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/opt/postgresql</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">chmod</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-R</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">775</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/opt/postgresql</span></span></code></pre></div>
<p>postgresql 目录下文件夹其对应的用途。</p>
<table><thead><tr><th align="left">目录</th><th align="left">用途</th></tr></thead><tbody><tr><td align="left">/data</td><td align="left">存储 PostgreSQL 数据</td></tr><tr><td align="left">/archive</td><td align="left">存储归档日志文件</td></tr><tr><td align="left">/scripts</td><td align="left">存储 PostgreSQL 脚本</td></tr><tr><td align="left">/backup</td><td align="left">存储数据库备份</td></tr><tr><td align="left">/pgsql</td><td align="left">软连接到 /pg16</td></tr><tr><td align="left">/pg16</td><td align="left">PostgreSQL 16 版本</td></tr><tr><td align="left">/source</td><td align="left">存储源代码或配置文件</td></tr><tr><td align="left">/logs</td><td align="left">存储 PostgreSQL 日志</td></tr><tr><td align="left">/config</td><td align="left">存储 PostgreSQL 配置</td></tr><tr><td align="left">/temp</td><td align="left">存储临时文件</td></tr><tr><td align="left">/extensions</td><td align="left">存储 PostgreSQL 扩展</td></tr><tr><td align="left">/upgrade_scripts</td><td align="left">存储升级脚本</td></tr></tbody></table>
<h4 id="2-下载源码">2. 下载源码<a aria-hidden="true" tabindex="-1" href="#2-下载源码" class="internal"> §</a></h4>
<p>PostgreSQL 源码可以在官方提供的 <a href="https://www.postgresql.org/ftp/source/" class="external">FTP 渠道</a> 下载。</p>
<p><img src="https://static.7wate.com/img/2023/09/22/7f25aaababea4.png" alt="PostgreSQL 源码"/></p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 切换用户</span></span>
<span data-line><span style="color:var(--shiki-token-function);">su</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 下载 PG16 </span></span>
<span data-line><span style="color:var(--shiki-token-function);">postgres@debian:/opt/postgresql/source$</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">wget</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 解压 PG16</span></span>
<span data-line><span style="color:var(--shiki-token-function);">postgres@debian:/opt/postgresql/source$</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tar</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-zxvf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql-16.0.tar.gz</span></span></code></pre></div>
<h4 id="3-配置源码">3. 配置源码<a aria-hidden="true" tabindex="-1" href="#3-配置源码" class="internal"> §</a></h4>
<p>首先,你需要配置源代码树以适应你的系统并选择你想要的选项。这是通过运行 <code>configure</code> 脚本完成的。你可以使用以下命令进行默认安装:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 安装 /opt/postgresql/pg16/ 路径</span></span>
<span data-line><span style="color:var(--shiki-token-function);">postgres@debian:/opt/postgresql/source/postgresql-16.0$</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">./configure</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--prefix=/opt/postgresql/pg16/</span></span></code></pre></div>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 默认安装</span></span>
<span data-line><span style="color:var(--shiki-token-function);">./configure</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 指定多个选项</span></span>
<span data-line><span style="color:var(--shiki-token-function);">./configure</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--prefix=/usr/local/pgsql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--bindir=/usr/local/pgsql/bin</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--datadir=/usr/local/pgsql/data</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--libdir=/usr/local/pgsql/lib</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 禁用某些功能</span></span>
<span data-line><span style="color:var(--shiki-token-function);">./configure</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--without-readline</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--without-zlib</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 启用调试和指定编译器</span></span>
<span data-line><span style="color:var(--shiki-token-function);">./configure</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--enable-debug</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--with-pgport=5432</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">CC=gcc</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">CFLAGS=</span><span style="color:var(--shiki-token-string-expression);">'-O2 -g'</span></span></code></pre></div>
<table><thead><tr><th align="left">选项</th><th align="left">描述</th></tr></thead><tbody><tr><td align="left"><code>--prefix=&lt;目录></code></td><td align="left">指定安装目录的前缀,即 PostgreSQL 将被安装到的基本目录。</td></tr><tr><td align="left"><code>--bindir=&lt;目录></code></td><td align="left">指定可执行文件的目录,例如 <code>pg_ctl</code><code>psql</code></td></tr><tr><td align="left"><code>--sbindir=&lt;目录></code></td><td align="left">指定系统管理员可执行文件的目录,例如 <code>pg_ctl</code><code>pg_config</code></td></tr><tr><td align="left"><code>--datadir=&lt;目录></code></td><td align="left">指定数据文件的根目录,例如数据表空间。</td></tr><tr><td align="left"><code>--libdir=&lt;目录></code></td><td align="left">指定库文件的目录,例如共享库文件。</td></tr><tr><td align="left"><code>--sysconfdir=&lt;目录></code></td><td align="left">指定配置文件的目录。</td></tr><tr><td align="left"><code>--docdir=&lt;目录></code></td><td align="left">指定文档文件的目录。</td></tr><tr><td align="left"><code>--includedir=&lt;目录></code></td><td align="left">指定包含头文件的目录,用于开发 PostgreSQL 扩展。</td></tr><tr><td align="left"><code>--with-openssl</code></td><td align="left">启用 OpenSSL 支持,用于加密通信。</td></tr><tr><td align="left"><code>--with-zlib</code></td><td align="left">启用 Zlib 支持,用于数据压缩。</td></tr><tr><td align="left"><code>--with-libxml</code></td><td align="left">启用 Libxml2 支持,用于 XML 数据类型。</td></tr><tr><td align="left"><code>--with-python</code></td><td align="left">启用 Python 支持,用于编写存储过程和触发器。</td></tr><tr><td align="left"><code>--with-perl</code></td><td align="left">启用 Perl 支持,用于编写存储过程和触发器。</td></tr><tr><td align="left"><code>--with-tcl</code></td><td align="left">启用 Tcl 支持,用于编写存储过程和触发器。</td></tr><tr><td align="left"><code>--with-pam</code></td><td align="left">启用 PAM (Pluggable Authentication Modules) 支持。</td></tr><tr><td align="left"><code>--with-ldap</code></td><td align="left">启用 LDAP 支持,用于身份验证和用户管理。</td></tr><tr><td align="left"><code>--with-krb5</code></td><td align="left">启用 Kerberos 支持,用于身份验证。</td></tr><tr><td align="left"><code>--with-system-tzdata</code></td><td align="left">使用操作系统提供的时区信息。</td></tr><tr><td align="left"><code>--enable-debug</code></td><td align="left">启用调试支持,构建时包括调试信息。</td></tr><tr><td align="left"><code>--disable-ipv6</code></td><td align="left">禁用 IPv6 支持。</td></tr></tbody></table>
<h4 id="4-构建二进制">4. 构建二进制<a aria-hidden="true" tabindex="-1" href="#4-构建二进制" class="internal"> §</a></h4>
<p>可以输入以下任一命令开始构建,可以使用 -j 选项指定线程数加快速度。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 多线程构建</span></span>
<span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-j</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">8</span><span style="color:var(--shiki-color-text);"> </span></span></code></pre></div>
<p>如果你想构建所有可以构建的内容包括文档HTML 和 man 页面和附加模块contrib则可以输入</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">world</span></span></code></pre></div>
<p>或者如果你想构建所有可以构建的内容包括附加模块contrib但不包括文档可以输入</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">world-bin</span></span></code></pre></div>
<h4 id="5-测试软件">5. 测试软件<a aria-hidden="true" tabindex="-1" href="#5-测试软件" class="internal"> §</a></h4>
<p>如果你想在安装之前测试新构建的服务器,你可以在此时运行回归测试。这是一个测试套件,用于验证 PostgreSQL 是否按照开发人员预期的方式在你的机器上运行。可以使用以下命令进行测试:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">check</span></span></code></pre></div>
<h4 id="6-安装">6. 安装<a aria-hidden="true" tabindex="-1" href="#6-安装" class="internal"> §</a></h4>
<p>要安装 PostgreSQL可以输入</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span></span></code></pre></div>
<p>此步骤将把文件安装到第一步中指定的目录中。**确保你有适当的权限写入该区域。**或者,你可以提前创建目标目录并安排授予适当的权限。</p>
<p>如果你构建了上面的 world可以输入</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install-world</span></span></code></pre></div>
<p>这也会安装文档。如果你在上面构建了不包含文档的 world可以输入</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install-world-bin</span></span></code></pre></div>
<h4 id="7-配置软连">7. 配置软连<a aria-hidden="true" tabindex="-1" href="#7-配置软连" class="internal"> §</a></h4>
<p>设置 postgres 软链接,方便系统后续升级。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">ln</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-s</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/opt/postgres/pg16</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/opt/postgresql/pgsql</span></span></code></pre></div>
<h4 id="8-卸载和清理">8. 卸载和清理<a aria-hidden="true" tabindex="-1" href="#8-卸载和清理" class="internal"> §</a></h4>
<p>如果要撤销安装,可以使用命令 <code>make uninstall</code>。但是,这不会删除任何创建的目录。</p>
<p>安装后,你可以通过从源代码树中删除构建文件来释放磁盘空间,命令是 <code>make clean</code>。这将保留 <code>configure</code> 程序创建的文件,以便你稍后可以使用 <code>make</code> 重新构建所有内容。要将源代码树重置为分发时的状态,请使用 <code>make distclean</code></p>
<h3 id="二进制安装">二进制安装<a aria-hidden="true" tabindex="-1" href="#二进制安装" class="internal"> §</a></h3>
<h4 id="1-下载">1. 下载<a aria-hidden="true" tabindex="-1" href="#1-下载" class="internal"> §</a></h4>
<p>在开始二进制安装之前,你需要首先下载适用于你的操作系统的 PostgreSQL 二进制包。你可以从 PostgreSQL 官方网站或者你的操作系统的软件库中获取它。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 通过 wget 命令下载</span></span>
<span data-line><span style="color:var(--shiki-token-function);">wget</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 通过 curl 命令下载</span></span>
<span data-line><span style="color:var(--shiki-token-function);">curl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-O</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm</span></span></code></pre></div>
<h4 id="2-安装">2. 安装<a aria-hidden="true" tabindex="-1" href="#2-安装" class="internal"> §</a></h4>
<p>安装二进制包通常比源码安装更快更简单。根据你的操作系统和包管理器,这里介绍几种常用的安装方法:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 在 Red Hat/CentOS 中安装</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">rpm</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-ivh</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">pgdg-redhat-repo-latest.noarch.rpm</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql-server</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 在 Debian/Ubuntu 中安装</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt-get</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt-get</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 在 Debian/Ubuntu 中使用自定义选项进行安装</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--prefix=/usr/local/pgsql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--datadir=/usr/local/pgsql/data</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 在 Red Hat/CentOS 中使用自定义选项进行安装</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">yum</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql-server</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--prefix=/usr/local/pgsql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--datadir=/usr/local/pgsql/data</span></span></code></pre></div>
<p>安装过程中,你可以使用以下选项来自定义安装:</p>
<table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>--prefix=PREFIX</code></td><td>定义安装的根目录,所有文件和目录都将放在这个目录下</td></tr><tr><td><code>--exec-prefix=EPREFIX</code></td><td>定义架构相关文件的安装目录,通常与 <code>--prefix</code> 相同</td></tr><tr><td><code>--bindir=DIR</code></td><td>定义用户可执行文件(如 psql的安装目录</td></tr><tr><td><code>--datadir=DIR</code></td><td>定义只读架构独立数据的安装目录</td></tr><tr><td><code>--libdir=DIR</code></td><td>定义库文件的安装目录</td></tr><tr><td><code>--sysconfdir=DIR</code></td><td>定义系统级配置文件的安装目录</td></tr><tr><td><code>--sharedstatedir=DIR</code></td><td>定义可修改的单主机数据的安装目录</td></tr><tr><td><code>--localstatedir=DIR</code></td><td>定义可修改的多主机数据的安装目录</td></tr><tr><td><code>--libexecdir=DIR</code></td><td>定义可执行程序和其他程序运行的安装目录</td></tr><tr><td><code>--includedir=DIR</code></td><td>定义 C 头文件的安装目录</td></tr><tr><td><code>--mandir=DIR</code></td><td>定义 man 文档的安装目录</td></tr><tr><td><code>--docdir=DIR</code></td><td>定义文档的根目录</td></tr></tbody></table>
<h4 id="3-验证">3. 验证<a aria-hidden="true" tabindex="-1" href="#3-验证" class="internal"> §</a></h4>
<p>安装完成后,验证 PostgreSQL 是否已成功安装和配置。可以通过以下命令来验证安装:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 检查 PostgreSQL 服务状态</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">systemctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">status</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgresql</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 使用 psql 命令行工具连接到 PostgreSQL 服务器</span></span>
<span data-line><span style="color:var(--shiki-token-function);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-U</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 显示 PostgreSQL 服务器的版本信息</span></span>
<span data-line><span style="color:var(--shiki-token-function);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-U</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'SELECT version();'</span></span></code></pre></div>
<p>二进制安装成功后,可以直接使用,默认不需要后续的配置。</p>
<h2 id="设置">设置<a aria-hidden="true" tabindex="-1" href="#设置" class="internal"> §</a></h2>
<h3 id="1-共享库设置-shared-libraries">1. 共享库设置 (Shared Libraries)<a aria-hidden="true" tabindex="-1" href="#1-共享库设置-shared-libraries" class="internal"> §</a></h3>
<p>在某些系统中,你需要告诉系统如何找到新安装的共享库。这不包括 FreeBSD, HP-UX, Linux, NetBSD, OpenBSD 和 Solaris 等系统。设置共享库搜索路径的方法因平台而异,但最常用的方法是设置环境变量 <code>LD_LIBRARY_PATH</code>。以下是如何在 Bourne shell (如 sh, ksh, bash, zsh) 中设置:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-color-text);">LD_LIBRARY_PATH</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/usr/local/pgsql/lib</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">export</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">LD_LIBRARY_PATH</span></span></code></pre></div>
<h3 id="2-环境变量设置-environment-variables">2. 环境变量设置 (Environment Variables)<a aria-hidden="true" tabindex="-1" href="#2-环境变量设置-environment-variables" class="internal"> §</a></h3>
<p>如果你将 PostgreSQL 安装到 <code>/usr/local/pgsql</code> 或其他默认情况下不搜索程序的位置,你应该将 <code>/usr/local/pgsql/bin</code>(或你在第一步中设置的 <code>--bindir</code> 选项)添加到你的 <code>PATH</code> 中。这样可以使 PostgreSQL 的使用更加方便。以下是如何在 Bourne shell 中设置:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-color-text);">PATH</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/usr/local/pgsql/bin:</span><span style="color:var(--shiki-color-text);">$PATH</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">export</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">PATH</span></span></code></pre></div>
<p>为了让你的系统找到 man 文档,你需要将以下行添加到一个 shell 启动文件中,除非你安装到了默认搜索的位置:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-color-text);">MANPATH</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/usr/local/pgsql/share/man:</span><span style="color:var(--shiki-color-text);">$MANPATH</span></span>
<span data-line><span style="color:var(--shiki-token-keyword);">export</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">MANPATH</span></span></code></pre></div>
<p>环境变量 <code>PGHOST</code><code>PGPORT</code> 指定了数据库服务器的主机和端口,覆盖了编译时的默认设置。如果你打算远程运行客户端应用程序,那么每个计划使用数据库的用户都应设置 <code>PGHOST</code>。这不是必需的,但可以通过大多数客户端程序的命令行选项来传递设置。</p>
<h3 id="3-配置脚本示例">3. 配置脚本示例<a aria-hidden="true" tabindex="-1" href="#3-配置脚本示例" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);">#!/bin/bash</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 将配置写入 ~/.bash_profile 文件</span></span>
<span data-line><span style="color:var(--shiki-token-function);">cat</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">>></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">~/.bash_profile</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;&lt;</span><span style="color:var(--shiki-color-text);">EOF</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PGDATA=/opt/postgres/data</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PGHOME=/opt/postgres/pgsql</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export LD_LIBRARY_PATH=$pg_home/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PATH=$pg_home/bin:$PATH:.</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export MANPATH=$pg_home/share/man:$MANPATH</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PGHOST=$PGDATA</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PGUSER=postgres</span></span>
<span data-line><span style="color:var(--shiki-token-string);">export PGDATABASE=postgres</span></span>
<span data-line><span style="color:var(--shiki-color-text);">EOF</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 重新加载 ~/.bash_profile</span></span>
<span data-line><span style="color:var(--shiki-token-function);">source</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">~/.bash_profile</span></span></code></pre></div>
<h2 id="使用">使用<a aria-hidden="true" tabindex="-1" href="#使用" class="internal"> §</a></h2>
<h3 id="psql-命令">Psql 命令<a aria-hidden="true" tabindex="-1" href="#psql-命令" class="internal"> §</a></h3>
<table><thead><tr><th>内置命令</th><th>作用描述</th></tr></thead><tbody><tr><td><code>\q</code></td><td>退出 psql</td></tr><tr><td><code>\l</code><code>\list</code></td><td>列出所有数据库</td></tr><tr><td><code>\c [数据库名]</code></td><td>连接到新数据库</td></tr><tr><td><code>\dt</code></td><td>列出当前数据库中的所有表</td></tr><tr><td><code>\d [表名]</code></td><td>显示表的结构(列、数据类型、权限等)</td></tr><tr><td><code>\du</code></td><td>列出所有 PostgreSQL 用户角色</td></tr><tr><td><code>\e</code></td><td>打开文本编辑器</td></tr><tr><td><code>\a</code></td><td>切换输出格式(对齐或非对齐)</td></tr><tr><td><code>\x</code></td><td>切换扩展显示模式</td></tr><tr><td><code>\timing</code></td><td>显示 SQL 查询的执行时间</td></tr><tr><td><code>\i [文件名]</code></td><td>执行文件中的 SQL 命令</td></tr><tr><td><code>\o [文件名]</code></td><td>将查询结果输出到文件</td></tr><tr><td><code>\s</code></td><td>显示命令历史</td></tr><tr><td><code>\?</code></td><td>显示所有 psql 命令的帮助信息</td></tr><tr><td><code>\h [SQL命令]</code></td><td>显示 SQL 命令的语法和选项</td></tr><tr><td><code>\set</code></td><td>列出所有 psql 变量及其值</td></tr><tr><td><code>\unset</code></td><td>删除一个或多个 psql 变量</td></tr><tr><td><code>\g</code><code>;</code></td><td>执行查询</td></tr><tr><td><code>\qecho [文本]</code></td><td>在输出中显示文本(通常用于脚本中添加注释或空行)</td></tr><tr><td><code>\conninfo</code></td><td>显示当前数据库连接的详细信息</td></tr></tbody></table>
<h3 id="1-初始化数据库目录">1. 初始化数据库目录<a aria-hidden="true" tabindex="-1" href="#1-初始化数据库目录" class="internal"> §</a></h3>
<p>首先,需要使用 <code>initdb</code> 命令来初始化数据库目录。该命令会创建必要的目录结构和系统目录,以便 PostgreSQL 数据库能够运行。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># -D 选项指定数据库目录的路径</span></span>
<span data-line><span style="color:var(--shiki-token-function);">initdb</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/data/directory</span></span></code></pre></div>
<h3 id="2-配置文件">2. 配置文件<a aria-hidden="true" tabindex="-1" href="#2-配置文件" class="internal"> §</a></h3>
<h4 id="postgresqlconf">postgresql.conf<a aria-hidden="true" tabindex="-1" href="#postgresqlconf" class="internal"> §</a></h4>
<p>PostgreSQL 的主配置文件,可以在这里设置各种参数,如内存使用、连接数等。下面是常用配置:</p>
<table><thead><tr><th>配置选项</th><th>作用</th><th>示例配置</th></tr></thead><tbody><tr><td><strong>连接设置</strong></td><td></td><td></td></tr><tr><td><code>listen_addresses</code></td><td>定义服务器监听的地址</td><td><code>listen_addresses = '*'</code></td></tr><tr><td><code>port</code></td><td>定义服务器监听的端口</td><td><code>port = 5432</code></td></tr><tr><td><code>max_connections</code></td><td>最大并发连接数</td><td><code>max_connections = 100</code></td></tr><tr><td><code>superuser_reserved_connections</code></td><td>为超级用户保留的连接数</td><td><code>superuser_reserved_connections = 3</code></td></tr><tr><td><code>unix_socket_directories</code></td><td>Unix 域套接字的目录</td><td><code>unix_socket_directories = '/var/run/postgresql'</code></td></tr><tr><td><strong>认证和安全</strong></td><td></td><td></td></tr><tr><td><code>ssl</code></td><td>是否启用 SSL</td><td><code>ssl = on</code></td></tr><tr><td><code>ssl_cert_file</code></td><td>SSL 证书文件的位置</td><td><code>ssl_cert_file = '/path/to/server.crt'</code></td></tr><tr><td><code>ssl_key_file</code></td><td>SSL 私钥文件的位置</td><td><code>ssl_key_file = '/path/to/server.key'</code></td></tr><tr><td><code>password_encryption</code></td><td>密码加密方式</td><td><code>password_encryption = scram-sha-256</code></td></tr><tr><td><code>hba_file</code></td><td><code>pg_hba.conf</code> 文件的位置</td><td><code>hba_file = '/path/to/pg_hba.conf'</code></td></tr><tr><td><strong>内存使用</strong></td><td></td><td></td></tr><tr><td><code>shared_buffers</code></td><td>用于缓存的内存大小</td><td><code>shared_buffers = 128MB</code></td></tr><tr><td><code>work_mem</code></td><td>查询操作可以使用的内存量</td><td><code>work_mem = 4MB</code></td></tr><tr><td><code>maintenance_work_mem</code></td><td>维护操作(如 VACUUM可以使用的内存量</td><td><code>maintenance_work_mem = 64MB</code></td></tr><tr><td><code>effective_cache_size</code></td><td>估计的操作系统缓存大小</td><td><code>effective_cache_size = 512MB</code></td></tr><tr><td><strong>查询调优</strong></td><td></td><td></td></tr><tr><td><code>seq_page_cost</code></td><td>顺序磁盘页的成本</td><td><code>seq_page_cost = 1.0</code></td></tr><tr><td><code>random_page_cost</code></td><td>随机磁盘页的成本</td><td><code>random_page_cost = 4.0</code></td></tr><tr><td><code>cpu_tuple_cost</code></td><td>处理每个元组的 CPU 成本</td><td><code>cpu_tuple_cost = 0.01</code></td></tr><tr><td><code>cpu_index_tuple_cost</code></td><td>处理每个索引元组的 CPU 成本</td><td><code>cpu_index_tuple_cost = 0.005</code></td></tr><tr><td><code>cpu_operator_cost</code></td><td>执行操作符的 CPU 成本</td><td><code>cpu_operator_cost = 0.0025</code></td></tr><tr><td><strong>日志记录</strong></td><td></td><td></td></tr><tr><td><code>logging_collector</code></td><td>是否启用日志收集</td><td><code>logging_collector = on</code></td></tr><tr><td><code>log_directory</code></td><td>日志文件的存储目录</td><td><code>log_directory = 'pg_log'</code></td></tr><tr><td><code>log_filename</code></td><td>日志文件的命名方式</td><td><code>log_filename = 'postgresql.log'</code></td></tr><tr><td><code>log_statement</code></td><td>记录的 SQL 语句类型(例如所有语句或只有 DDL</td><td><code>log_statement = 'all'</code></td></tr><tr><td><code>log_duration</code></td><td>是否记录语句的执行时间</td><td><code>log_duration = on</code></td></tr><tr><td><code>log_min_duration_statement</code></td><td>记录执行时间超过指定毫秒数的语句</td><td><code>log_min_duration_statement = 500</code></td></tr><tr><td><strong>运行时统计</strong></td><td></td><td></td></tr><tr><td><code>track_activities</code></td><td>是否跟踪服务器进程的活动</td><td><code>track_activities = on</code></td></tr><tr><td><code>track_counts</code></td><td>是否跟踪访问统计信息</td><td><code>track_counts = on</code></td></tr><
<h4 id="pg_hbaconf">pg_hba.conf<a aria-hidden="true" tabindex="-1" href="#pg_hbaconf" class="internal"> §</a></h4>
<p><code>pg_hba.conf</code> 文件用于控制哪些客户端可以连接到数据库,以及它们可以使用的认证方法。以下是 <code>pg_hba.conf</code> 中的常见配置项、作用和示例配置:</p>
<table><thead><tr><th>类型</th><th>数据库</th><th>用户</th><th>地址</th><th>认证方法</th><th>说明</th></tr></thead><tbody><tr><td><code>local</code></td><td><code>all</code></td><td><code>all</code></td><td></td><td><code>trust</code></td><td>本地所有用户对所有数据库的连接不需要密码</td></tr><tr><td><code>host</code></td><td><code>all</code></td><td><code>all</code></td><td><code>127.0.0.1/32</code></td><td><code>md5</code></td><td>从本地通过 TCP/IP 连接的所有用户需要密码</td></tr><tr><td><code>host</code></td><td><code>mydb</code></td><td><code>myuser</code></td><td><code>192.168.1.0/24</code></td><td><code>md5</code></td><td>从指定网络连接到指定数据库的指定用户需要密码</td></tr><tr><td><code>hostssl</code></td><td><code>all</code></td><td><code>all</code></td><td><code>0.0.0.0/0</code></td><td><code>md5</code></td><td>从任何地址通过 SSL 连接的所有用户需要密码</td></tr><tr><td><code>hostnossl</code></td><td><code>all</code></td><td><code>all</code></td><td><code>0.0.0.0/0</code></td><td><code>reject</code></td><td>拒绝非 SSL 连接</td></tr></tbody></table>
<ul>
<li><strong>类型</strong>:连接类型。常见的有 <code>local</code>Unix 域套接字)、<code>host</code>TCP/IP 套接字)、<code>hostssl</code>(仅限 SSL 的 TCP/IP 连接)和 <code>hostnossl</code>(不使用 SSL 的 TCP/IP 连接)。</li>
<li><strong>数据库</strong>:适用的数据库名。<code>all</code> 表示所有数据库。</li>
<li><strong>用户</strong>:适用的用户名。<code>all</code> 表示所有用户。</li>
<li><strong>地址</strong>:客户端的 IP 地址。对于 <code>local</code> 类型,这一列是空的。对于 <code>host</code> 类型,这是一个 CIDR 地址或一个 IP 地址和一个掩码。</li>
<li><strong>认证方法</strong>:常见的有 <code>trust</code>(不需要密码)、<code>reject</code>(拒绝连接)、<code>md5</code>(密码认证)、<code>password</code>(明文密码)等。</li>
</ul>
<p><code>pg_hba.conf</code> 文件的每一行都是一个连接规则PostgreSQL 会按照文件中的顺序评估这些规则,直到找到一个匹配的规则为止。因此,顺序很重要,特别是当有多个规则可能匹配同一个连接时。</p>
<h3 id="3-启动数据库">3. 启动数据库<a aria-hidden="true" tabindex="-1" href="#3-启动数据库" class="internal"> §</a></h3>
<p>一旦数据库目录被成功初始化,可以使用 <code>pg_ctl</code> 命令来启动 PostgreSQL 数据库。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># -D 选项指定了数据库目录的路径。</span></span>
<span data-line><span style="color:var(--shiki-token-function);">pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">start</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/data/directory</span></span>
<span data-line><span style="color:var(--shiki-token-comment);"># 或者</span></span>
<span data-line><span style="color:var(--shiki-token-function);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/data/directory</span></span></code></pre></div>
<h3 id="4-验证数据库是否正在运行">4. 验证数据库是否正在运行<a aria-hidden="true" tabindex="-1" href="#4-验证数据库是否正在运行" class="internal"> §</a></h3>
<p>为了验证 PostgreSQL 数据库是否正在运行,可以使用 <code>psql</code> 命令连接到数据库并执行一个简单的查询,例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-U</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;SELECT version();&quot;</span></span></code></pre></div>
<h3 id="5-配置-systemctl-服务">5. 配置 Systemctl 服务<a aria-hidden="true" tabindex="-1" href="#5-配置-systemctl-服务" class="internal"> §</a></h3>
<ol>
<li>关闭 postgresql 数据库。</li>
<li>创建一个 Systemd 服务文件,通常位于 <code>/etc/systemd/system/postgresql.service</code></li>
<li>添加以下内容(需要结合配置脚本示例)。</li>
</ol>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-color-text);">[Unit]</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Description</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">PostgreSQL</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">database</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">server</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Documentation</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">man:postgres</span><span style="color:var(--shiki-color-text);">(</span><span style="color:var(--shiki-token-function);">1</span><span style="color:var(--shiki-color-text);">)</span></span>
<span data-line><span style="color:var(--shiki-color-text);">After</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">network.target</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-color-text);">[Service]</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Type</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">forking</span></span>
<span data-line><span style="color:var(--shiki-color-text);">User</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Group</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">postgres</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Environment</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">PGPORT=</span><span style="color:var(--shiki-token-constant);">5432</span></span>
<span data-line><span style="color:var(--shiki-color-text);">Environment</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">PGDATA=/opt/postgresql/data</span></span>
<span data-line><span style="color:var(--shiki-color-text);">OOMScoreAdjust</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-constant);">-1000</span></span>
<span data-line><span style="color:var(--shiki-color-text);">ExecStart</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/opt/postgresql/pgsql/bin/pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">start</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> ${PGDATA} </span><span style="color:var(--shiki-token-string);">-s</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-o</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;-p ${PGPORT}&quot;</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-w</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-t</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">300</span></span>
<span data-line><span style="color:var(--shiki-color-text);">ExecStop</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/opt/postgresql/pgsql/bin/pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">stop</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> ${PGDATA} </span><span style="color:var(--shiki-token-string);">-s</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-m</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">fast</span></span>
<span data-line><span style="color:var(--shiki-color-text);">ExecReload</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">/opt/postgresql/pgsql//bin/pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">reload</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-D</span><span style="color:var(--shiki-color-text);"> ${PGDATA} </span><span style="color:var(--shiki-token-string);">-s</span></span>
<span data-line><span style="color:var(--shiki-color-text);">KillMode</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">mixed</span></span>
<span data-line><span style="color:var(--shiki-color-text);">KillSignal</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">SIGINT</span></span>
<span data-line><span style="color:var(--shiki-color-text);">TimeoutSec</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-constant);">30</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-color-text);">[Install]</span></span>
<span data-line><span style="color:var(--shiki-color-text);">WantedBy</span><span style="color:var(--shiki-token-keyword);">=</span><span style="color:var(--shiki-token-string);">multi-user.target</span></span></code></pre></div>
<ol>
<li>重新加载 Systemd 配置:<code>sudo systemctl daemon-reload</code></li>
<li>启动服务:<code>sudo systemctl start postgresql</code></li>
<li>设置开机启动:<code>sudo systemctl enable postgresql</code></li>
</ol>
<h3 id="6-创建用户和数据库">6. 创建用户和数据库<a aria-hidden="true" tabindex="-1" href="#6-创建用户和数据库" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 创建一个新用户</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">createuser</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-P</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">usernam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 创建一个新数据库</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">createdb</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-O</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">usernam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">dbnam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 为用户分配特定权限</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;GRANT ALL PRIVILEGES ON DATABASE &lt;dbname> TO &lt;username>;&quot;</span></span></code></pre></div>
<h3 id="7-用户和角色管理">7. 用户和角色管理<a aria-hidden="true" tabindex="-1" href="#7-用户和角色管理" class="internal"> §</a></h3>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 创建角色</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">createuser</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">role_nam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 为角色分配权限</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;GRANT &lt;permission> ON &lt;object> TO &lt;role_name>;&quot;</span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 删除角色</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">dropuser</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">role_nam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span></span>
<span data-line> </span>
<span data-line><span style="color:var(--shiki-token-comment);"># 设置密码策略和验证</span></span>
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-u</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">postgres</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">psql</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">&quot;ALTER USER &lt;username> WITH PASSWORD '&lt;password>';&quot;</span></span></code></pre></div>
<h3 id="8-备份和恢复">8. 备份和恢复<a aria-hidden="true" tabindex="-1" href="#8-备份和恢复" class="internal"> §</a></h3>
<p>备份和恢复是数据库管理的关键部分确保数据的安全和完整性。PostgreSQL 提供了 <code>pg_dump</code><code>pg_restore</code> 工具来帮助管理员进行这些操作。</p>
<h4 id="pg_dump-备份"><code>pg_dump</code> 备份<a aria-hidden="true" tabindex="-1" href="#pg_dump-备份" class="internal"> §</a></h4>
<p><code>pg_dump</code> 是用于备份 PostgreSQL 数据库的工具。它可以生成包含数据库内容的 SQL 脚本文件或其他格式,如 tar 和 custom。使用以下命令进行全量备份</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_dump</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-U</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">usernam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-h</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">hos</span><span style="color:var(--shiki-color-text);">t</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-p</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">por</span><span style="color:var(--shiki-color-text);">t</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-F</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-b</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">dbnam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">backup.dump</span></span></code></pre></div>
<p>额外的选项包括 <code>--data-only</code><code>--schema-only</code>,这些选项可以让用户选择备份数据或者仅备份架构。</p>
<p>使用 <code>pg_restore</code> 来验证备份文件的完整性。即使你不打算立即恢复,也应该定期验证备份。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_restore</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--list</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">backup.dump</span></span></code></pre></div>
<h4 id="pg_restore-恢复"><code>pg_restore</code> 恢复<a aria-hidden="true" tabindex="-1" href="#pg_restore-恢复" class="internal"> §</a></h4>
<p><code>pg_restore</code> 是用于恢复由 <code>pg_dump</code> 创建的备份的工具。使用以下命令进行恢复:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_restore</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-U</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">usernam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-h</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">hos</span><span style="color:var(--shiki-color-text);">t</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-p</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">por</span><span style="color:var(--shiki-color-text);">t</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-d</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">&lt;</span><span style="color:var(--shiki-token-string);">dbnam</span><span style="color:var(--shiki-color-text);">e</span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">backup.dump</span></span></code></pre></div>
<p><strong>注意</strong></p>
<ul>
<li>在恢复之前,确保目标数据库是空的或你已经备份了任何重要的数据。</li>
<li>如果备份是在不同版本的 PostgreSQL 上创建的,可能会遇到兼容性问题。在这种情况下,确保先测试恢复过程。</li>
<li>如果你正在恢复到一个活动的数据库,你可能需要在恢复前停止数据库服务。</li>
</ul>
<h2 id="更新">更新<a aria-hidden="true" tabindex="-1" href="#更新" class="internal"> §</a></h2>
<h3 id="小版本升级minor-version-upgrade">小版本升级Minor Version Upgrade<a aria-hidden="true" tabindex="-1" href="#小版本升级minor-version-upgrade" class="internal"> §</a></h3>
<p>**小版本升级通常涉及到安全修复和错误修复,而不会改变数据库的内部格式。**这些升级通常比较简单,并且可以通过替换二进制文件来完成。如下是 PostgreSQL 15.3 升级到 15.4 的小版本升级示例:</p>
<p><strong>步骤</strong>:</p>
<ol>
<li>
<p><strong>备份数据</strong>:</p>
<p>在进行任何升级之前,始终确保备份您的数据库。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_dumpall</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">backup.sql</span></span></code></pre></div>
</li>
<li>
<p><strong>停止 PostgreSQL 服务</strong>:</p>
<p>使用 <code>pg_ctl stop</code> 或您的系统的服务管理工具停止 PostgreSQL 服务。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">stop</span></span></code></pre></div>
</li>
<li>
<p><strong>替换二进制文件</strong>:</p>
<p>下载并安装 PostgreSQL 15.4 的二进制文件。</p>
</li>
<li>
<p><strong>重启 PostgreSQL 服务</strong>:</p>
<p>使用 <code>pg_ctl start</code> 或您的系统的服务管理工具重新启动 PostgreSQL 服务。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_ctl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">start</span></span></code></pre></div>
</li>
<li>
<p><strong>检查日志和运行测试</strong>:</p>
<p>检查 <code>/usr/local/pgsql/data/pg_log/</code> 中的日志文件以确保没有错误,并运行任何必要的测试以验证系统的功能。</p>
</li>
</ol>
<h3 id="跨版本升级major-version-upgrade">跨版本升级Major Version Upgrade<a aria-hidden="true" tabindex="-1" href="#跨版本升级major-version-upgrade" class="internal"> §</a></h3>
<p>跨版本升级涉及到从一个主版本升级到另一个主版本,例如从 PostgreSQL 15 升级到 PostgreSQL 16。**这些升级通常会涉及到内部格式的变化,因此需要更多的注意和准备。**如下是 PostgreSQL 15.4 升级到 16.0 的大版本升级示例:</p>
<p><strong>步骤</strong>:</p>
<ol>
<li>
<p><strong>备份数据</strong>:</p>
<p>在进行任何升级之前,始终确保备份您的数据库。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_dumpall</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">backup.sql</span></span></code></pre></div>
</li>
<li>
<p><strong>检查兼容性</strong>:</p>
<p>检查新版本的 PostgreSQL 文档以确保您的应用程序和数据库架构与新版本兼容。</p>
</li>
<li>
<p><strong>安装新版本的 PostgreSQL</strong>:</p>
<p>在同一系统上安装新版本的 PostgreSQL但不要覆盖旧版本。</p>
</li>
<li>
<p><strong>使用 pg_upgrade 或逻辑备份和恢复</strong>:</p>
<p>使用 <code>pg_upgrade</code> 工具快速升级。</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">pg_upgrade</span><span style="color:var(--shiki-color-text);"> \</span></span>
<span data-line><span style="color:var(--shiki-color-text);">--old-datadir </span><span style="color:var(--shiki-token-string-expression);">&quot;/usr/local/pgsql/15.4/data&quot;</span><span style="color:var(--shiki-color-text);"> \</span></span>
<span data-line><span style="color:var(--shiki-color-text);">--new-datadir </span><span style="color:var(--shiki-token-string-expression);">&quot;/usr/local/pgsql/16.0/data&quot;</span><span style="color:var(--shiki-color-text);"> \</span></span>
<span data-line><span style="color:var(--shiki-color-text);">--old-bindir </span><span style="color:var(--shiki-token-string-expression);">&quot;/usr/local/pgsql/15.4/bin&quot;</span><span style="color:var(--shiki-color-text);"> \</span></span>
<span data-line><span style="color:var(--shiki-color-text);">--new-bindir </span><span style="color:var(--shiki-token-string-expression);">&quot;/usr/local/pgsql/16.0/bin&quot;</span></span></code></pre></div>
</li>
<li>
<p><strong>测试新集群</strong>:</p>
<p>在新集群上运行测试以确保它按预期工作。</p>
</li>
<li>
<p><strong>切换到新集群</strong>:</p>
<p>一旦满意,可以切换到新集群并更新任何连接字符串和配置。</p>
</li>
<li>
<p><strong>监控性能和错误</strong>:</p>
<p>在升级后监控系统性能和错误,以确保一切正常。</p>
</li>
<li>
<p><strong>(可选)删除旧集群</strong>:</p>
<p>确保新集群运行正常后,可以选择删除旧集群以释放空间。</p>
</li>
</ol></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:1,&quot;scale&quot;:1.1,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:-1,&quot;scale&quot;:0.9,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#序言" data-for="序言">序言</a></li><li class="depth-0"><a href="#依赖" data-for="依赖">依赖</a></li><li class="depth-1"><a href="#基本依赖" data-for="基本依赖">基本依赖</a></li><li class="depth-1"><a href="#拓展依赖" data-for="拓展依赖">拓展依赖</a></li><li class="depth-1"><a href="#依赖检查" data-for="依赖检查">依赖检查</a></li><li class="depth-0"><a href="#安装" data-for="安装">安装</a></li><li class="depth-1"><a href="#源码安装" data-for="源码安装">源码安装</a></li><li class="depth-1"><a href="#二进制安装" data-for="二进制安装">二进制安装</a></li><li class="depth-0"><a href="#设置" data-for="设置">设置</a></li><li class="depth-1"><a href="#1-共享库设置-shared-libraries" data-for="1-共享库设置-shared-libraries">1. 共享库设置 (Shared Libraries)</a></li><li class="depth-1"><a href="#2-环境变量设置-environment-variables" data-for="2-环境变量设置-environment-variables">2. 环境变量设置 (Environment Variables)</a></li><li class="depth-1"><a href="#3-配置脚本示例" data-for="3-配置脚本示例">3. 配置脚本示例</a></li><li class="depth-0"><a href="#使用" data-for="使用">使用</a></li><li class="depth-1"><a href="#psql-命令" data-for="psql-命令">Psql 命令</a></li><li class="depth-1"><a href="#1-初始化数据库目录" data-for="1-初始化数据库目录">1. 初始化数据库目录</a></li><li class="depth-1"><a href="#2-配置文件" data-for="2-配置文件">2. 配置文件</a></li><li class="depth-1"><a href="#3-启动数据库" data-for="3-启动数据库">3. 启动数据库</a></li><li class="depth-1"><a href="#4-验证数据库是否正在运行" data-for="4-验证数据库是否正在运行">4. 验证数据库是否正在运行</a></li><li class="depth-1"><a href="#5-配置-systemctl-服务" data-for="5-配置-systemctl-服务">5. 配置 Systemctl 服务</a></li><li class="depth-1"><a href="#6-创建用户和数据库" data-for="6-创建用户和数据库">6. 创建用户和数据库</a></li><li class="depth-1"><a href="#7-用户和角色管理" data-for="7-用户和角色管理">7. 用户和角色管理</a></li><li class="depth-1"><a href="#8-备份和恢复" data-for="8-备份和恢复">8. 备份和恢复</a></li><li class="depth-0"><a href="#更新" data-for="更新">更新</a></li><li class="depth-1"><a href="#小版本升级minor-version-upgrade" data-for="小版本升级minor-version-upgrade">小版本升级Minor Version Upgrade</a></li><li class="depth-1"><a href="#跨版本升级major-version-upgrade" data-for="跨版本升级major-version-upgrade">跨版本升级Major Version Upgrade</a></li></ul></div></div><div class="backlinks "><h3>Backlinks</h3><ul class="overflow"><li>No backlinks found</li></ul></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{&quot;path&quot;:&quot;Basics&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Basics/english&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Blog&quot;,&quot;collapsed&quot;:t
function toggleCallout() {
const outerBlock = this.parentElement;
outerBlock.classList.toggle(`is-collapsed`);
const collapsed = outerBlock.classList.contains(`is-collapsed`);
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
outerBlock.style.maxHeight = height + `px`;
let current = outerBlock;
let parent = outerBlock.parentElement;
while (parent) {
if (!parent.classList.contains(`callout`)) {
return;
}
const collapsed2 = parent.classList.contains(`is-collapsed`);
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
parent.style.maxHeight = height2 + `px`;
current = parent;
parent = parent.parentElement;
}
}
function setupCallout() {
const collapsible = document.getElementsByClassName(
`callout is-collapsible`
);
for (const div of collapsible) {
const title = div.firstElementChild;
if (title) {
title.removeEventListener(`click`, toggleCallout);
title.addEventListener(`click`, toggleCallout);
const collapsed = div.classList.contains(`is-collapsed`);
const height = collapsed ? title.scrollHeight : div.scrollHeight;
div.style.maxHeight = height + `px`;
}
}
}
document.addEventListener(`nav`, setupCallout);
window.addEventListener(`resize`, setupCallout);
</script><script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
mermaid.initialize({
startOnLoad: false,
securityLevel: 'loose',
theme: darkMode ? 'dark' : 'default'
});
document.addEventListener('nav', async () => {
await mermaid.run({
querySelector: '.mermaid'
})
});
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../../postscript.js" type="module"></script></html>