配置和使用数据库服务器


Red Hat Enterprise Linux 10

在数据库服务器上安装、配置、备份和迁移数据

Red Hat Customer Content Services

摘要

在 Red Hat Enterprise Linux 10 上安装 MariaDB、MySQL 或 PostgreSQL 数据库服务器。配置所选的数据库服务器,备份您的数据,并将数据迁移到数据库服务器的后续版本。

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 在顶部导航栏中点 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

第 1 章 使用 MariaDB

MariaDB 服务器是一个基于 MySQL 技术的开源、快速且健壮的数据库服务器。MariaDB 是一个关系型数据库,它将数据转换为结构化信息,并提供一个 SQL 接口来访问数据。它包括多个存储引擎和插件,以及地理信息系统(GIS)和 JavaScript 对象表示法(JSON)功能。

了解如何在 RHEL 系统上安装和配置 MariaDB,如何备份 MariaDB 数据、如何从早期的 MariaDB 版本进行迁移,以及如何使用 MariaDB Galera 集群复制数据库。

1.1. 安装 MariaDB

RHEL 10 提供 MariaDB 10.11 作为应用程序流的初始版本,其可作为 RPM 软件包轻松安装。在 RHEL 10 的次版本中,其他 MariaDB 版本作为具有较短生命周期的模块提供。

重要

按照设计,您只能安装同一模块的一个版本(流),并且由于 RPM 软件包之间的冲突,您无法在同一主机上安装 MariaDB 和 MySQL。作为替代方案,您也可以在容器中运行数据库服务器服务。请参阅 使用容器在单个主机上运行多个 MariaDB 和 MySQL 实例

流程

  1. 安装 MariaDB 服务器软件包:

    # dnf install mariadb-server
    Copy to Clipboard Toggle word wrap
  2. 启用并启动 mariadb 服务:

    # systemctl enable --now mariadb.service
    Copy to Clipboard Toggle word wrap

如果从软件包安装 MariaDB 或 MySQL,您只能在同一主机上运行这些服务中的一个,且该服务的一个版本。作为一种替代方案,您可以在容器中运行服务来配置以下场景:

  • 您希望在同一主机上运行多个 MariaDB 或 MySQL 实例。
  • 您想要在同一主机上运行 MariaDB 和 MySQL。

先决条件

  • podman 软件包已安装。

流程

  1. 使用您的红帽客户门户网站帐户认证到 registry.redhat.io 注册中心:

    # podman login registry.redhat.io
    Copy to Clipboard Toggle word wrap

    如果您已登录到容器注册中心,请跳过这一步。

  2. 启动您要使用的容器:

    • MariaDB 10.11 :

      $ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
      Copy to Clipboard Toggle word wrap

      有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录

    • MySQL 8.4:

      $ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
      Copy to Clipboard Toggle word wrap

      有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录

    重要

    容器名称和两个数据库服务器的主机端口必须不同。

  3. 要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:

    # firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...}
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  1. 连接到数据库服务器,并以 root 用户身份登录:

    # mysql -u root -p -h localhost -P <host_port> --protocol tcp
    Copy to Clipboard Toggle word wrap
  2. 可选:显示正在运行的容器的信息:

    $ podman ps
    Copy to Clipboard Toggle word wrap

1.3. 配置对 MariaDB 的网络访问

如果您网络中的客户端需要远程访问 MariaDB 服务器,您必须将 MariaDB 服务配置为侦听相应的接口。

流程

  1. 编辑/etc/my.cnf.d/mariadb-server.cnf文件的[mysqld]部分。您可以设置以下配置指令:

    • bind-address - 是服务器监听的地址。可能的选项有:

      • 主机名
      • IPv4 地址
      • IPv6 地址
    • skip-networking - 控制服务器是否监听 TCP/IP 连接。可能的值有:

      • 0 - 侦听所有客户端
      • 1 - 只监听本地客户端
    • port - MariaDB 监听 TCP/IP 连接的端口。
  2. 要确保客户端可以访问网络上的数据库服务器,请在防火墙中开放端口:

    # firewall-cmd --permanent --add-service=mysql
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  3. 重启 mariadb 服务:

    # systemctl restart mariadb.service
    Copy to Clipboard Toggle word wrap

1.4. 在 MariaDB 服务器上设置 TLS 加密

默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并配置您的客户端,来建立加密连接。

在 MariaDB 服务器中启用 TLS 加密之前,请在 MariaDB 服务器上存储证书颁发机构(CA)证书、服务器证书和私钥。

先决条件

  • 以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:

    • 服务器的私钥:server.example.com.key.pem
    • 服务器证书:server.example.com.crt.pem
    • 证书颁发机构(CA)证书:ca.crt.pem

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

流程

  1. 将 CA 和服务器证书存储在 /etc/pki/tls/certs/ 目录中:

    # mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/
    # mv <path>/ca.crt.pem /etc/pki/tls/certs/
    Copy to Clipboard Toggle word wrap
  2. 对 CA 和服务器证书设置权限,使 MariaDB 服务器能够读取文件:

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
    Copy to Clipboard Toggle word wrap

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。

  3. 将服务器的私钥存储在 /etc/pki/tls/private/ 目录中:

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
    Copy to Clipboard Toggle word wrap
  4. 对服务器的私钥设置安全权限:

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
    Copy to Clipboard Toggle word wrap

    如果未授权的用户可以访问私钥,则到 MariaDB 服务器的连接不再安全。

  5. 恢复 SELinux 上下文:

    #  restorecon -Rv /etc/pki/tls/
    Copy to Clipboard Toggle word wrap

1.4.2. 在 MariaDB 服务器上配置 TLS

要提高安全性,请在 MariaDB 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密向服务器传输数据。

先决条件

  • 您已安装了 MariaDB 服务器。
  • mariadb 服务正在运行。
  • 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由 mysql 用户读取:

    • 服务器的私钥:/etc/pki/tls/private/server.example.com.key.pem
    • 服务器证书:/etc/pki/tls/certs/server.example.com.crt.pem
    • 证书颁发机构(CA)证书 /etc/pki/tls/certs/ca.crt.pem
  • 主题可识别名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名相匹配。
  • 如果启用了 FIPS 模式,客户端必须支持 Extended Master Secret(EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 在 RHEL 9.2 及更高版本上强制执行 TLS 扩展"Extended Master Secret"

流程

  1. 创建 /etc/my.cnf.d/mariadb-server-tls.cnf 文件:

    1. 添加以下内容来配置到私钥、服务器和 CA 证书的路径:

      [mariadb]
      ssl_key = /etc/pki/tls/private/server.example.com.key.pem
      ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
      ssl_ca = /etc/pki/tls/certs/ca.crt.pem
      Copy to Clipboard Toggle word wrap
    2. 如果您有一个证书撤销列表(CRL),请将 MariaDB 服务器配置为使用它:

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
      Copy to Clipboard Toggle word wrap
    3. 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
      Copy to Clipboard Toggle word wrap
    4. 可选:设置服务器应支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:

      tls_version = TLSv1.2,TLSv1.3
      Copy to Clipboard Toggle word wrap

      默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。

  2. 重启 mariadb 服务:

    # systemctl restart mariadb
    Copy to Clipboard Toggle word wrap

验证

要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MariaDB 服务器上执行以下步骤:

  1. 验证 MariaDB 现在是否启用了 TLS 加密:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | have_ssl      | YES             |
    +---------------+-----------------+
    Copy to Clipboard Toggle word wrap

    如果 have_ssl 变量设置为 yes,则启用 TLS 加密。

  2. 如果您将 MariaDB 服务配置为只支持特定的 TLS 版本,则显示 tls_version 变量:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tls_version   | TLSv1.2,TLSv1.3 |
    +---------------+-----------------+
    Copy to Clipboard Toggle word wrap

可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。

如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。

先决条件

  • MariaDB 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。

流程

  1. 以管理员用户身份连接到 MariaDB 服务器:

    # mysql -u root -p -h server.example.com
    Copy to Clipboard Toggle word wrap

    如果您的管理用户没有远程访问服务器的权限,请在 MariaDB 服务器上执行命令,并连接到 localhost

  2. 使用 REQUIRE SSL 子句强制用户必须使用 TLS 加密连接进行连接:

    MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
    Copy to Clipboard Toggle word wrap

验证

  1. 使用 TLS 加密,以 example 用户身份连接到服务器:

    # mysql -u example -p -h server.example.com --ssl
    ...
    MariaDB [(none)]>
    Copy to Clipboard Toggle word wrap

    如果没有显示错误,且您可以访问交互式 MariaDB 控制台,则与 TLS 的连接成功。

  2. 尝试以禁用 TLS 的 example 用户身份进行连接:

    # mysql -u example -p -h server.example.com --skip-ssl
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
    Copy to Clipboard Toggle word wrap

    服务器拒绝登录尝试,因为此用户需要 TLS,但被禁用了(--skip-ssl)。

1.5. 将 MariaDB 客户端配置为默认使用 TLS 加密

在 RHEL 上,您可以全局配置 MariaDB 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)是否与用户连接的主机名匹配。这可防止中间人攻击。

先决条件

  • MariaDB 服务器启用了 TLS 支持。
  • 如果 RHEL 不信任发布服务器证书的证书颁发机构(CA),则 CA 证书已被复制到客户端。
  • 如果启用了 FIPS 模式,此客户端会支持 Extended Master Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 在 RHEL 9.2 及更高版本上强制执行 TLS 扩展 "Extended Master Secret"

流程

  1. 如果 RHEL 不信任发布服务器证书的 CA:

    1. 将 CA 证书复制到 /etc/pki/ca-trust/source/anchors/ 目录中:

      # cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
      Copy to Clipboard Toggle word wrap
    2. 设置允许所有用户读取 CA 证书文件的权限:

      # chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
      Copy to Clipboard Toggle word wrap
    3. 重建 CA 信任数据库:

      # update-ca-trust
      Copy to Clipboard Toggle word wrap
  2. 使用以下内容创建 /etc/my.cnf.d/mariadb-client-tls.cnf 文件:

    [client-mariadb]
    ssl
    ssl-verify-server-cert
    Copy to Clipboard Toggle word wrap

    这些设置定义 MariaDB 客户端使用 TLS 加密(ssl),并且客户端将主机名与服务器证书 (ssl-verify-server-cert)中的 CN 进行比较。

验证

  • 使用主机名连接到服务器,并显示服务器状态:

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384
    Copy to Clipboard Toggle word wrap

    如果 SSL 条目包含 Cipher in use is…​,则连接加密了。

    请注意,您在这个命令中使用的用户具有远程身份验证的权限。

    如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则 ssl-verify-server-cert 参数会导致连接失败。例如,如果您连接到 localhost

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed
    Copy to Clipboard Toggle word wrap

