diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index 064f3e03..930bea9b 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,11 +1,11 @@ { "theme": "obsidian", "cssTheme": "Minimal", - "interfaceFontFamily": "霞鹜文楷,微软雅黑", + "interfaceFontFamily": "", "baseFontSize": 18, "translucency": false, - "textFontFamily": "霞鹜文楷等宽,微软雅黑", - "monospaceFontFamily": "霞鹜文楷等宽,微软雅黑", + "textFontFamily": "霞鹜文楷等宽", + "monospaceFontFamily": "霞鹜文楷等宽", "baseFontSizeAction": true, "accentColor": "", "nativeMenus": false diff --git a/wiki/database-system/PostgreSQL/安装配置.md b/wiki/database-system/PostgreSQL/安装配置.md new file mode 100644 index 00000000..8eec3175 --- /dev/null +++ b/wiki/database-system/PostgreSQL/安装配置.md @@ -0,0 +1,735 @@ +--- +title: 安装配置 +description: Postgresql 安装配置 +keywords: + - Postgresql + - 安装配置 +tags: + - Postgresql +sidebar_position: 3 +author: 7Wate +date: 2023-09-20 +--- + +## 序言 + +对于初学者和有经验的开发者来说,正确地安装和配置 PostgreSQL 是至关重要的。一个恰当的配置不仅可以确保数据库的稳定运行,还可以充分发挥其性能,满足复杂的业务需求。然而,由于 PostgreSQL 的功能丰富和配置项繁多,很多人在安装和配置过程中可能会遇到困惑和挑战。 + +PostgreSQL 提供了多种安装方式,其中源码安装和编译安装是最为基础和原始的方法。这两种方法虽然相对复杂,但为用户提供了极大的灵活性,允许他们根据自己的需求进行定制和优化。 + +## 依赖 + +| 依赖 | 版本 | 用途 | 状态 | 备注 | +| -------------------- | ------------ | ------------------------------------------- | ---- | --------------------------------------------- | +| GNU make | 3.81 或更高 | 构建 PostgreSQL | ✅ | 必需; 其他版本或其他 make 程序不可用 | +| ISO/ANSI C compiler | C99 兼容 | 编译 PostgreSQL | ✅ | 必需; 推荐使用 GCC 的最新版本 | +| tar | 无特定版本 | 解压源代码分发包 | ✅ | 必需; 需要配合 gzip 或 bzip2 使用 | +| GNU Readline library | 无特定版本 | 提高 PostgreSQL 命令行 SQL 解释器的用户体验 | ✅ | 必需; 可以选择不使用或使用 libedit 库作为替代 | +| zlib | 无特定版本 | 支持 pg_dump 和 pg_restore 中的压缩存档功能 | ✅ | 必需; 可以选择不使用 | +| Perl | 5.8.3 或更高 | 构建 PL/Perl 服务器编程语言 | 🟢 | 可选; 需要 libperl 共享库和头文件 | +| Python | 3.2 或更高 | 构建 PL/Python 服务器编程语言 | 🟢 | 可选; 需要 libpython 共享库和头文件 | +| Tcl | 8.4 或更高 | 构建 PL/Tcl 程序语言 | 🟢 | 可选; 需要 Tcl 安装 | +| OpenSSL | 1.0.1 或更高 | 支持加密的客户端连接和随机数生成 | 🟢 | 可选; 用于支持加密的客户端连接和随机数生成 | +| Gettext API | 无特定版本 | 实现 Native Language Support (NLS) | 🟢 | 可选; 用于显示程序的非英语消息 | +| Kerberos | 无特定版本 | 支持 Kerberos 认证 | 🟢 | 可选; 用于支持 Kerberos 认证 | +| OpenLDAP | 无特定版本 | 支持 OpenLDAP 认证 | 🟢 | 可选; 用于支持 OpenLDAP 认证 | +| PAM | 无特定版本 | 支持 PAM 认证 | 🟢 | 可选; 用于支持 PAM 认证 | +| LZ4 | 无特定版本 | 支持 LZ4 数据压缩 | 🟢 | 可选; 用于支持 LZ4 数据压缩 | +| Zstandard | 1.4.0 或更高 | 支持 Zstandard 数据压缩 | 🟢 | 可选; 用于支持 Zstandard 数据压缩 | + +- ✅ 表示必需 +- 🟢 表示可选 + +### 基本依赖 + +```shell +# YUM 更新软件仓库 && 安装必需的依赖 +sudo yum update -y && sudo yum install -y make gcc tar gzip bzip2 readline readline-devel zlib zlib-devel + +# APT 更新软件仓库 && 安装必需的依赖 +sudo apt update && sudo apt install -y make gcc tar gzip bzip2 libreadline-dev zlib1g-dev +``` + +### 拓展依赖 + +```shell +# YUM 更新软件仓库 && 安装可选的依赖 +sudo yum update -y && sudo yum install -y perl perl-devel python3 python3-devel tcl tcl-devel openssl openssl-devel gettext krb5 krb5-devel openldap openldap-devel pam pam-devel lz4 lz4-devel zstd zstd-devel + +# APT 更新软件仓库 && 安装可选的依赖 +sudo apt update && sudo apt install -y perl libperl-dev python3 python3-dev tcl tcl-dev libssl-dev gettext krb5-user libkrb5-dev libldap2-dev libpam0g-dev liblz4-dev libzstd-dev +``` + +### 依赖检查 + +```shell +#!/bin/bash + +# 检查包管理器 +# 可自定义依赖检查项目 +if command -v yum &> /dev/null; then + PACKAGE_MANAGER="yum" + REQUIRED_DEPENDENCIES=("make" "gcc" "tar" "gzip" "bzip2" "readline" "readline-devel" "zlib" "zlib-devel") + OPTIONAL_DEPENDENCIES=("perl" "perl-devel" "python3" "python3-devel" "tcl" "tcl-devel" "openssl" "openssl-devel" "gettext" "krb5" "krb5-devel" "openldap" "openldap-devel" "pam" "pam-devel" "lz4" "lz4-devel" "zstd" "zstd-devel") +elif command -v apt-get &> /dev/null; then + PACKAGE_MANAGER="apt-get" + REQUIRED_DEPENDENCIES=("make" "gcc" "tar" "gzip" "bzip2" "libreadline-dev" "zlib1g-dev") + OPTIONAL_DEPENDENCIES=("perl" "libperl-dev" "python3" "python3-dev" "tcl" "tcl-dev" "libssl-dev" "gettext" "krb5-user" "libkrb5-dev" "libldap2-dev" "libpam0g-dev" "liblz4-dev" "libzstd-dev") +else + echo "❌ 不支持的包管理器。" + exit 1 +fi + +# 定义一个函数来检查依赖是否安装,并显示版本信息 +check_dependency() { + local package_name=$1 + + if [ -z "$package_name" ]; then + echo "错误:未提供依赖项名称。" + exit 1 + fi + + if [ "$PACKAGE_MANAGER" == "yum" ]; then + if rpm -q $package_name &> /dev/null; then + version=$(rpm -q $package_name) + printf " ✅ %-20s 版本: %s\n" $package_name "$version" + else + printf " ❌ %-20s 未安装\n" $package_name + fi + elif [ "$PACKAGE_MANAGER" == "apt-get" ]; then + if dpkg -s $package_name &> /dev/null; then + version=$(dpkg -s $package_name | grep Version | cut -d' ' -f2) + if [ -z "$version" ]; then + version="未知" + fi + printf " ✅ %-20s 版本: %s\n" $package_name "$version" + else + printf " ❌ %-20s 未安装\n" $package_name + fi + fi +} + +# 定义一个函数来检查依赖项数组 +check_dependencies() { + local dependencies=("$@") + for dependency in "${dependencies[@]}"; do + check_dependency "$dependency" + done +} + +# 检查必需的依赖 +echo "Postgres 依赖检查" +echo "=> 必需的依赖:" +check_dependencies "${REQUIRED_DEPENDENCIES[@]}" + +# 检查可选的依赖 +echo "" +echo "=> 可选的依赖:" +check_dependencies "${OPTIONAL_DEPENDENCIES[@]}" + +# 输出检查完成信息 +echo "" +echo "=> 依赖检查完成!" +``` + +## 安装 + +### 源码安装 + +#### 1. 准备工作 + +```shell +# 创建用户 +sudo adduser postgres +sudo passwd postgres + +# 创建目录 +sudo mkdir -p /opt/postgresql/{data,archive,scripts,backup,pg16,source,logs,config,temp,extensions,upgrade_scripts} + +# 配置目录权限,后续默认以 postgres 用户操作 +sudo chown -R postgres:postgres /opt/postgresql +sudo chmod -R 775 /opt/postgresql +``` + +postgresql 目录下文件夹其对应的用途。 + +| 目录 | 用途 | +| :--------------- | :------------------- | +| /data | 存储 PostgreSQL 数据 | +| /archive | 存储归档日志文件 | +| /scripts | 存储 PostgreSQL 脚本 | +| /backup | 存储数据库备份 | +| /pgsql | 软连接到 /pg16 | +| /pg16 | PostgreSQL 16 版本 | +| /source | 存储源代码或配置文件 | +| /logs | 存储 PostgreSQL 日志 | +| /config | 存储 PostgreSQL 配置 | +| /temp | 存储临时文件 | +| /extensions | 存储 PostgreSQL 扩展 | +| /upgrade_scripts | 存储升级脚本 | + +#### 2. 下载源码 + +PostgreSQL 源码可以在官方提供的 [FTP 渠道](https://www.postgresql.org/ftp/source/)下载。 + +![PostgreSQL 源码](https://static.7wate.com/img/2023/09/22/7f25aaababea4.png) + +```shell +# 切换用户 +su - postgres + +# 下载 PG16 +postgres@debian:/opt/postgresql/source$ wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz + +# 解压 PG16 +postgres@debian:/opt/postgresql/source$ tar -zxvf postgresql-16.0.tar.gz +``` + +#### 3. 配置源码 + +首先,你需要配置源代码树以适应你的系统并选择你想要的选项。这是通过运行 `configure` 脚本完成的。你可以使用以下命令进行默认安装: + +```shell +# 安装 /opt/postgresql/pg16/ 路径 +postgres@debian:/opt/postgresql/source/postgresql-16.0$ ./configure --prefix=/opt/postgresql/pg16/ +``` + +```shell +# 默认安装 +./configure + +# 指定多个选项 +./configure --prefix=/usr/local/pgsql --bindir=/usr/local/pgsql/bin --datadir=/usr/local/pgsql/data --libdir=/usr/local/pgsql/lib + +# 禁用某些功能 +./configure --without-readline --without-zlib + +# 启用调试和指定编译器 +./configure --enable-debug --with-pgport=5432 CC=gcc CFLAGS='-O2 -g' +``` + +| 选项 | 描述 | +| :--------------------- | :----------------------------------------------------------- | +| `--prefix=<目录>` | 指定安装目录的前缀,即 PostgreSQL 将被安装到的基本目录。 | +| `--bindir=<目录>` | 指定可执行文件的目录,例如 `pg_ctl`和 `psql`。 | +| `--sbindir=<目录>` | 指定系统管理员可执行文件的目录,例如 `pg_ctl` 和 `pg_config`。 | +| `--datadir=<目录>` | 指定数据文件的根目录,例如数据表空间。 | +| `--libdir=<目录>` | 指定库文件的目录,例如共享库文件。 | +| `--sysconfdir=<目录>` | 指定配置文件的目录。 | +| `--docdir=<目录>` | 指定文档文件的目录。 | +| `--includedir=<目录>` | 指定包含头文件的目录,用于开发 PostgreSQL 扩展。 | +| `--with-openssl` | 启用 OpenSSL 支持,用于加密通信。 | +| `--with-zlib` | 启用 Zlib 支持,用于数据压缩。 | +| `--with-libxml` | 启用 Libxml2 支持,用于 XML 数据类型。 | +| `--with-python` | 启用 Python 支持,用于编写存储过程和触发器。 | +| `--with-perl` | 启用 Perl 支持,用于编写存储过程和触发器。 | +| `--with-tcl` | 启用 Tcl 支持,用于编写存储过程和触发器。 | +| `--with-pam` | 启用 PAM (Pluggable Authentication Modules) 支持。 | +| `--with-ldap` | 启用 LDAP 支持,用于身份验证和用户管理。 | +| `--with-krb5` | 启用 Kerberos 支持,用于身份验证。 | +| `--with-system-tzdata` | 使用操作系统提供的时区信息。 | +| `--enable-debug` | 启用调试支持,构建时包括调试信息。 | +| `--disable-ipv6` | 禁用 IPv6 支持。 | + +#### 4. 构建二进制 + +可以输入以下任一命令开始构建,可以使用 -j 选项指定线程数加快速度。 + +```shell +make + +# 多线程构建 +make -j 8 +``` + +如果你想构建所有可以构建的内容,包括文档(HTML 和 man 页面)和附加模块(contrib),则可以输入: + +```shell +make world +``` + +或者如果你想构建所有可以构建的内容,包括附加模块(contrib),但不包括文档,可以输入: + +```shell +make world-bin +``` + +#### 5. 测试软件 + +如果你想在安装之前测试新构建的服务器,你可以在此时运行回归测试。这是一个测试套件,用于验证 PostgreSQL 是否按照开发人员预期的方式在你的机器上运行。可以使用以下命令进行测试: + +```shell +make check +``` + +#### 6. 安装 + +要安装 PostgreSQL,可以输入: + +```shell +make install +``` + +此步骤将把文件安装到第一步中指定的目录中。**确保你有适当的权限写入该区域。**或者,你可以提前创建目标目录并安排授予适当的权限。 + +如果你构建了上面的 world,可以输入: + +```shell +make install-world +``` + +这也会安装文档。如果你在上面构建了不包含文档的 world,可以输入: + +```shell +make install-world-bin +``` + +#### 7. 配置软连 + +设置 postgres 软链接,方便系统后续升级。 + +```shell +ln -s /opt/postgres/pg16 /opt/postgresql/pgsql +``` + +#### 8. 卸载和清理 + +如果要撤销安装,可以使用命令 `make uninstall`。但是,这不会删除任何创建的目录。 + +安装后,你可以通过从源代码树中删除构建文件来释放磁盘空间,命令是 `make clean`。这将保留 `configure` 程序创建的文件,以便你稍后可以使用 `make` 重新构建所有内容。要将源代码树重置为分发时的状态,请使用 `make distclean`。 + +### 二进制安装 + +#### 1. 下载 + +在开始二进制安装之前,你需要首先下载适用于你的操作系统的 PostgreSQL 二进制包。你可以从 PostgreSQL 官方网站或者你的操作系统的软件库中获取它。 + +```shell +# 通过 wget 命令下载 +wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm + +# 通过 curl 命令下载 +curl -O https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm +``` + +#### 2. 安装 + +安装二进制包通常比源码安装更快更简单。根据你的操作系统和包管理器,这里介绍几种常用的安装方法: + +```shell +# 在 Red Hat/CentOS 中安装 +sudo rpm -ivh pgdg-redhat-repo-latest.noarch.rpm +sudo yum install postgresql-server + +# 在 Debian/Ubuntu 中安装 +sudo apt-get update +sudo apt-get install postgresql + +# 在 Debian/Ubuntu 中使用自定义选项进行安装 +sudo apt install postgresql --prefix=/usr/local/pgsql --datadir=/usr/local/pgsql/data + +# 在 Red Hat/CentOS 中使用自定义选项进行安装 +sudo yum install postgresql-server --prefix=/usr/local/pgsql --datadir=/usr/local/pgsql/data +``` + +安装过程中,你可以使用以下选项来自定义安装: + +| 选项 | 描述 | +| ----------------------- | -------------------------------------------------- | +| `--prefix=PREFIX` | 定义安装的根目录,所有文件和目录都将放在这个目录下 | +| `--exec-prefix=EPREFIX` | 定义架构相关文件的安装目录,通常与 `--prefix` 相同 | +| `--bindir=DIR` | 定义用户可执行文件(如 psql)的安装目录 | +| `--datadir=DIR` | 定义只读架构独立数据的安装目录 | +| `--libdir=DIR` | 定义库文件的安装目录 | +| `--sysconfdir=DIR` | 定义系统级配置文件的安装目录 | +| `--sharedstatedir=DIR` | 定义可修改的单主机数据的安装目录 | +| `--localstatedir=DIR` | 定义可修改的多主机数据的安装目录 | +| `--libexecdir=DIR` | 定义可执行程序和其他程序运行的安装目录 | +| `--includedir=DIR` | 定义C头文件的安装目录 | +| `--mandir=DIR` | 定义 man 文档的安装目录 | +| `--docdir=DIR` | 定义文档的根目录 | + +#### 3. 验证 + +安装完成后,验证 PostgreSQL 是否已成功安装和配置。可以通过以下命令来验证安装: + +```shell +# 检查 PostgreSQL 服务状态 +sudo systemctl status postgresql + +# 使用 psql 命令行工具连接到 PostgreSQL 服务器 +psql -U postgres + +# 显示 PostgreSQL 服务器的版本信息 +psql -U postgres -c 'SELECT version();' +``` + +二进制安装成功后,可以直接使用,默认不需要后续的配置。 + +## 设置 + +### 1. 共享库设置 (Shared Libraries) + +在某些系统中,你需要告诉系统如何找到新安装的共享库。这不包括 FreeBSD, HP-UX, Linux, NetBSD, OpenBSD 和 Solaris 等系统。设置共享库搜索路径的方法因平台而异,但最常用的方法是设置环境变量 `LD_LIBRARY_PATH`。以下是如何在 Bourne shell (如 sh, ksh, bash, zsh) 中设置: + +```shell +LD_LIBRARY_PATH=/usr/local/pgsql/lib +export LD_LIBRARY_PATH +``` + +### 2. 环境变量设置 (Environment Variables) + +如果你将 PostgreSQL 安装到 `/usr/local/pgsql` 或其他默认情况下不搜索程序的位置,你应该将 `/usr/local/pgsql/bin`(或你在第一步中设置的 `--bindir` 选项)添加到你的 `PATH` 中。这样可以使 PostgreSQL 的使用更加方便。以下是如何在 Bourne shell 中设置: + +```shell +PATH=/usr/local/pgsql/bin:$PATH +export PATH +``` + +为了让你的系统找到 man 文档,你需要将以下行添加到一个 shell 启动文件中,除非你安装到了默认搜索的位置: + +```shell +MANPATH=/usr/local/pgsql/share/man:$MANPATH +export MANPATH +``` + +环境变量 `PGHOST` 和 `PGPORT` 指定了数据库服务器的主机和端口,覆盖了编译时的默认设置。如果你打算远程运行客户端应用程序,那么每个计划使用数据库的用户都应设置 `PGHOST`。这不是必需的,但可以通过大多数客户端程序的命令行选项来传递设置。 + +### 3. 配置脚本示例 + +```shell +#!/bin/bash + +# 将配置写入 ~/.bash_profile 文件 +cat >> ~/.bash_profile < + +# 创建一个新数据库 +sudo -u postgres createdb -O + +# 为用户分配特定权限 +sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE TO ;" +``` + +### 7. 用户和角色管理 + +```shell +# 创建角色 +sudo -u postgres createuser + +# 为角色分配权限 +sudo -u postgres psql -c "GRANT ON TO ;" + +# 删除角色 +sudo -u postgres dropuser + +# 设置密码策略和验证 +sudo -u postgres psql -c "ALTER USER WITH PASSWORD '';" +``` + +### 8. 备份和恢复 + +备份和恢复是数据库管理的关键部分,确保数据的安全和完整性。PostgreSQL 提供了 `pg_dump` 和 `pg_restore` 工具来帮助管理员进行这些操作。 + +#### `pg_dump` 备份 + +`pg_dump` 是用于备份 PostgreSQL 数据库的工具。它可以生成包含数据库内容的SQL脚本文件或其他格式,如 tar 和 custom。使用以下命令进行全量备份: + +```shell +pg_dump -U -h -p -F c -b > backup.dump +``` + +额外的选项包括 `--data-only` 和 `--schema-only`,这些选项可以让用户选择备份数据或者仅备份架构。 + +使用 `pg_restore` 来验证备份文件的完整性。即使你不打算立即恢复,也应该定期验证备份。 + +```shell +pg_restore --list backup.dump +``` + +#### `pg_restore` 恢复 + +`pg_restore` 是用于恢复由 `pg_dump` 创建的备份的工具。使用以下命令进行恢复: + +```shell +pg_restore -U -h -p -d backup.dump +``` + +**注意**: + +- 在恢复之前,确保目标数据库是空的或你已经备份了任何重要的数据。 +- 如果备份是在不同版本的 PostgreSQL 上创建的,可能会遇到兼容性问题。在这种情况下,确保先测试恢复过程。 +- 如果你正在恢复到一个活动的数据库,你可能需要在恢复前停止数据库服务。 + +## 更新 + +### 小版本升级(Minor Version Upgrade) + +**小版本升级通常涉及到安全修复和错误修复,而不会改变数据库的内部格式。**这些升级通常比较简单,并且可以通过替换二进制文件来完成。如下是 PostgreSQL 15.3 升级到 15.4 的小版本升级示例: + +**步骤**: + +1. **备份数据**: + + 在进行任何升级之前,始终确保备份您的数据库。 + + ```shell + pg_dumpall > backup.sql + ``` + +2. **停止 PostgreSQL 服务**: + + 使用 `pg_ctl stop` 或您的系统的服务管理工具停止 PostgreSQL 服务。 + + ```shell + pg_ctl stop + ``` + +3. **替换二进制文件**: + + 下载并安装 PostgreSQL 15.4 的二进制文件。 +4. **重启 PostgreSQL 服务**: + + 使用 `pg_ctl start` 或您的系统的服务管理工具重新启动 PostgreSQL 服务。 + + ```shell + pg_ctl start + ``` + +5. **检查日志和运行测试**: + + 检查 `/usr/local/pgsql/data/pg_log/` 中的日志文件以确保没有错误,并运行任何必要的测试以验证系统的功能。 + +### 跨版本升级(Major Version Upgrade) + +跨版本升级涉及到从一个主版本升级到另一个主版本,例如从 PostgreSQL 15 升级到 PostgreSQL 16。**这些升级通常会涉及到内部格式的变化,因此需要更多的注意和准备。**如下是 PostgreSQL 15.4 升级到 16.0 的大版本升级示例: + +**步骤**: + +1. **备份数据**: + + 在进行任何升级之前,始终确保备份您的数据库。 + + ```shell + pg_dumpall > backup.sql + ``` + +2. **检查兼容性**: + + 检查新版本的 PostgreSQL 文档以确保您的应用程序和数据库架构与新版本兼容。 +3. **安装新版本的 PostgreSQL**: + + 在同一系统上安装新版本的 PostgreSQL,但不要覆盖旧版本。 +4. **使用 pg_upgrade 或逻辑备份和恢复**: + + 使用 `pg_upgrade` 工具快速升级。 + + ```shell + pg_upgrade \ + --old-datadir "/usr/local/pgsql/15.4/data" \ + --new-datadir "/usr/local/pgsql/16.0/data" \ + --old-bindir "/usr/local/pgsql/15.4/bin" \ + --new-bindir "/usr/local/pgsql/16.0/bin" + ``` + +5. **测试新集群**: + + 在新集群上运行测试以确保它按预期工作。 +6. **切换到新集群**: + + 一旦满意,可以切换到新集群并更新任何连接字符串和配置。 +7. **监控性能和错误**: + + 在升级后监控系统性能和错误,以确保一切正常。 +8. **(可选)删除旧集群**: + + 确保新集群运行正常后,可以选择删除旧集群以释放空间。