1.6. 备份 MariaDB 数据

从 MariaDB 数据库备份数据有两种主要方法:

逻辑备份

逻辑备份由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。

与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MariaDB 版本或数据库管理系统(DBMS)上恢复,这无法通过物理备份来实现。

请注意,逻辑备份只有在 mariadb.service 运行时才能执行。逻辑备份不包括日志和配置文件。

物理备份

物理备份由存储内容的文件和目录的副本组成。

与逻辑备份相比,物理备份具有以下优点:

  • 输出更为紧凑。
  • 备份的大小会较小。
  • 备份和恢复速度更快。
  • 备份包括日志和配置文件。

    请注意,当 mariadb.service 没有运行或者数据库中的所有表都被锁定以防止备份期间更改时,必须执行物理备份。

您可以使用以下 MariaDB 备份方法之一从 MariaDB 数据库备份数据:

  • 使用 mariadb-dump 进行逻辑备份
  • 使用 Mariabackup 工具进行物理在线备份
  • 文件系统备份
  • 作为备份解决方案复制

1.6.1. 使用 mariadb-dump 执行逻辑备份

mariadb-dump 客户端是一个备份工具,其可用于转储数据库或数据库集合,来进行备份或传输到其他数据库服务器。mariadb-dump 的输出通常由重建服务器表结构、为它填充数据的 SQL 语句组成或两者兼而有之。mariadb-dump 也可以生成其他格式的文件,包括 XML 和分隔的文本格式,如 CSV。

要执行 mariadb-dump 备份,您可以使用以下选项之一:

  • 备份一个或多个所选的数据库
  • 备份所有数据库
  • 从一个数据库备份表子集

流程

  • 要转储单个数据库,请运行:

    # mariadb-dump [options] --databases db_name > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要一次转储多个数据库,请运行:

    # mariadb-dump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要转储所有数据库,请运行:

    # mariadb-dump [options] --all-databases > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要将一个或多个转储的完整数据库加载回服务器,请运行:

    # mariadb < backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要将数据库加载到远程 MariaDB 服务器,请运行:

    # mariadb --host=remote_host < backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要从一个数据库转储表子集,请在 mariadb-dump 命令末尾添加所选表的列表:

    # mariadb-dump [options] db_name [tbl_name ...​] > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要载入从一个数据库转储的表的子集,请运行:

    # mariadb db_name < backup-file.sql
    Copy to Clipboard Toggle word wrap
    注意

    此时,db_name 数据库必须存在。

  • 要查看 mariadb-dump 支持的选项列表,请运行:

    $ mariadb-dump --help
    Copy to Clipboard Toggle word wrap

1.6.2. 使用 mariabackup 工具执行物理在线备份

mariabackup 工具基于 Percona XtraBackup 技术,它允许执行 InnoDB、Aria 和 MyISAM 表的物理在线备份。工具支持对 MariaDB 服务器的全备份功能,其包括加密和压缩的数据。

先决条件

  • mariadb-backup 软件包已在系统中安装:
  • 您必须为在其下运行备份的用户提供 mariabackup 和凭证。您可以在命令行中或通过配置文件来提供凭证。
  • mariabackup 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

流程

  • 使用以下选项之一创建备份:

    • 要在在命令行上提供凭证时创建备份,请输入:

      $ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
      Copy to Clipboard Toggle word wrap

      target-dir 选项定义存储备份文件的目录。如果要执行全备份,目标目录必是空或者不存在。

      userpassword 选项允许您配置用户名和密码。

    • 要使用配置文件中设置的凭证创建备份:

      1. /etc/my.cnf.d/ 目录中创建配置文件,例如 /etc/my.cnf.d/mariabackup.cnf
      2. 在文件中添加以下内容:

        [mysqld]
        user=<backup_username>
        password=<password>
        Copy to Clipboard Toggle word wrap
      3. 执行备份:

        $ mariabackup --backup --target-dir <backup_directory>
        Copy to Clipboard Toggle word wrap

1.6.3. 使用 mariabackup 工具恢复数据

如果您有 mariabackup 工具创建的 MariaDB 备份,您可以使用相同的工具恢复数据。

先决条件

  • mariadb 服务已停止。
  • 数据目录为空。
  • mariabackup 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

流程

  1. 使用以下选项之一恢复数据:

    • 要从 /var/mariadb/backup/ 目录中的备份恢复数据,并保留原始备份文件,请输入:

      $ mariabackup --copy-back --target-dir=/var/mariadb/backup/
      Copy to Clipboard Toggle word wrap
    • 要从 /var/mariadb/backup/ 目录中的备份恢复数据,并删除原始备份文件,请输入:

      $ mariabackup --move-back --target-dir=/var/mariadb/backup/
      Copy to Clipboard Toggle word wrap
  2. 修复文件权限。例如,要递归地将文件的所有权改为 mysql 用户和组,请输入:

    # chown -R mysql:mysql /var/lib/mysql/
    Copy to Clipboard Toggle word wrap

    恢复数据库时,mariabackup 会保留备份的文件和目录特权。但是,mariabackup 以恢复数据库的用户和组的身份将文件写入磁盘。因此,在恢复备份后,您必须调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组。

  3. 启动 mariadb 服务:

    # systemctl start mariadb.service
    Copy to Clipboard Toggle word wrap

1.6.4. 对 MariaDB 服务器执行文件系统备份

要创建一个 MariaDB 数据文件的文件系统备份,请将 MariaDB 数据目录的内容复制到您的备份位置。

要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:

流程

  1. 停止 mariadb 服务:

    # systemctl stop mariadb.service
    Copy to Clipboard Toggle word wrap
  2. 复制数据文件:

    # cp -rp /var/lib/mysql/ /backup-location/data/
    Copy to Clipboard Toggle word wrap
  3. 复制配置文件:

    # cp -rp /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
    Copy to Clipboard Toggle word wrap
  4. 可选:复制日志文件:

    # cp -p /var/log/mariadb/* /backup-location/logs/
    Copy to Clipboard Toggle word wrap
  5. 启动 mariadb 服务:

    # systemctl start mariadb.service
    Copy to Clipboard Toggle word wrap
  6. 将备份位置的备份数据加载到 /var/lib/mysql 目录时,请确保 mysql:mysql/var/lib/mysql 中所有数据的所有者:

    # chown -R mysql:mysql /var/lib/mysql/
    Copy to Clipboard Toggle word wrap

1.6.5. 作为备份解决方案复制

如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。

警告

复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。

RHEL 10 提供 MariaDB 10.11。如果您在之前的 RHEL 版本上运行了 MariaDB 实例,则您可以在新主机上设置 RHEL 10,并将实例迁移到其上。

先决条件

  • 您可以在新主机上设置 RHEL 10。
  • 您对 RHEL 8 或 RHEL 9 主机执行 MariaDB 实例的文件系统备份。

流程

  1. 安装 mariadb-server 软件包:

    # dnf install mariadb-server
    Copy to Clipboard Toggle word wrap
  2. 如果服务已在运行,停止该服务:

    # systemctl stop mariadb.service
    Copy to Clipboard Toggle word wrap
  3. 将之前主机上 /var/lib/mysql/ 目录的内容复制到 RHEL 10 主机上的相同位置。
  4. 将之前主机中的配置文件复制到 /etc/my.cnf.d/ 目录中,并确保文件仅包含 MariaDB 10.11 的有效选项。详情请查看 上游文档
  5. 恢复 SELinux 上下文:

    # restorecon -rv /var/lib/mysql/
    # restorecon -rv /etc/my.cnf.d/
    Copy to Clipboard Toggle word wrap
  6. 确保 /var/lib/mysql/ 及其子目录的正确所有权:

    # chown -R mysql:mysql /var/lib/mysql/
    Copy to Clipboard Toggle word wrap
  7. 启用并启动 mariadb 服务:

    # systemctl enable --now mariadb.service
    Copy to Clipboard Toggle word wrap

    当服务启动时,MariaDB 会自动检查、修复和更新内部表。

验证

  • 建立到 MariaDB 服务器的连接:

    # mysql -u root -p -h <hostname>
    Copy to Clipboard Toggle word wrap

1.8. 使用 Galera 复制 MariaDB

您可以在 Red Hat Enterprise Linux 上使用 Galera 解决方案复制 MariaDB 数据库。

1.8.1. MariaDB Galera 集群介绍

Galera 复制是基于创建由多个 MariaDB 服务器组成的同步多源 MariaDB Galera 集群。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。

Galera 复制和 MariaDB 数据库之间的接口是由写入集复制 API(wsrep API)定义的。

MariaDB Galera 集群的主要特性是:

  • 同步复制
  • 主动-主动多源拓扑
  • 对任何集群节点的读和写
  • 自动成员资格控制,故障节点从集群中删除
  • 自动节点加入
  • 行一级的并行复制
  • 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点

同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),并体验与原生 MariaDB 类似的行为。

同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。

因此,与异步复制相比,同步复制具有以下优势:

  • 在特定集群节点间传播更改没有延迟
  • 所有集群节点始终一致
  • 如果其中一个集群节点崩溃,则不会丢失最新的更改
  • 所有集群节点上的事务都会并行执行
  • 整个集群的因果关系

1.8.2. 构建 MariaDB Galera 集群的组件

要构建 MariaDB Galera 集群,您必须在您的系统上安装以下软件包:

  • mariadb-server-galera - 包含 MariaDB Galera 集群 的支持文件和脚本。
  • MariaDB-server - 由 MariaDB 上游打补丁,以包含写入集复制 API(wsrep API)。此 API 提供 Galera 复制和 MariaDB 之间的接口。
  • Galera - 由 MariaDB 上游打补丁,以添加对 MariaDB 的完全支持。galera 软件包包含以下内容:

    • Galera Replication 程序库 提供整个复制功能。
    • Galera Arbitrator 工具可用作参与脑裂场景的集群成员。但是,Galera Arbitrator 无法参与实际的复制。
    • Galera Systemd 服务Galera 打包程序脚本,它们用于部署 Galera Arbitrator 工具。RHEL 10 提供这些文件的上游版本,位于 /usr/lib/systemd/system/garbd.service/usr/sbin/garb-systemd

1.8.3. 部署 MariaDB Galera 集群

您可以部署 MariaDB Galera 集群软件包,并更新配置。要组成一个新集群,您必须引导集群的第一个节点。

先决条件

  • 集群中的所有节点都有 TLS 设置
  • 所有节点上所有证书的 Extended Key Usage 字段都必须设置为:

    TLS Web Server Authentication, TLS Web Client Authentication
    Copy to Clipboard Toggle word wrap

流程

  1. 安装 MariaDB Galera 集群软件包:

    # dnf install mariadb-server-galera
    Copy to Clipboard Toggle word wrap

    因此,以下软件包会与依赖项一起安装:

    • mariadb-server-galera
    • mariadb-server
    • galera

      有关构建 MariaDB Galera 集群所需的软件包的更多信息,请参阅 构建 MariaDB 集群的组件

  2. 在系统第一次添加到集群前,更新 MariaDB 服务器复制配置。默认配置在 /etc/my.cnf.d/galera.cnf 文件中。在部署 MariaDB Galera 集群之前,请将所有节点上的 /etc/my.cnf.d/galera.cnf 文件中设置以以下字符串开头的 wsrep_cluster_address 选项:

    gcomm://
    Copy to Clipboard Toggle word wrap
    • 对于初始节点,可以将 wsrep_cluster_address 设置为空列表:

      wsrep_cluster_address="gcomm://"
      Copy to Clipboard Toggle word wrap
    • 对于所有其他节点,将 wsrep_cluster_address 设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:

      wsrep_cluster_address="gcomm://10.0.0.10"
      Copy to Clipboard Toggle word wrap

      有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址

  3. 通过在 /etc/my.cnf.d/galera.cnf 配置文件中设置 wsrep_on=1 选项来在每个节点上启用 wsrep API。
  4. wsrep_provider_options 变量添加到带有 TLS 密钥和证书 Galera 的配置文件中。例如:

    wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt”
    Copy to Clipboard Toggle word wrap
  5. 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:

    # galera_new_cluster
    Copy to Clipboard Toggle word wrap

    此打包程序确保 MariaDB 服务器守护进程(mariadbd)使用 --wsrep-new-cluster 选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。

    注意

    mariadb 服务支持 systemd 方法,来与多个 MariaDB 服务器进程进行交互。因此,在有多个运行的 MariaDB 服务器的情况下,您可以通过将实例名称指定为后缀来 bootstrap 特定的实例:

    # galera_new_cluster mariadb@node1
    Copy to Clipboard Toggle word wrap
  6. 在每个节点上运行以下命令将其他节点连接到集群:

    # systemctl start mariadb
    Copy to Clipboard Toggle word wrap

    因此,节点连接到集群,并将自己与集群的状态同步。

1.8.4. 检查 MariaDB Galera 集群的状态

监控和确保 MariaDB Galera 集群的健康、性能和同步非常重要。为此,您可以在每个节点上查询状态变量,来监控节点和集群。

要检查 MariaDB Galera 集群的状态,您可以使用以下查询:

  • 显示集群中节点的数量:

    # mysql -u root -p -e 'show status like "wsrep_cluster_size";'
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 4     |
    +--------------------+-------+
    Copy to Clipboard Toggle word wrap
  • 显示节点的集群组件状态:

    # mysql -u root -p -e 'show status like "wsrep_cluster_status";'
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | wsrep_cluster_status | Primary |
    +----------------------+---------+
    Copy to Clipboard Toggle word wrap

    wsrep_cluster_status 变量的值表示当前节点所属的集群组件的状态。可能的值有:

    • Primary :集群正常运行。存在仲裁。在健康的集群中,所有节点都报告 Primary
    • Non-primary :节点丢失了到集群的主组件的连接,且不再是活跃集群的一部分。但是,节点仍然可以提供读查询,但不能处理写操作。
    • disconnected :节点没有连接到任何集群组件。因此,它无法接受查询,也不会复制任何数据。
  • 显示节点的状态:

    # mysql -u root -p -e 'show status like "wsrep_local_state_comment";'
    +---------------------------+--------+
    | Variable_name             | Value  |
    +---------------------------+--------+
    | wsrep_local_state_comment | Synced |
    +---------------------------+--------+
    Copy to Clipboard Toggle word wrap

    以下是 wsrep_local_state_comment 变量常用的值:

    • Synced :节点在集群内完全同步,并积极参与复制。
    • Desynced :节点仍然是集群的一部分,但主要忙于状态传输。
    • Joining :节点正在加入集群。
    • Joined :节点已成功加入集群。它可以从集群接收和应用写集合。
    • Donor: 节点当前向正在加入的节点提供状态快照传输(SST)。当新节点加入并需要全状态转移时,集群会选择一个现有节点来发送必要的数据。
  • 检查节点是否接受来自集群的写集合:

    # mysql -u root -p -e 'show status like "wsrep_ready";'
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | wsrep_ready   | ON    |
    +---------------+-------+
    Copy to Clipboard Toggle word wrap

    wsrep_ready 变量为 ON 时,节点已成功初始化其组件,并连接到集群。另外,节点也会同步,或达到一个可以提供查询的状态。

  • 检查节点是否与其他主机有网络连接:

    # mysql -u root -p -e 'show status like "wsrep_connected";'
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | wsrep_connected | ON    |
    +-----------------+-------+
    Copy to Clipboard Toggle word wrap

    ON 值表示节点与集群中的至少一个成员有连接性。

  • 显示自上次 FLUSH STATUS 命令或自服务器启动以来写集合的本地接收的队列的平均大小:

    # mysql -u root -p -e 'show status like "wsrep_local_recv_queue_avg";'
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | wsrep_local_recv_queue_avg | 0.012 |
    +----------------------------+-------+
    Copy to Clipboard Toggle word wrap

    接近 0 的值是理想的状态,表示节点在收到写集时继续应用它们。持久高或增长的值可能是性能瓶颈的一种指示,如磁盘 I/O 慢。

  • 显示流控制状态:

    # mysql -u root -p -e 'show status like "wsrep_flow_control_paused";'
    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | wsrep_flow_control_paused | 0     |
    +---------------------------+-------+
    Copy to Clipboard Toggle word wrap

    这个变量代表节点已暂停,且无法处理新传入的事务的时间分数,因为其本地接收队列太满、触发了流控制。接近 0 的值表示节点继续高效地复制工作负载。接近 1.0 的值意味着节点在应用写集合时频繁或持续遇到困难,并可能成为集群的瓶颈。

    如果节点频繁暂停,您可以调整 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_slave_threads 参数。

  • 显示节点可并行应用的最低和最高序列号之间的平均距离:

    # mysql -u root -p -e 'show status like "wsrep_cert_deps_distance";'
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | wsrep_cert_deps_distance | 1     |
    +--------------------------+-------+
    Copy to Clipboard Toggle word wrap

    数值越高,表示并行的程度越大。它是您可以在 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_slave_threads 参数中可使用的最佳值。

1.8.5. 在 MariaDB Galera 集群中添加新节点

要在 MariaDB Galera 集群中添加新节点,请使用以下流程。

请注意,您也可以使用此流程重新连接已存在的节点。

流程

  • 在特定节点上,在 /etc/my.cnf.d/galera.cnf 配置文件的 [mariadb] 部分的 wsrep_cluster_address 选项中为一个或多个现有群集成员提供一个地址:

    [mariadb]
    wsrep_cluster_address="gcomm://192.168.0.1"
    Copy to Clipboard Toggle word wrap

    当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。

    但是,最好在 wsrep_cluster_address 中列出集群的所有节点。

    因此,任何节点都可以通过连接到任何其他群集节点来加入群集,即使一个或多个群集节点停机了也没关系。当所有成员就成员资格达成一致时,集群的状态将会改变。如果新节点的状态与集群状态不同,新节点需要请求增加状态转移(IST)或状态快照传输(SST),来确保与其他节点保持一致。

1.8.6. 重启 MariaDB Galera 集群

如果您同时关闭所有节点,您将停止集群,正在运行的集群不再存在。但是,集群的数据仍然存在。

要重启集群,请 bootstrap 第一个节点,如 部署 MariaDB Galera 集群 中所述

警告

如果集群没有 bootstrap ,并且第一个节点上的 mariadb 仅使用 systemctl start mariadb 命令启动了,则节点会尝试连接到 /etc/my.cnf.d/galera.cnf 文件的 wsrep_cluster_address 选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。

第 2 章 使用 MySQL

MySQL 服务器是一个开源、快速且健壮的数据库服务器。MySQL 是一个关系型数据库,它将数据转换为结构化信息,并提供一个 SQL 接口来访问数据。它包括多个存储引擎和插件,以及地理信息系统(GIS)和 JavaScript 对象表示法(JSON)功能。

了解如何在 RHEL 系统上安装和配置 MySQL,如何备份 MySQL 数据、如何从较早的 MySQL 版本进行迁移,以及如何复制 MySQL 数据库。

2.1. 安装 MySQL

RHEL 10 提供了 MySQL 8.4 作为应用程序流的初始版本,其可作为 RPM 软件包轻松地安装。其他 MySQL 版本在 RHEL 10 的次版本中作为具有较短生命周期的模块提供。

注意

按照设计,您只能安装同一模块的一个版本(流),并且由于 RPM 软件包之间的冲突,您无法在同一主机上安装 MariaDB 和 MySQL。作为替代方案,您也可以在容器中运行数据库服务器服务。请参阅 使用容器在单个主机上运行多个 MariaDB 和 MySQL 实例

流程

  1. 安装 MySQL 服务器软件包:

    # dnf install mysql8.4-server
    Copy to Clipboard Toggle word wrap
  2. 启用并启动 mysqld 服务:

    # systemctl enable --now mysqld.service
    Copy to Clipboard Toggle word wrap
  3. 安装后提高安全性:

    $ mysql_secure_installation
    Copy to Clipboard Toggle word wrap

    此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:

    • 为 root 帐户设置密码
    • 删除匿名用户
    • 禁止远程 root 登录(在本地主机之外)

如果从软件包安装 MariaDB 或 MySQL,您只能在同一主机上运行这些服务中的一个,且该服务的一个版本。作为一种替代方案,您可以在容器中运行服务来配置以下场景:

  • 您希望在同一主机上运行多个 MariaDB 或 MySQL 实例。
  • 您想要在同一主机上运行 MariaDB 和 MySQL。

先决条件

  • podman 软件包已安装。

流程

  1. 使用您的红帽客户门户网站帐户认证到 registry.redhat.io 注册中心:

    # podman login registry.redhat.io
    Copy to Clipboard Toggle word wrap

    如果您已登录到容器注册中心,请跳过这一步。

  2. 启动您要使用的容器:

    • MariaDB 10.11 :

      $ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
      Copy to Clipboard Toggle word wrap

      有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录

    • MySQL 8.4:

      $ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
      Copy to Clipboard Toggle word wrap

      有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录

    重要

    容器名称和两个数据库服务器的主机端口必须不同。

  3. 要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:

    # firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...}
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  1. 连接到数据库服务器,并以 root 用户身份登录:

    # mysql -u root -p -h localhost -P <host_port> --protocol tcp
    Copy to Clipboard Toggle word wrap
  2. 可选:显示正在运行的容器的信息:

    $ podman ps
    Copy to Clipboard Toggle word wrap

2.3. 配置对 MySQL 的网络访问

如果您网络中的客户端需要远程访问 MySQL 服务器,您必须将 MySQL 服务配置为侦听相应的接口。

流程

  1. 编辑 /etc/my.cnf.d/mysql-server.cnf 文件的 mysqld 部分。您可以设置以下配置指令:

    • bind-address - 是服务器监听的地址。可能的选项有:

      • 主机名
      • IPv4 地址
      • IPv6 地址
    • skip-networking - 控制服务器是否监听 TCP/IP 连接。可能的值有:

      • 0 - 侦听所有客户端
      • 1 - 仅侦听本地客户端
    • port - MySQL 侦听 TCP/IP 连接的端口。
  2. 要确保客户端可以访问网络上的数据库服务器,请在防火墙中开放端口:

    # firewall-cmd --permanent --add-service=mysql
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  3. 重启 mysqld 服务:

    # systemctl restart mysqld.service
    Copy to Clipboard Toggle word wrap

2.4. 在 MySQL 服务器上设置 TLS 加密

默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密的连接。

在 MySQL 服务器上启用 TLS 加密前,请将证书颁发机构(CA)证书、服务器证书和私钥存储在 MySQL 服务器上。

先决条件

  • 以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:

    • 服务器的私钥:server.example.com.key.pem
    • 服务器证书:server.example.com.crt.pem
    • 证书颁发机构(CA)证书:ca.crt.pem

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

流程

  1. 将 CA 和服务器证书存储在 /etc/pki/tls/certs/ 目录中:

    # mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/
    # mv <path>/ca.crt.pem /etc/pki/tls/certs/
    Copy to Clipboard Toggle word wrap
  2. 对 CA 和服务器证书设置权限,使 MySQL 服务器能够读取文件:

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
    Copy to Clipboard Toggle word wrap

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。

  3. 将服务器的私钥存储在 /etc/pki/tls/private/ 目录中:

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
    Copy to Clipboard Toggle word wrap
  4. 对服务器的私钥设置安全权限:

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
    Copy to Clipboard Toggle word wrap

    如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再安全。

  5. 恢复 SELinux 上下文:

    # restorecon -Rv /etc/pki/tls/
    Copy to Clipboard Toggle word wrap

2.4.2. 在 MySQL 服务器上配置 TLS

要提高安全性,请在 MySQL 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密向服务器传输数据。

先决条件

  • 您已安装了 MySQL 服务器。
  • mysqld 服务正在运行。
  • 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由 mysql 用户读取:

    • 服务器的私钥:/etc/pki/tls/private/server.example.com.key.pem
    • 服务器证书:/etc/pki/tls/certs/server.example.com.crt.pem
    • 证书颁发机构(CA)证书 /etc/pki/tls/certs/ca.crt.pem
  • 主题可识别名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名相匹配。

流程

  1. 创建 /etc/my.cnf.d/mysql-server-tls.cnf 文件:

    1. 添加以下内容来配置到私钥、服务器和 CA 证书的路径:

      [mysqld]
      ssl_key = /etc/pki/tls/private/server.example.com.key.pem
      ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
      ssl_ca = /etc/pki/tls/certs/ca.crt.pem
      Copy to Clipboard Toggle word wrap
    2. 如果您有一个证书撤销列表(CRL),请将 MySQL 服务器配置为使用它:

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
      Copy to Clipboard Toggle word wrap
    3. 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
      Copy to Clipboard Toggle word wrap
    4. 可选:设置服务器应支持的 TLS 版本。例如,要只支持 TLS 1.3,请附加:

      tls_version = TLSv1.3
      Copy to Clipboard Toggle word wrap

      默认情况下,服务器支持 TLS 1.2 和 TLS 1.3。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld
    Copy to Clipboard Toggle word wrap

验证

要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MySQL 服务器上执行以下步骤:

  1. 验证 MySQL 现在是否启用了 TLS 加密:

    # mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';"
    +---------------+------------------------+
    | Variable_name | Value                  |
    +---------------+------------------------+
    | Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
    +---------------+------------------------+
    Copy to Clipboard Toggle word wrap
  2. 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示 tls_version 变量:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+---------+
    | Variable_name | Value   |
    +---------------+---------+
    | tls_version   | TLSv1.3 |
    +---------------+---------+
    Copy to Clipboard Toggle word wrap
  3. 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:

    # mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '{caret}ssl_ca|{caret}ssl_cert|{caret}ssl_key';"
    +-----------------+-------------------------------------------------+
    | Variable_name   | Value                                           |
    +-----------------+-------------------------------------------------+
    | ssl_ca          | /etc/pki/tls/certs/ca.crt.pem                   |
    | ssl_capath      |                                                 |
    | ssl_cert        | /etc/pki/tls/certs/server.example.com.crt.pem   |
    | ssl_key         | /etc/pki/tls/private/server.example.com.key.pem |
    +-----------------+-------------------------------------------------+
    Copy to Clipboard Toggle word wrap

可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。

如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。

先决条件

  • MySQL 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。
  • CA 证书存储在客户端上。

流程

  1. 以管理员用户身份连接到 MySQL 服务器:

    # mysql -u root -p -h server.example.com
    Copy to Clipboard Toggle word wrap

    如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令,并连接到 localhost

  2. 使用 REQUIRE SSL 子句强制用户必须使用 TLS 加密连接进行连接:

    MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
    Copy to Clipboard Toggle word wrap

验证

  1. 使用 TLS 加密,以 example 用户身份连接到服务器:

    # mysql -u example -p -h server.example.com
    ...
    MySQL [(none)]>
    Copy to Clipboard Toggle word wrap

    如果没有显示错误,并且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。

    默认情况下,如果服务器提供了,客户端会自动使用 TLS 加密。因此,--ssl-ca=ca.crt.pem--ssl-mode=VERIFY_IDENTITY 选项不是必需的,但可以提高安全性,使用这些选项,客户端可以验证服务器的身份。

  2. 尝试以禁用 TLS 的 example 用户身份进行连接:

    # mysql -u example -p -h server.example.com --ssl-mode=DISABLED
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
    Copy to Clipboard Toggle word wrap

    服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(--ssl-mode=DISABLED)。

2.5. 将 MySQL 客户端配置为默认使用 TLS 加密

在 RHEL 上,您可以全局配置 MySQL 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)是否与用户连接的主机名匹配。这可防止中间人攻击。

先决条件

  • MySQL 服务器启用了 TLS 支持。
  • CA 证书存储在客户端上的 /etc/pki/tls/certs/ca.crt.pem 文件中。

流程

  • 使用以下内容创建 /etc/my.cnf.d/mysql-client-tls.cnf 文件:

    [client]
    ssl-mode=VERIFY_IDENTITY
    ssl-ca=/etc/pki/tls/certs/ca.crt.pem
    Copy to Clipboard Toggle word wrap

    这些设置定义 MySQL 客户端使用 TLS 加密,并且客户端将主机名与服务器证书中的 CN (ssl-mode=VERIFY_IDENTITY)进行比较。另外,它还指定到 CA 证书的路径(ssl-ca)。

验证

  • 使用主机名连接到服务器,并显示服务器的状态:

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384
    Copy to Clipboard Toggle word wrap

    如果 SSL 条目包含 Cipher in use is…​,则连接加密了。

    请注意,您在这个命令中使用的用户具有远程身份验证的权限。

    如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则 ssl-mode=VERIFY_IDENTITY 参数导致连接失败。例如,如果您连接到 localhost

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failed
    Copy to Clipboard Toggle word wrap

2.6. 备份 MySQL 数据

MySQL 数据库备份数据有两种主要方法:

逻辑备份

逻辑备份由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。

与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MySQL 版本或数据库管理系统(DBMS)上恢复,而这些数据无法进行物理备份。

请注意,逻辑备份只在 mysqld.service 运行时才执行。逻辑备份不包括日志和配置文件。

物理备份

物理备份由存储内容的文件和目录的副本组成。

与逻辑备份相比,物理备份具有以下优点:

  • 输出更为紧凑。
  • 备份的大小会较小。
  • 备份和恢复速度更快。
  • 备份包括日志和配置文件。

    请注意,当 mysqld.service 没有运行或数据库中的所有表被锁住时,才能执行物理备份,以防在备份过程中数据有更改。

您可以使用以下 MySQL 备份方法之一从 MySQL 数据库备份数据:

  • 使用 mysqldump 的逻辑备份
  • 文件系统备份
  • 作为备份解决方案复制

2.6.1. 使用 mysqldump 执行逻辑备份

mysqldump 客户端是一个备份工具,可用于转储数据库或数据库集合,用于备份目的或传输到其他数据库服务器。mysqldump 的输出通常由重新创建服务器表结构、为其填充数据的 SQL 语句组成,或两者兼而有之。mysqldump 也可以生成其他格式的文件,包括 XML 和分隔的文本格式,如 CSV。

要执行 mysqldump 备份,您可以使用以下选项之一:

  • 备份一个或多个所选的数据库
  • 备份所有数据库
  • 从一个数据库备份表子集

流程

  • 要转储单个数据库,请运行:

    # mysqldump [options] --databases db_name > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要一次转储多个数据库,请运行:

    # mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要转储所有数据库,请运行:

    # mysqldump [options] --all-databases > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要将一个或多个转储的完整数据库加载回服务器,请运行:

    # mysql < backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要将数据库加载到远程 MySQL 服务器,请运行:

    # mysql --host=remote_host < backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要转储一个数据库中的表的子集,请在 mysqldump 命令的末尾添加所选表的列表:

    # mysqldump [options] db_name [tbl_name ...​] > backup-file.sql
    Copy to Clipboard Toggle word wrap
  • 要载入从一个数据库转储的表的子集,请运行:

    # mysql db_name < backup-file.sql
    Copy to Clipboard Toggle word wrap
    注意

    此时,db_name 数据库必须存在。

  • 要查看 mysqldump 支持的选项的列表,请运行:

    $ mysqldump --help
    Copy to Clipboard Toggle word wrap

2.6.2. 在 MySQL 服务器上执行文件系统备份

要创建 MySQL 数据文件的文件系统备份,请将 MySQL 数据目录的内容复制到您的备份位置。

要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:

流程

  1. 停止 mysqld 服务:

    # systemctl stop mysqld.service
    Copy to Clipboard Toggle word wrap
  2. 将数据文件复制到所需位置:

    # cp -r /var/lib/mysql/ /backup-location/data/
    Copy to Clipboard Toggle word wrap
  3. 可选:将配置文件复制到所需位置:

    # cp -r /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
    Copy to Clipboard Toggle word wrap
  4. 可选:将日志文件复制到所需位置:

    # cp /var/log/mysql/* /backup-location/logs/
    Copy to Clipboard Toggle word wrap
  5. 启动 mysqld 服务:

    # systemctl start mysqld.service
    Copy to Clipboard Toggle word wrap
  6. 在将备份位置的备份数据加载到 /var/lib/mysql/ 目录时,请确保 mysql:mysql/var/lib/mysql/ 中所有数据的所有者:

    # chown -R mysql:mysql /var/lib/mysql/
    Copy to Clipboard Toggle word wrap

RHEL 10 提供 MySQL 8.4.如果在以前的 RHEL 版本上运行 MySQL 实例,您可以在新主机上设置 RHEL 10,并将实例迁移到其上。

先决条件

  • 您可以在新主机上设置 RHEL 10。
  • 您在 RHEL 8 或 RHEL 9 主机上执行 MySQL 实例的文件系统备份。

流程

  1. 安装 mysql8.4-server 软件包:

    # dnf install mysql8.4-server
    Copy to Clipboard Toggle word wrap
  2. 如果服务已在运行,停止该服务:

    # systemctl stop mysqld.service
    Copy to Clipboard Toggle word wrap
  3. 将之前主机上 /var/lib/mysql/ 目录的内容复制到 RHEL 10 主机上的相同位置。
  4. 将之前主机中的配置文件复制到 /etc/my.cnf.d/ 目录中,并确保文件只包含对 MySQL 8.4 有效的选项。详情请查看 上游文档
  5. 恢复 SELinux 上下文:

    # restorecon -rv /var/lib/mysql/
    # restorecon -rv /etc/my.cnf.d/
    Copy to Clipboard Toggle word wrap
  6. 确保 /var/lib/mysql/ 及其子目录的正确所有权:

    # chown -R mysql:mysql /var/lib/mysql/
    Copy to Clipboard Toggle word wrap
  7. 启用并启动 mysqld 服务:

    # systemctl enable --now mysqld.service
    Copy to Clipboard Toggle word wrap

    当服务启动时,MySQL 会自动检查、修复和更新内部表。

验证

  • 建立到 MySQL 服务器的连接:

    # mysql -u root -p -h <hostname>
    Copy to Clipboard Toggle word wrap

2.8. 复制具有 TLS 加密的 MySQL

MySQL 为复制提供了各种配置选项,范围从基本到高级。这部分论述了使用全局事务标识符(GTID)在新安装的 MySQL 服务器上的 MySQL 中进行复制的基于事务的方法。使用 GTID 简化了事务识别和一致性验证。

重要

如果要使用现有的 MySQL 服务器进行复制,您必须首先同步数据。如需更多信息,请参阅 上游文档

2.8.1. 配置 MySQL 源服务器

您可以设置 MySQL 源服务器所需的配置选项,以便通过 TLS 协议正确地运行并复制数据库服务器上所做的所有更改。

先决条件

  • 源服务器已安装。
  • 源服务器有 TLS 设置

    重要

    源和目标证书必须由同一证书颁发机构签名。

流程

  1. 包括 /etc/my.cnf.d/mysql-server.cnf 文件中 [mysqld] 部分下的以下选项:

    • bind-address=source_ip_adress

      从副本到源的连接需要这个选项。

    • server-id=id

      id 必须是唯一的。

    • log_bin=path_to_source_server_log

      此选项定义 MySQL 源服务器的二进制日志文件的路径。例如:log_bin=/var/log/mysql/mysql-bin.log

    • gtid_mode=ON

      此选项在服务器上启用全局事务标识符(GTID)。

    • enforce-gtid-consistency=ON

      服务器通过仅允许执行可使用 GTID 安全记录的语句来强制实施 GTID 一致性。

    • 可选: binlog_do_db=db_name

      如果您只想复制所选的数据库,则使用这个选项。要复制多个所选的数据库,请分别指定每个数据库:

      binlog_do_db=db_name1
      binlog_do_db=db_name2
      binlog_do_db=db_name3
      Copy to Clipboard Toggle word wrap
    • 可选: binlog_ignore_db=db_name

      使用此选项从复制中排除特定的数据库。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service
    Copy to Clipboard Toggle word wrap

2.8.2. 配置 MySQL 副本服务器

您可以设置 MySQL 副本服务器所需的配置选项,以确保成功复制。

先决条件

  • 副本服务器已安装。
  • 副本服务器有 TLS 设置

    重要

    源和目标证书必须由同一证书颁发机构签名。

流程

  1. 包括 /etc/my.cnf.d/mysql-server.cnf 文件中 [mysqld] 部分下的以下选项:

    • server-id=id

      id 必须是唯一的。

    • relay-log=path_to_replica_server_log

      中继日志是 MySQL 副本服务器在复制期间创建的一组日志文件。

    • log_bin=path_to_replica_sever_log

      此选项定义 MySQL 副本服务器的二进制日志文件的路径。例如:log_bin=/var/log/mysql/mysql-bin.log

      副本中不需要这个选项,但强烈建议使用。

    • gtid_mode=ON

      此选项在服务器上启用全局事务标识符(GTID)。

    • enforce-gtid-consistency=ON

      服务器通过仅允许执行可使用 GTID 安全记录的语句来强制实施 GTID 一致性。

    • log-replica-updates=ON

      这个选项可确保从源服务器接收的更新记录在副本的二进制日志中。

    • skip-replica-start=ON

      此选项可确保在副本服务器启动时不启动复制线程。

    • 可选: binlog_do_db=db_name

      如果您只想复制某些数据库,则使用这个选项。要复制多个数据库,请分别指定每个数据库:

      binlog_do_db=db_name1
      binlog_do_db=db_name2
      binlog_do_db=db_name3
      Copy to Clipboard Toggle word wrap
    • 可选: binlog_ignore_db=db_name

      使用此选项从复制中排除特定的数据库。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service
    Copy to Clipboard Toggle word wrap

2.8.3. 在 MySQL 源服务器上创建复制用户

您必须创建一个复制用户,并授予这个用户所需的复制流量的权限。此流程演示了如何创建具有适当权限的复制用户。仅在源服务器上执行这些步骤。

先决条件

流程

  1. 创建复制用户:

    mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
    Copy to Clipboard Toggle word wrap
  2. 授予用户复制权限:

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*
    Copy to Clipboard Toggle word wrap
  3. 重新在 MySQL 数据库中载入授权表:

    mysql> FLUSH PRIVILEGES;
    Copy to Clipboard Toggle word wrap
  4. 将源服务器设置为只读状态:

    mysql> SET @@GLOBAL.read_only = ON;
    Copy to Clipboard Toggle word wrap

2.8.4. 将 MySQL 副本服务器连接到源服务器

在 MySQL 副本服务器上,您必须配置凭证和源服务器的地址。使用以下流程实现副本服务器。

先决条件

流程

  1. 将副本服务器设置为只读状态:

    mysql> SET @@GLOBAL.read_only = ON;
    Copy to Clipboard Toggle word wrap
  2. 配置复制源:

    mysql> CHANGE REPLICATION SOURCE TO
           SOURCE_HOST='source_hostname',
           SOURCE_USER='replication_user',
           SOURCE_PASSWORD='password',
           SOURCE_AUTO_POSITION=1,
           SOURCE_SSL=1,
           SOURCE_SSL_CA='path_to_ca_on_source',
           SOURCE_SSL_CAPATH='path_to_directory_with_certificates',
           SOURCE_SSL_CERT='path_to_source_certificate',
           SOURCE_SSL_KEY='path_to_source_key';
    Copy to Clipboard Toggle word wrap
  3. 在 MySQL 副本服务器中启动副本线程:

    mysql> START REPLICA;
    Copy to Clipboard Toggle word wrap
  4. 在源和目标服务器上取消只读状态的设置:

    mysql> SET @@GLOBAL.read_only = OFF;
    Copy to Clipboard Toggle word wrap
  5. 可选:检查副本服务器的状态以进行调试:

    mysql> SHOW REPLICA STATUS\G;
    Copy to Clipboard Toggle word wrap
    注意

    如果复制服务器启动或连接失败,您可以跳过 SHOW MASTER STATUS 命令的输出中显示的二进制日志文件位置后的某些事件。例如,从定义的位置跳过第一个事件:

    mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    Copy to Clipboard Toggle word wrap

    之后,尝试再次启动副本服务器。

  6. 可选:停止副本服务器中的副本线程:

    mysql> STOP REPLICA;
    Copy to Clipboard Toggle word wrap

2.8.5. 验证 MySQL 服务器上的复制

在多个 MySQL 服务器中配置复制后,您应该验证它是否正常工作。

流程

  1. 在源服务器上创建一个示例数据库:

    mysql> CREATE DATABASE test_db_name;
    Copy to Clipboard Toggle word wrap
  2. 验证 test_db_name 数据库是否在副本服务器上进行复制。
  3. 在源或副本服务器上执行以下命令,显示 MySQL 服务器的二进制日志文件的状态信息:

    mysql> SHOW MASTER STATUS;
    Copy to Clipboard Toggle word wrap

    Executed_Gtid_Set 列,针对在源上执行的事务显示一组 GTID,它不能为空。

    注意

    当在副本服务器上使用 SHOW REPLICA STATUS 时,Executed_Gtid_Set 行中会显示同样的 GTID 集合。

第 3 章 使用 PostgreSQL

PostgreSQL 服务器是一个基于 SQL 语言的开源、健壮且高度可扩展的数据库服务器。PostgreSQL 服务器提供了一个对象关系型数据库系统,其可以管理大量的数据集和大量的并发用户。因此,PostgreSQL 服务器可用于集群,来管理大量数据。

PostgreSQL 服务器包含确保数据完整性、构建容错环境和应用程序的功能。使用 PostgreSQL 服务器,您可以使用自己的数据类型、自定义功能或来自不同编程语言的代码来扩展数据库,而无需重新编译数据库。

了解如何在 RHEL 系统上安装和配置 PostgreSQL,如何备份 PostgreSQL 数据,以及如何从早期的 PostgreSQL 版本进行迁移。

3.1. 安装 PostgreSQL

RHEL 10 提供 PostgreSQL 16 作为应用程序流的初始版本,其可作为 RPM 软件包轻松安装。在 RHEL 10 的次版本上提供了其他 PostgreSQL 版本来作为具有较短生命周期的替代版本。

重要

按照设计,您只能安装同一模块的一个版本(流),并且因为 RPM 软件包间的冲突,您无法在同一主机上安装多个 PostgreSQL 实例。作为替代方案,您也可以在容器中运行数据库服务器服务。请参阅 使用容器在单个主机上运行多个 PostgreSQL 实例

流程

  1. 安装 PostgreSQL 服务器软件包:

    # dnf install postgresql-server
    Copy to Clipboard Toggle word wrap

    postgres 超级用户会自动创建。

  2. 初始化数据库集群:

    # postgresql-setup --initdb
    Copy to Clipboard Toggle word wrap

    将数据存储在默认的 /var/lib/pgsql/data 目录中。

  3. 启用并启动 postgresql 服务:

    # systemctl enable --now postgresql.service
    Copy to Clipboard Toggle word wrap

如果您从软件包安装 PostgreSQL,则只能在同一主机上运行它的一个版本。TU 运行 PostgreSQL 的多个实例或不同的版本,您可以在容器中运行服务。

先决条件

  • podman 软件包已安装。

流程

  1. 使用您的红帽客户门户网站帐户认证到 registry.redhat.io 注册中心:

    # podman login registry.redhat.io
    Copy to Clipboard Toggle word wrap

    如果您已登录到容器注册中心,请跳过这一步。

  2. 启动您要使用的容器。对于每个容器,请输入:

    $ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_1>:5432 rhel10/postgresql-16
    Copy to Clipboard Toggle word wrap

    有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录

    重要

    容器名称和两个数据库服务器的主机端口必须不同。

  3. 要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:

    # firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...}
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  1. 连接到数据库服务器,并以 root 用户身份登录:

    # psql -u postgres -p -h localhost -P <host_port> --protocol tcp
    Copy to Clipboard Toggle word wrap
  2. 显示正在运行的容器的信息:

    $ podman ps
    Copy to Clipboard Toggle word wrap

3.3. 创建 PostgreSQL 用户

PostgreSQL 用户为以下类型:

  • postgres Linux 系统用户:只使用它来运行 PostgreSQL 服务器和客户端应用程序,如 pg_dump。不要将 postgres 系统用户用于 PostgreSQL 管理方面的任何交互式工作,如数据库创建和用户管理。
  • 数据库超级用户:默认的 postgres PostgreSQL 超级用户与 postgres 系统用户无关。您可以在 /var/lib/pgsql/data/pg_hba.conf 文件中限制 postgres 超级用户的访问,否则不存在其他权限限制。您也可以创建其他数据库超级用户。
  • 具有特定数据库访问权限的角色:

    • A database user:具有默认登录的权限。
    • A group of users:启用管理整个组的权限。

角色可以拥有数据库对象(如表和函数),并且可以使用 SQL 命令将对象特权分配给其他角色。

标准数据库管理特权包括 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE

角色属性是特殊的特权,如 LOGINSUPERUSERCREATEDBCREATEROLE

重要

以不是超级用户的角色执行大部分任务。常见的做法是创建一个具有 CREATEDBCREATEROLE 特权的角色,并将此角色用于所有数据库和角色的日常管理。

先决条件

  • PostgreSQL 服务器已安装。
  • 数据库集群已初始化。
  • /var/lib/pgsql/data/postgresql.conf 文件中的 password_encryption 参数已设为 scram-sha-256
  • /var/lib/pgsql/data/pg_hba.conf 文件中的条目使用 scram-sha-256 哈希算法作为身份验证方法。

流程

  1. postgres 系统用户身份登录,或切换到这个用户:

    # su - postgres
    Copy to Clipboard Toggle word wrap
  2. 启动 PostgreSQL 交互式终端:

    $ psql
    psql (16.4)
    Type "help" for help.
    
    postgres=#
    Copy to Clipboard Toggle word wrap
  3. 可选:获取有关当前数据库连接的信息:

    postgres=# \conninfo
    You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
    Copy to Clipboard Toggle word wrap
  4. 创建一个名为 mydbuser 的用户,为其设置密码,并向用户分配 CREATEROLECREATEDB 权限:

    postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB;
    CREATE ROLE
    Copy to Clipboard Toggle word wrap

    mydbuser 用户现在可以执行日常数据库管理操作:创建数据库并管理用户索引。

  5. 使用 \q meta 命令从交互终端退出:

    postgres=# \q
    Copy to Clipboard Toggle word wrap

验证

  1. mydbuser 用户身份登录到 PostgreSQL 终端,指定主机名,并连接到默认的 postgres 数据库,该数据库是在初始化过程中创建的:

    # psql -U mydbuser -h 127.0.0.1 -d postgres
    Password for user mydbuser:
    Type the password.
    psql (16.4)
    Type "help" for help.
    
    postgres=>
    Copy to Clipboard Toggle word wrap
  2. 创建数据库:

    postgres=> CREATE DATABASE <db_name>;
    Copy to Clipboard Toggle word wrap
  3. 退出会话:

    postgres=# \q
    Copy to Clipboard Toggle word wrap
  4. mydbuser 用户身份连接到新数据库:

    # psql -U mydbuser -h 127.0.0.1 -d <db_name>
    Password for user mydbuser:
    psql (16.4)
    Type "help" for help.
    mydatabase=>
    Copy to Clipboard Toggle word wrap

3.4. 配置 PostgreSQL

在 PostgreSQL 数据库中,所有数据和配置文件都存储在一个名为数据库集群的单个目录中。默认情况下,PostgreSQL 使用 /var/lib/pgsql/data/ 目录。

PostgreSQL 配置由以下文件组成:

  • /var/lib/pgsql/data/postgresql.conf - 用于设置数据库集群参数。
  • /var/lib/pgsql/data/postgresql.auto.conf - 包含与 postgresql.conf 类似的基本的 PostgreSQL 设置。但是这个文件由服务器控制。它由 ALTER SYSTEM 查询来编辑,无法手动编辑。
  • /var/lib/pgsql/data/pg_ident.conf - 用于将来自外部身份验证机制的用户身份映射到 PostgreSQL 用户身份。
  • /var/lib/pgsql/data/pg_hba.conf - 用于为 PostgreSQL 数据库配置客户端身份验证。

流程

  1. 编辑 /var/lib/pgsql/data/postgresql.conf 文件,并配置数据库集群参数的基本设置,例如:

    log_connections = yes
    log_destination = 'syslog'
    search_path = '"$user", public'
    shared_buffers = 128MB
    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  2. 编辑 /var/lib/pgsql/data/pg_hba.conf 文件,并配置客户端身份验证,例如:

    # TYPE    DATABASE       USER        ADDRESS              METHOD
    local     all            all                              trust
    host      postgres       all         192.168.93.0/24      ident
    host      all            all         .example.com         scram-sha-256
    Copy to Clipboard Toggle word wrap
  3. 重启 postgresql 服务,以使修改生效:

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap

3.5. 在 PostgreSQL 服务器上配置 TLS 加密

默认情况下,PostgreSQL 使用未加密的连接。对于更安全的连接,您可以对 PostgreSQL 服务器启用传输层安全(TLS)支持,并将客户端配置为建立加密连接。

先决条件

  • 您创建了 TLS 私钥,证书认证机构(CA)为您的 PostgreSQL 服务器发布了一个服务器证书。
  • PostgreSQL 服务器已安装。
  • 数据库集群已初始化。
  • 如果启用了 FIPS 模式,客户端必须支持 Extended Master Secret(EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 在 RHEL 9.2 及更高版本上强制执行 TLS 扩展 "Extended Master Secret"

流程

  1. 将私钥和服务器证书存储在 /var/lib/pgsql/data/ 目录中:

    # cp server.{key,crt} /var/lib/pgsql/data/
    Copy to Clipboard Toggle word wrap
  2. 设置私钥和证书的所有权:

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
    Copy to Clipboard Toggle word wrap
  3. 对只允许 PostgreSQL 服务器读取文件的服务器证书设置权限:

    # chmod 0400 /var/lib/pgsql/data/server.key
    Copy to Clipboard Toggle word wrap

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对服务器证书文件设置严格的权限。

  4. 编辑 /var/lib/pgsql/data/postgresql.conf 文件并进行以下更改:

    1. 设置 scram-sha-256 哈希算法:

      password_encryption = scram-sha-256
      Copy to Clipboard Toggle word wrap
    2. 启用 TLS 加密:

      ssl = on
      Copy to Clipboard Toggle word wrap
  5. 编辑 /var/lib/pgsql/data/pg_hba.conf 文件,并更新身份验证条目,以使用 TLS 加密和 scram-sha-256 哈希算法。例如,将 host 条目改为 hostssl 以启用 TLS 加密,并在最后一列设置 scram-sha-256 哈希算法:

    hostssl    all    all    192.0.2.0/24    scram-sha-256
    Copy to Clipboard Toggle word wrap
  6. 重启 postgresql 服务:

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap

验证

  • 使用 postgres 超级用户连接到 PostgreSQL 服务器,并执行 \conninfo 元命令:

    # psql "postgresql://postgres@localhost:5432" -c '\conninfo'
    Password for user postgres:
    You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432".
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
    Copy to Clipboard Toggle word wrap

3.6. 使用 SQL 转储备份 PostgreSQL 数据

SQL 转储方法基于使用 SQL 命令生成转储文件。当转储上传回数据库服务器时,它会按与转储时相同的状态重新创建数据库。

以下 PostgreSQL 客户端应用程序为 SQL 转储提供了保证:

  • pg_dump 转储单个数据库,而没有集群范围的有关角色或表空间的信息
  • pg_dumpall 转储给定集群中的每个数据库,并保留集群范围的数据,如角色和表空间定义。

默认情况下,pg_dumppg_dumpall 命令将它的们结果写入标准输出。要将转储保存到文件中,请将输出重定向到 SQL 文件。生成的 SQL 文件可以是文本格式,也可以是允许并行且可以更详细地控制对象恢复的其他格式。

您可以在任何可访问数据库的远程主机中执行 SQL 转储。

3.6.1. SQL 转储的优点和缺陷

与其他 PostgreSQL 备份方法相比,SQL 转储具有以下优点:

  • SQL 转储是唯一一个不是特定于服务器版本的 PostgreSQL 备份方法。pg_dump 工具的输出可以重新加载到 PostgreSQL 的后续版本中,这不适用于文件系统级备份或持续归档。
  • SQL 转储是将数据库传输到不同计算机架构(比如从 32 位服务器传输到 64 位服务器)的唯一方法。
  • SQL 转储提供内部一致的转储。转储表示 pg_dump 开始运行时的数据库的快照。
  • pg_dump 工具在运行时不会阻止对数据库的其他操作。

SQL 转储的一个缺点是,与文件系统级备份相比,它需要更长的时间。

3.6.2. 使用 pg_dump 执行 SQL 转储

要转储没有集群范围信息的单个数据库,请使用 pg_dump 工具。

先决条件

  • 您必须对要转储的所有表具有读的权限。若要转储整个数据库,您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 转储没有集群范围信息的数据库:

    $ pg_dump <db_name> > <dump_file>
    Copy to Clipboard Toggle word wrap

    要指定 pg_dump 将联系哪个数据库服务器,请使用以下命令行选项:

    • -h 选项用来定义主机的。

      默认主机要么是本地主机,要么是 PGHOST 环境变量所指定的主机。

    • -p 选项用来定义端口 。

      默认端口是由 PGPORT 环境变量或编译后的默认值指明的。

3.6.3. 使用 pg_dumpall 执行 SQL 转储

要转储给定数据库集群中的每个数据库,并保留集群范围的数据,请使用 pg_dumpall 工具。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 转储数据库集群中的所有数据库,并保留集群范围的数据:

    $ pg_dumpall > <dump_file>
    Copy to Clipboard Toggle word wrap

    要指定 pg_dumpall 将联系哪个数据库服务器,请使用以下命令行选项:

    • -h 选项用来定义主机的。

      默认主机要么是本地主机,要么是 PGHOST 环境变量所指定的主机。

    • -p 选项用来定义端口 。

      默认端口是由 PGPORT 环境变量或编译后的默认值指明的。

    • -l 选项用来定义默认数据库。

      这个选项使您能够选择一个与初始化过程中自动创建的 postgres 数据库不同的默认数据库。

3.6.4. 使用 pg_dump 恢复转储的数据库

要从使用 pg_dump 工具转储的 SQL 转储中恢复数据库,请按照以下步骤操作。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  1. 创建新数据库:

    $ createdb <db_name>
    Copy to Clipboard Toggle word wrap
  2. 验证在转储数据库中拥有对象或被赋予了对象权限的所有用户是否已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
  3. 运行 psql 工具来恢复 pg_dump 工具创建的文本文件转储:

    $ psql <db_name> < <dump_file>
    Copy to Clipboard Toggle word wrap

    其中 <dump_file>pg_dump 命令的输出。要恢复非文本文件转储,请使用 pg_restore 工具:

    $ pg_restore <non-plain_text_file>
    Copy to Clipboard Toggle word wrap

3.6.5. 使用 pg_dumpall 恢复转储的数据库

要从使用 pg_dumpall 工具转储的数据库集群中恢复数据,请按照以下步骤操作。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  1. 确保在转储数据库中拥有对象或已被赋予了对象权限的所有用户已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
  2. 运行 psql 工具来恢复 pg_dumpall 工具创建的文本文件转储:

    $ psql < <dump_file>
    Copy to Clipboard Toggle word wrap

    其中 <dump_file>pg_dumpall 命令的输出。

3.6.6. 在另一服务器上执行数据库的 SQL 转储

可以直接从一台服务器转储到另一台服务器,因为 pg_dumppsql 可以写入管道并从管道读取。

流程

  • 要从一个服务器到另一个服务器转储数据库,请运行:

    $ pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
    Copy to Clipboard Toggle word wrap

3.6.7. 在恢复过程中处理 SQL 错误

默认情况下,如果出现 SQL 错误,psql 会继续执行,从而导致数据库只部分恢复。

要修改默认行为,在恢复转储时使用以下任一方法:

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 设置 ON_ERROR_STOP 变量,使 psql 在发生 SQL 错误时退出,且退出状态为 3:

    $ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
    Copy to Clipboard Toggle word wrap
  • 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。

    • 当使用 psql 工具恢复文本文件转储时:

      $ psql -1
      Copy to Clipboard Toggle word wrap
    • 当使用 pg_restore 工具恢复非文本文件转储时:

      $ pg_restore -e
      Copy to Clipboard Toggle word wrap

    请注意,当您使用此方法时,即使是小的错误也可能会取消已运行了数小时的恢复操作。

要创建文件系统级备份,请将 PostgreSQL 数据库文件复制到另一个位置。例如,您可以使用以下任一方法:

  • 使用 tar 工具创建存档文件。
  • 使用 rsync 工具将文件复制到其他位置。
  • 创建数据目录的一致快照。

3.7.1. 文件系统备份的优点和限制

与其他 PostgreSQL 备份方法相比,文件系统级备份有以下优点:

  • 文件系统级备份通常比 SQL 转储快。

与其它 PostgreSQL 备份方法相比,文件系统级备份有以下限制:

  • 当您要从 RHEL 9 升级到 RHEL 10 ,并将您的数据迁移到升级的系统时,这个备份方法不适用。文件系统级别备份特定于架构和 RHEL 主版本。如果升级不成功,但您无法在 RHEL 10 系统上恢复数据,则您可以在 RHEL 9 系统上恢复数据。
  • 在备份和恢复数据前,数据库服务器必须关闭。
  • 无法备份和恢复某些单独的文件或表。备份文件系统只适用于整个数据库集群的完整备份和恢复。

3.7.2. 执行文件系统级备份

要执行文件系统级备份,请使用以下流程。

流程

  1. 停止 postgresql 服务:

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  2. 使用任意方法创建文件系统备份,如 tar 归档:

    $ tar -cf backup.tar /var/lib/pgsql/data/
    Copy to Clipboard Toggle word wrap
  3. 启动 postgresql 服务:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap

3.8. 通过持续存档来备份 PostgreSQL 数据

PostgreSQL 将对数据库的数据文件所做的每个更改都记录到预写日志(WAL)文件中,该文件位于集群数据目录的 pg_wal/ 子目录中。此日志主要用于崩溃恢复。崩溃后,可用上次检查点以后所记录的日志条目将数据库恢复到一致。

持续归档方法也称为在线备份,以在运行的服务器上执行的基础备份或文件系统级备份的形式,将 WAL 文件与数据库集群的副本结合起来。

如果需要进行数据库恢复,您可以从数据库集群的副本恢复数据库,然后从备份的 WAL 文件中重新执行日志,使系统恢复到当前状态。

使用持续归档方法时,您必须保持所有归档的 WAL 文件的连续顺序,这些文件至少可扩展到上一次基础备份的开始时间。因此,基本备份的理想频率取决于:

  • 归档 WAL 文件的存储卷。
  • 需要恢复时数据恢复的最可能持续时间。自上次备份以来的很长一段时间,系统重新运行了更多 WAL 段,因此恢复需要更长的时间。
注意

您不能使用 pg_dumppg_dumpall SQL 转储作为持续归档备份解决方案的一部分。SQL 转储生成逻辑备份,但所包含的信息不足以供WAL重新执行。

3.8.1. 持续归档的优点和缺陷

与其他 PostgreSQL 备份方法相比,持续归档具有以下优点:

  • 使用持续备份方法时,可以使用不完全一致的基础备份,因为备份中的任何内部不一致都可以被重新执行日志所修正。因此,您可以对运行的 PostgreSQL 服务器执行基础备份。
  • 不需要文件系统快照; tar 或类似的归档工具就足够了。
  • 持续备份可以通过继续归档 WAL 文件来实现,因为日志重播的 WAL 文件序列可能会无限期地延长。这对大型数据库尤其重要。
  • 持续备份支持点恢复。不需要将 WAL 条目重新显示到结尾。可在任何时间点停止重新执行,并且数据库可以恢复到执行基础备份以后的任何状态。
  • 如果已经加载了相同的基础备份文件的另一台机器可以连续使用WAL文件系列,那么可以在任何时候用数据库几乎当前的副本来恢复其它机器。

与其他 PostgreSQL 备份方法相比,持续归档有以下缺点:

  • 持续备份方法只支持恢复整个数据库集群,而不是子集。
  • 持续备份需要广泛的归档存储。

3.8.2. 设置 WAL 归档

正在运行的 PostgreSQL 服务器会生成一系列预写日志(WAL)记录。服务器物理上将该序列分成 WAL 段文件,这些文件被指定了数字名称,以反映它们在 WAL 序列中的位置。如果不进行 WAL 归档,段文件将被重新使用,并被重命名为更高的段号。

在归档 WAL 数据时,在重用段文件之前,都会捕获每一个段文件的内容,并将其保存在一个新的位置。您有多个保存内容的选项,例如其他机器上的 NFS 挂载目录、磁带驱动器或 CD。

请注意,WAL 记录不包括对配置文件的修改。

要启用 WAL 归档,请使用以下流程:

流程

  1. /var/lib/pgsql/data/postgresql.conf 文件中:

    1. wal_level 配置参数设置为 replica 或更高的值。
    2. archive_mode 参数设置为 on
    3. archive_command 配置参数中指定 shell 命令。您可以使用 cp 命令、其它命令或 shell 脚本。

      例如:

      archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
      Copy to Clipboard Toggle word wrap

      其中 %p 参数替换为归档文件的相对路径,%f 参数替换为文件名。

      此命令将可归档的 WAL 段复制到 /mnt/server/archivedir/ 目录中。替换 %p%f 参数后,执行的命令如下所示:

      test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
      Copy to Clipboard Toggle word wrap

      对每个归档的新文件都会生成类似的命令。

      注意

      归档命令只对已完成的 WAL 段执行。生成小 WAL 流量的服务器在交易完成和其归档存储中的安全记录之间可能会有很长时间的延迟。要限制未归档数据可保留多久,您可以:

      • 设置 archive_timeout 参数,来强制服务器以给定频率切换到新的 WAL 段文件。
      • 使用 pg_switch_wal 参数强制段切换,以确保交易在完成后立即归档。
  2. 重启 postgresql 服务以使修改生效:

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap
  3. 测试您的归档命令,并确保它不会覆盖现有的文件,如果失败,它将返回一个非零退出状态。
  4. 要保护您的数据,请确保将段文件归档到不具有组或全局读权限的目录中。

3.8.3. 进行基础备份

您可以通过多种方法创建基础备份:执行基础备份的最简单方法是对运行的 PostgreSQL 服务器使用 pg_basebackup 工具。

基础备份进程会创建一个备份历史记录文件,该文件存储在 WAL 归档区,并以基础备份所需的第一个 WAL 段文件来命名。

备份历史记录文件是一个小文本文件,其包含开始和结束时间,以及备份的 WAL 段。如果您使用标签字符串来标识关联的转储文件,那么您可以使用备份历史记录文件来确定要恢复哪个转储文件。

注意

请考虑保留多个备份集,以确保您可以恢复数据。

先决条件

  • 您必须以 postgres 超级用户身份、具有数据库管理员特权的用户身份或至少具有 REPLICATION 权限的其他用户身份来运行命令。
  • 您必须保留在基础备份期间和之后生成的所有 WAL 段文件。

流程

  1. 使用 pg_basebackup 工具执行基础备份。

    • 将基础备份创建为单个的文件(纯格式):

      $ pg_basebackup -D <backup_directory> -Fp
      Copy to Clipboard Toggle word wrap

      使用您选择的备份位置替换 backup_directory

      如果您在与服务器相同的主机上使用表空间并执行基础备份,那么也必须使用 --tablespace-mapping 选项,否则当试图将备份写入到同一位置时,备份将失败。

    • 将基础备份创建为一个 tar 归档(tar 和压缩格式):

      $ pg_basebackup -D <backup_directory> -Ft -z
      Copy to Clipboard Toggle word wrap

      使用您选择的备份位置替换 backup_directory

      要恢复此数据,您必须手动提取正确位置中的文件。

    要指定serverpg_basebackup将与哪个数据库联系,请使用以下命令行选项:

    • -h 选项用来定义主机的。

      默认主机要么是本地主机,要么是 PGHOST 环境变量所指定的主机。

    • -p 选项用来定义端口。

      默认端口是由 PGPORT 环境变量或编译后的默认值指明的。

  2. 基础备份进程完成后,将备份历史记录文件中指定的数据库集群副本和备份过程中使用的 WAL 段文件进行安全归档。
  3. 删除比基础备份中使用的 WAL 段文件数值更低的WAL段,因为这些比基础备份旧,并且不再需要进行恢复。

3.8.4. 使用持续归档备份恢复数据库

要使用持续备份恢复数据库,请使用以下流程:

流程

  1. 停止服务器:

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  2. 将必要的数据复制到临时位置。

    最好复制整个集群数据目录和任何表空间。请注意,这需要系统上有足够的可用空间来保存现有数据库的两个副本。

    如果您没有足够的空间,就保存集群的pg_wal 目录的内容,其中可能包含系统关闭前没有归档的日志。

  3. 删除集群数据目录下的所有现有文件和子目录,并在您要使用的任何表空间的根目录下删除。
  4. 从您的基础备份恢复数据库文件。

    确保:

    • 恢复的文件具有正确的所有权(数据库系统用户,而不是 root)。
    • 恢复的文件具有正确的权限。
    • pg_tblspc/ 子目录中的符号链接被正确恢复。
  5. 删除 pg_wal/ 子目录中的任何文件。

    这些文件源自基础备份,因此已过时。如果您没有归档 pg_wal/,请重新创建它,并使其具有正确的权限。

  6. 将你在步骤 2 中保存的任何未归档的 WAL 段文件复制到 pg_wal/ 中。
  7. 在集群数据目录中创建 restore.conf 恢复命令文件,并在 restore_command 配置参数中指定 shell 命令。您可以使用 cp 命令、其它命令或 shell 脚本。例如:

    restore_command = 'cp /mnt/server/archivedir/%f "%p"'
    Copy to Clipboard Toggle word wrap
  8. 启动服务器:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap

    服务器将进入恢复模式,并继续读取所需的存档 WAL 文件。

    如果恢复因为外部错误而终止,那么可以重启服务器,它将继续进行恢复。恢复过程完成后,服务器将 restore.conf 重命名为 restore.done。这可以防止服务器在启动正常的数据库操作后意外重新进入恢复模式。

  9. 检查数据库的内容,以验证数据库是否已恢复到所需的状态。

    如果数据库尚未恢复到所需状态,请返回到第 1 步。如果数据库已恢复到所需的状态,那么通过恢复 pg_hba.conf 文件中的客户端身份验证配置来允许用户进行连接。

如果您已在 RHEL 9 上运行了低于 16 的 PostgreSQL 版本,并希望将数据库软件移到运行 RHEL 10 的主机上,您可以迁移数据库。

可用的迁移方法是:

重要

在 PostgreSQL 迁移前,始终备份源主机上的 /var/lib/pgsql/data/ 目录。

您可以使用备份和恢复方法将数据从 PostgreSQL 的任何 RHEL 8 或 RHEL 9 版本迁移到 RHEL 10 上 PostgreSQL 的任何相等或更新版本。

先决条件

  • 现有数据库服务器在 RHEL 8 或 RHEL 9 上运行,并使用从 RHEL 存储库安装的 PostgreSQL 版本。
  • 两个主机上的区域设置是相同的。要验证这一点,请比较两个主机上的 echo $LANG 命令的输出。

流程

  1. 在具有您要迁移的现有 PostgreSQL 实例的主机上:

    1. 将所有数据库导出到 /var/lib/pgsql/pgdump_file.sql 文件中:

      # su - postgres -c "pg_dumpall > /var/lib/pgsql/pgdump_file.sql"
      Copy to Clipboard Toggle word wrap
    2. 检查导出的文件:

      # su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'
      Copy to Clipboard Toggle word wrap
    3. 将您在之前步骤中创建的数据库转储和 PostgreSQL 配置文件复制到 RHEL 10 主机,例如:

      # scp /var/lib/pgsql/pgdump_file.sql \
             /var/lib/pgsql/data/pg_hba.conf \
             /var/lib/pgsql/data/pg_ident.conf \
             /var/lib/pgsql/data/postgresql.conf \
             <user>@<rhel_10_host>:/tmp/
      Copy to Clipboard Toggle word wrap
  2. 在 RHEL 10 主机上:

    1. 安装 postgresql-server 软件包:

      # dnf install postgresql-server
      Copy to Clipboard Toggle word wrap
    2. 初始化 /var/lib/pgsql/data/ 目录:

      # postgresql-setup --initdb
      Copy to Clipboard Toggle word wrap
    3. 将复制的配置文件移到 /var/lib/pgsql/data/ 目录中:

      # mv /tmp/pg_hba.conf \
           /tmp/pg_ident.conf \
           /tmp/postgresql.conf \
           /var/lib/pgsql/data/
      Copy to Clipboard Toggle word wrap
    4. 确保 /var/lib/pgsql/data/ directory 目录中内容的所有权正确:

      # chown -R postgres:postgres /var/lib/pgsql/data/
      Copy to Clipboard Toggle word wrap
    5. /var/lib/pgsql/data/ 恢复 SELinux 上下文:

      # restorecon -Rv /var/lib/pgsql/data/
      Copy to Clipboard Toggle word wrap
    6. 启用并启动 postgresql 服务:

      # systemctl enable --now postgresql.service
      Copy to Clipboard Toggle word wrap
    7. postgres 用户身份导入数据:

      # su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'
      Copy to Clipboard Toggle word wrap
    8. 验证您的数据库,并确保您的使用 PostgreSQL 服务器的应用程序可以正常工作。

如果要将 PostgreSQL 13 实例从以前的 RHEL 版本迁移到 RHEL 10 上的 PostgreSQL 16,您可以使用快速升级方法。使用此方法,您可以将 /var/lib/pgsql/data/ 目录的内容复制到 RHEL 10 主机,并使用 pg_update 工具转换数据库。

重要

此方法只有在现有的 PostgreSQL 实例版本是 13 ,且硬件架构在源和目标主机上相同时才可以正常工作。在其他情况下,请使用 备份和恢复方法

先决条件

  • 现有数据库服务器使用 PostgreSQL 13。
  • 当前和未来服务器的硬件架构是相同的。
  • RHEL 10 主机在存放 /var/lib/pgsql/ 目录的磁盘上有足够的可用空间。

    例如,如果要迁移的 PostgreSQL 服务器上的目录的大小为 10 GiB,则迁移过程中,RHEL 10 主机上至少需要 20 GiB 的可用磁盘空间。

  • 两个主机上的区域设置是相同的。要验证这一点,请比较两个主机上的 echo $LANG 命令的输出。

流程

  1. 在具有您要迁移的现有 PostgreSQL 实例的主机上:

    1. 停止 postgresql 服务:

      # systemctl stop postgresql.service
      Copy to Clipboard Toggle word wrap
    2. 进到 /var/lib/pgsql/ 目录,并备份 data 子目录:

      # cd /var/lib/pgsql/
      # tar -zcf ~/pgdata.bak.tar.gz data/
      Copy to Clipboard Toggle word wrap
    3. ~/pgdata.bak.tar.gz 存档复制到 RHEL 10 主机,例如:

      # scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/
      Copy to Clipboard Toggle word wrap
  2. 在 RHEL 10 主机上:

    1. 安装所需的软件包:

      # dnf install postgresql-server postgresql-upgrade
      Copy to Clipboard Toggle word wrap

      postgresql-upgrade 软件包提供在一个迁移过程中所需的 PostgreSQL 13 服务器。

    2. 如果您使用第三方 PostgreSQL 服务器模块,请针对 postgresql-develpostgresql-upgrade-devel 软件包构建它们,并安装它们。
    3. 确保 postgresql 服务已停止:

      # systemctl stop postgresql.service
      Copy to Clipboard Toggle word wrap
    4. 进入 /var/lib/pgsql/ 目录,并从之前主机中提取备份的数据目录:

      # cd /var/lib/pgsql/
      # tar -zxf /tmp/pgdata.bak.tar.gz
      Copy to Clipboard Toggle word wrap
    5. 可选:删除 /tmp/pgdata.bak.tar.gz 归档:

      # rm /tmp/pgdata.bak.tar.gz
      Copy to Clipboard Toggle word wrap
    6. 执行升级过程:

      # postgresql-setup --upgrade
      Copy to Clipboard Toggle word wrap

      postgresql-setup shell 脚本将 /var/lib/pgsql/data/ 目录重命名为 /var/lib/pgsql/data-old/,并使用 pg_upgrade 工具将数据库迁移到重新创建的 /var/lib/pgsql/data/ 目录中。

      重要

      pg_upgrade 工具只迁移数据库,而不迁移配置文件。迁移后,/var/lib/pgsql/data/ 仅包含默认的 .conf 文件。如果您之前有自定义配置文件,请从 /var/lib/pgsql/data-old/ 目录中复制它们,并确保它们与新的 PostgreSQL 版本兼容。

    7. 启用并启动 postgresql 服务:

      # systemctl enable --now postgresql.service
      Copy to Clipboard Toggle word wrap
    8. 清理和分析所有数据库:

      # su postgres -c 'vacuumdb --all --analyze-in-stages'
      Copy to Clipboard Toggle word wrap
    9. 验证您的数据库,并确保您的使用 PostgreSQL 服务器的应用程序可以正常工作。
    10. 可选:删除 /var/lib/pgsql/data-old/ 目录,该目录包含迁移之前的数据库和配置文件。

      # rm -r /var/lib/pgsql/data-old/
      Copy to Clipboard Toggle word wrap
    11. 可选:删除 postgresql-upgrade 软件包:

      # dnf remove postgresql-upgrade
      Copy to Clipboard Toggle word wrap

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat