配置和使用数据库服务器
在数据库服务器上安装、配置、备份和迁移数据
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 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 实例。
流程
安装 MariaDB 服务器软件包:
dnf install mariadb-server
# dnf install mariadb-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
mariadb
服务:systemctl enable --now mariadb.service
# systemctl enable --now mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2. 使用容器在单个主机上运行多个 MariaDB 和 MySQL 实例 复制链接链接已复制到粘贴板!
如果从软件包安装 MariaDB 或 MySQL,您只能在同一主机上运行这些服务中的一个,且该服务的一个版本。作为一种替代方案,您可以在容器中运行服务来配置以下场景:
- 您希望在同一主机上运行多个 MariaDB 或 MySQL 实例。
- 您想要在同一主机上运行 MariaDB 和 MySQL。
先决条件
-
podman
软件包已安装。
流程
使用您的红帽客户门户网站帐户认证到
registry.redhat.io
注册中心:podman login registry.redhat.io
# podman login registry.redhat.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
启动您要使用的容器:
MariaDB 10.11 :
podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
$ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
MySQL 8.4:
podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
$ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
重要容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
连接到数据库服务器,并以 root 用户身份登录:
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示正在运行的容器的信息:
podman ps
$ podman ps
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. 配置对 MariaDB 的网络访问 复制链接链接已复制到粘贴板!
如果您网络中的客户端需要远程访问 MariaDB 服务器,您必须将 MariaDB 服务配置为侦听相应的接口。
流程
编辑
/etc/my.cnf.d/mariadb-server.cnf
文件的[mysqld]
部分。您可以设置以下配置指令:bind-address
- 是服务器监听的地址。可能的选项有:- 主机名
- IPv4 地址
- IPv6 地址
skip-networking
- 控制服务器是否监听 TCP/IP 连接。可能的值有:- 0 - 侦听所有客户端
- 1 - 只监听本地客户端
-
port
- MariaDB 监听 TCP/IP 连接的端口。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中开放端口:
firewall-cmd --permanent --add-service=mysql firewall-cmd --reload
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
mariadb
服务:systemctl restart mariadb.service
# systemctl restart mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. 在 MariaDB 服务器上设置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并配置您的客户端,来建立加密连接。
1.4.1. 将 CA 证书、服务器证书和私钥放在 MariaDB 服务器上 复制链接链接已复制到粘贴板!
在 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 文档。
-
服务器的私钥:
流程
将 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/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对 CA 和服务器证书设置权限,使 MariaDB 服务器能够读取文件:
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/
目录中:mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对服务器的私钥设置安全权限:
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# 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 Copied! Toggle word wrap Toggle overflow 如果未授权的用户可以访问私钥,则到 MariaDB 服务器的连接不再安全。
恢复 SELinux 上下文:
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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"。
流程
创建
/etc/my.cnf.d/mariadb-server-tls.cnf
文件:添加以下内容来配置到私钥、服务器和 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
[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 Copied! Toggle word wrap Toggle overflow 如果您有一个证书撤销列表(CRL),请将 MariaDB 服务器配置为使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on
require_secure_transport = on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:设置服务器应支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:
tls_version = TLSv1.2,TLSv1.3
tls_version = TLSv1.2,TLSv1.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。
重启
mariadb
服务:systemctl restart mariadb
# systemctl restart mariadb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MariaDB 服务器上执行以下步骤:
验证 MariaDB 现在是否启用了 TLS 加密:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
have_ssl
变量设置为yes
,则启用 TLS 加密。如果您将 MariaDB 服务配置为只支持特定的 TLS 版本,则显示
tls_version
变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.3. MariaDB 服务器上特定的用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on
),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MariaDB 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
流程
以管理员用户身份连接到 MariaDB 服务器:
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的管理用户没有远程访问服务器的权限,请在 MariaDB 服务器上执行命令,并连接到
localhost
。使用
REQUIRE SSL
子句强制用户必须使用 TLS 加密连接进行连接:MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 TLS 加密,以
example
用户身份连接到服务器:mysql -u example -p -h server.example.com --ssl
# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有显示错误,且您可以访问交互式 MariaDB 控制台,则与 TLS 的连接成功。
尝试以禁用 TLS 的
example
用户身份进行连接:mysql -u example -p -h server.example.com --skip-ssl
# 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 Copied! Toggle word wrap Toggle overflow 服务器拒绝登录尝试,因为此用户需要 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"。
流程
如果 RHEL 不信任发布服务器证书的 CA:
将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/
目录中:cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置允许所有用户读取 CA 证书文件的权限:
chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重建 CA 信任数据库:
update-ca-trust
# update-ca-trust
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用以下内容创建
/etc/my.cnf.d/mariadb-client-tls.cnf
文件:[client-mariadb] ssl ssl-verify-server-cert
[client-mariadb] ssl ssl-verify-server-cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义 MariaDB 客户端使用 TLS 加密(
ssl
),并且客户端将主机名与服务器证书 (ssl-verify-server-cert
)中的 CN 进行比较。
验证
使用主机名连接到服务器,并显示服务器状态:
mysql -u root -p -h server.example.com -e status
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
SSL
条目包含Cipher in use is…
,则连接加密了。请注意,您在这个命令中使用的用户具有远程身份验证的权限。
如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则
ssl-verify-server-cert
参数会导致连接失败。例如,如果您连接到localhost
:mysql -u root -p -h localhost -e status
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# mariadb-dump [options] --databases db_name > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要一次转储多个数据库,请运行:
mariadb-dump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
# mariadb-dump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储所有数据库,请运行:
mariadb-dump [options] --all-databases > backup-file.sql
# mariadb-dump [options] --all-databases > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将一个或多个转储的完整数据库加载回服务器,请运行:
mariadb < backup-file.sql
# mariadb < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将数据库加载到远程 MariaDB 服务器,请运行:
mariadb --host=remote_host < backup-file.sql
# mariadb --host=remote_host < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要从一个数据库转储表子集,请在
mariadb-dump
命令末尾添加所选表的列表:mariadb-dump [options] db_name [tbl_name ...] > backup-file.sql
# mariadb-dump [options] db_name [tbl_name ...] > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要载入从一个数据库转储的表的子集,请运行:
mariadb db_name < backup-file.sql
# mariadb db_name < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此时,db_name 数据库必须存在。
要查看 mariadb-dump 支持的选项列表,请运行:
mariadb-dump --help
$ mariadb-dump --help
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6.2. 使用 mariabackup 工具执行物理在线备份 复制链接链接已复制到粘贴板!
mariabackup
工具基于 Percona XtraBackup 技术,它允许执行 InnoDB、Aria 和 MyISAM 表的物理在线备份。工具支持对 MariaDB 服务器的全备份功能,其包括加密和压缩的数据。
先决条件
-
mariadb-backup
软件包已在系统中安装: -
您必须为在其下运行备份的用户提供
mariabackup
和凭证。您可以在命令行中或通过配置文件来提供凭证。 -
mariabackup
的用户必须具有RELOAD
、LOCK TABLES
和REPLICATION CLIENT
特权。
流程
使用以下选项之一创建备份:
要在在命令行上提供凭证时创建备份,请输入:
mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow target-dir
选项定义存储备份文件的目录。如果要执行全备份,目标目录必是空或者不存在。user
和password
选项允许您配置用户名和密码。要使用配置文件中设置的凭证创建备份:
-
在
/etc/my.cnf.d/
目录中创建配置文件,例如/etc/my.cnf.d/mariabackup.cnf
。 在文件中添加以下内容:
[mysqld] user=<backup_username> password=<password>
[mysqld] user=<backup_username> password=<password>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 执行备份:
mariabackup --backup --target-dir <backup_directory>
$ mariabackup --backup --target-dir <backup_directory>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
在
1.6.3. 使用 mariabackup 工具恢复数据 复制链接链接已复制到粘贴板!
如果您有 mariabackup
工具创建的 MariaDB 备份,您可以使用相同的工具恢复数据。
先决条件
-
mariadb
服务已停止。 - 数据目录为空。
-
mariabackup
的用户必须具有RELOAD
、LOCK TABLES
和REPLICATION CLIENT
特权。
流程
使用以下选项之一恢复数据:
要从
/var/mariadb/backup/
目录中的备份恢复数据,并保留原始备份文件,请输入:mariabackup --copy-back --target-dir=/var/mariadb/backup/
$ mariabackup --copy-back --target-dir=/var/mariadb/backup/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要从
/var/mariadb/backup/
目录中的备份恢复数据,并删除原始备份文件,请输入:mariabackup --move-back --target-dir=/var/mariadb/backup/
$ mariabackup --move-back --target-dir=/var/mariadb/backup/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
修复文件权限。例如,要递归地将文件的所有权改为
mysql
用户和组,请输入:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复数据库时,
mariabackup
会保留备份的文件和目录特权。但是,mariabackup
以恢复数据库的用户和组的身份将文件写入磁盘。因此,在恢复备份后,您必须调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组。启动
mariadb
服务:systemctl start mariadb.service
# systemctl start mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6.4. 对 MariaDB 服务器执行文件系统备份 复制链接链接已复制到粘贴板!
要创建一个 MariaDB 数据文件的文件系统备份,请将 MariaDB 数据目录的内容复制到您的备份位置。
要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:
流程
停止
mariadb
服务:systemctl stop mariadb.service
# systemctl stop mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制数据文件:
cp -rp /var/lib/mysql/ /backup-location/data/
# cp -rp /var/lib/mysql/ /backup-location/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制配置文件:
cp -rp /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
# cp -rp /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:复制日志文件:
cp -p /var/log/mariadb/* /backup-location/logs/
# cp -p /var/log/mariadb/* /backup-location/logs/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mariadb
服务:systemctl start mariadb.service
# systemctl start mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将备份位置的备份数据加载到
/var/lib/mysql
目录时,请确保mysql:mysql
是/var/lib/mysql
中所有数据的所有者:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6.5. 作为备份解决方案复制 复制链接链接已复制到粘贴板!
如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。
复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。
RHEL 10 提供 MariaDB 10.11。如果您在之前的 RHEL 版本上运行了 MariaDB 实例,则您可以在新主机上设置 RHEL 10,并将实例迁移到其上。
先决条件
- 您可以在新主机上设置 RHEL 10。
- 您对 RHEL 8 或 RHEL 9 主机执行 MariaDB 实例的文件系统备份。
流程
安装
mariadb-server
软件包:dnf install mariadb-server
# dnf install mariadb-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务已在运行,停止该服务:
systemctl stop mariadb.service
# systemctl stop mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将之前主机上
/var/lib/mysql/
目录的内容复制到 RHEL 10 主机上的相同位置。 -
将之前主机中的配置文件复制到
/etc/my.cnf.d/
目录中,并确保文件仅包含 MariaDB 10.11 的有效选项。详情请查看 上游文档。 恢复 SELinux 上下文:
restorecon -rv /var/lib/mysql/ restorecon -rv /etc/my.cnf.d/
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
/var/lib/mysql/
及其子目录的正确所有权:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
mariadb
服务:systemctl enable --now mariadb.service
# systemctl enable --now mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当服务启动时,MariaDB 会自动检查、修复和更新内部表。
验证
建立到 MariaDB 服务器的连接:
mysql -u root -p -h <hostname>
# mysql -u root -p -h <hostname>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
TLS Web Server Authentication, TLS Web Client Authentication
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
安装 MariaDB Galera 集群软件包:
dnf install mariadb-server-galera
# dnf install mariadb-server-galera
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,以下软件包会与依赖项一起安装:
-
mariadb-server-galera
-
mariadb-server
galera
有关构建 MariaDB Galera 集群所需的软件包的更多信息,请参阅 构建 MariaDB 集群的组件。
-
在系统第一次添加到集群前,更新 MariaDB 服务器复制配置。默认配置在
/etc/my.cnf.d/galera.cnf
文件中。在部署 MariaDB Galera 集群之前,请将所有节点上的/etc/my.cnf.d/galera.cnf
文件中设置以以下字符串开头的wsrep_cluster_address
选项:gcomm://
gcomm://
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于初始节点,可以将
wsrep_cluster_address
设置为空列表:wsrep_cluster_address="gcomm://"
wsrep_cluster_address="gcomm://"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于所有其他节点,将
wsrep_cluster_address
设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:wsrep_cluster_address="gcomm://10.0.0.10"
wsrep_cluster_address="gcomm://10.0.0.10"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址。
-
通过在
/etc/my.cnf.d/galera.cnf
配置文件中设置wsrep_on=1
选项来在每个节点上启用wsrep
API。 将
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”
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 Copied! Toggle word wrap Toggle overflow 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:
galera_new_cluster
# galera_new_cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此打包程序确保 MariaDB 服务器守护进程(
mariadbd
)使用--wsrep-new-cluster
选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。注意mariadb
服务支持 systemd 方法,来与多个 MariaDB 服务器进程进行交互。因此,在有多个运行的 MariaDB 服务器的情况下,您可以通过将实例名称指定为后缀来 bootstrap 特定的实例:galera_new_cluster mariadb@node1
# galera_new_cluster mariadb@node1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个节点上运行以下命令将其他节点连接到集群:
systemctl start mariadb
# systemctl start mariadb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,节点连接到集群,并将自己与集群的状态同步。
验证
1.8.4. 检查 MariaDB Galera 集群的状态 复制链接链接已复制到粘贴板!
监控和确保 MariaDB Galera 集群的健康、性能和同步非常重要。为此,您可以在每个节点上查询状态变量,来监控节点和集群。
要检查 MariaDB Galera 集群的状态,您可以使用以下查询:
显示集群中节点的数量:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示节点的集群组件状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow wsrep_cluster_status
变量的值表示当前节点所属的集群组件的状态。可能的值有:-
Primary
:集群正常运行。存在仲裁。在健康的集群中,所有节点都报告Primary
。 -
Non-primary
:节点丢失了到集群的主组件的连接,且不再是活跃集群的一部分。但是,节点仍然可以提供读查询,但不能处理写操作。 -
disconnected
:节点没有连接到任何集群组件。因此,它无法接受查询,也不会复制任何数据。
-
显示节点的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下是
wsrep_local_state_comment
变量常用的值:-
Synced
:节点在集群内完全同步,并积极参与复制。 -
Desynced
:节点仍然是集群的一部分,但主要忙于状态传输。 -
Joining
:节点正在加入集群。 -
Joined
:节点已成功加入集群。它可以从集群接收和应用写集合。 -
Donor
: 节点当前向正在加入的节点提供状态快照传输(SST)。当新节点加入并需要全状态转移时,集群会选择一个现有节点来发送必要的数据。
-
检查节点是否接受来自集群的写集合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当
wsrep_ready
变量为ON
时,节点已成功初始化其组件,并连接到集群。另外,节点也会同步,或达到一个可以提供查询的状态。检查节点是否与其他主机有网络连接:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ON
值表示节点与集群中的至少一个成员有连接性。显示自上次
FLUSH STATUS
命令或自服务器启动以来写集合的本地接收的队列的平均大小:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接近 0 的值是理想的状态,表示节点在收到写集时继续应用它们。持久高或增长的值可能是性能瓶颈的一种指示,如磁盘 I/O 慢。
显示流控制状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个变量代表节点已暂停,且无法处理新传入的事务的时间分数,因为其本地接收队列太满、触发了流控制。接近 0 的值表示节点继续高效地复制工作负载。接近 1.0 的值意味着节点在应用写集合时频繁或持续遇到困难,并可能成为集群的瓶颈。
如果节点频繁暂停,您可以调整
/etc/my.cnf.d/galera.cnf
文件中的wsrep_slave_threads
参数。显示节点可并行应用的最低和最高序列号之间的平均距离:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 数值越高,表示并行的程度越大。它是您可以在
/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"
[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。
但是,最好在
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 实例。
流程
安装 MySQL 服务器软件包:
dnf install mysql8.4-server
# dnf install mysql8.4-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
mysqld
服务:systemctl enable --now mysqld.service
# systemctl enable --now mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装后提高安全性:
mysql_secure_installation
$ mysql_secure_installation
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:
- 为 root 帐户设置密码
- 删除匿名用户
- 禁止远程 root 登录(在本地主机之外)
2.2. 使用容器在单个主机上运行多个 MariaDB 和 MySQL 实例 复制链接链接已复制到粘贴板!
如果从软件包安装 MariaDB 或 MySQL,您只能在同一主机上运行这些服务中的一个,且该服务的一个版本。作为一种替代方案,您可以在容器中运行服务来配置以下场景:
- 您希望在同一主机上运行多个 MariaDB 或 MySQL 实例。
- 您想要在同一主机上运行 MariaDB 和 MySQL。
先决条件
-
podman
软件包已安装。
流程
使用您的红帽客户门户网站帐户认证到
registry.redhat.io
注册中心:podman login registry.redhat.io
# podman login registry.redhat.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
启动您要使用的容器:
MariaDB 10.11 :
podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
$ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
MySQL 8.4:
podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
$ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
重要容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
连接到数据库服务器,并以 root 用户身份登录:
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示正在运行的容器的信息:
podman ps
$ podman ps
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. 配置对 MySQL 的网络访问 复制链接链接已复制到粘贴板!
如果您网络中的客户端需要远程访问 MySQL 服务器,您必须将 MySQL 服务配置为侦听相应的接口。
流程
编辑
/etc/my.cnf.d/mysql-server.cnf
文件的mysqld
部分。您可以设置以下配置指令:bind-address
- 是服务器监听的地址。可能的选项有:- 主机名
- IPv4 地址
- IPv6 地址
skip-networking
- 控制服务器是否监听 TCP/IP 连接。可能的值有:- 0 - 侦听所有客户端
- 1 - 仅侦听本地客户端
-
port
- MySQL 侦听 TCP/IP 连接的端口。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中开放端口:
firewall-cmd --permanent --add-service=mysql firewall-cmd --reload
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
mysqld
服务:systemctl restart mysqld.service
# systemctl restart mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. 在 MySQL 服务器上设置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密的连接。
2.4.1. 将 CA 证书、服务器证书和私钥放在 MySQL 服务器上 复制链接链接已复制到粘贴板!
在 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 文档。
-
服务器的私钥:
流程
将 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/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对 CA 和服务器证书设置权限,使 MySQL 服务器能够读取文件:
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/
目录中:mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对服务器的私钥设置安全权限:
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# 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 Copied! Toggle word wrap Toggle overflow 如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再安全。
恢复 SELinux 上下文:
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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)字段与服务器的主机名相匹配。
流程
创建
/etc/my.cnf.d/mysql-server-tls.cnf
文件:添加以下内容来配置到私钥、服务器和 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
[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 Copied! Toggle word wrap Toggle overflow 如果您有一个证书撤销列表(CRL),请将 MySQL 服务器配置为使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on
require_secure_transport = on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:设置服务器应支持的 TLS 版本。例如,要只支持 TLS 1.3,请附加:
tls_version = TLSv1.3
tls_version = TLSv1.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,服务器支持 TLS 1.2 和 TLS 1.3。
重启
mysqld
服务:systemctl restart mysqld
# systemctl restart mysqld
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MySQL 服务器上执行以下步骤:
验证 MySQL 现在是否启用了 TLS 加密:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示
tls_version
变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.3. MySQL 服务器上的特定用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on
),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MySQL 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
- CA 证书存储在客户端上。
流程
以管理员用户身份连接到 MySQL 服务器:
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令,并连接到
localhost
。使用
REQUIRE SSL
子句强制用户必须使用 TLS 加密连接进行连接:MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 TLS 加密,以
example
用户身份连接到服务器:mysql -u example -p -h server.example.com
# mysql -u example -p -h server.example.com ... MySQL [(none)]>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有显示错误,并且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。
默认情况下,如果服务器提供了,客户端会自动使用 TLS 加密。因此,
--ssl-ca=ca.crt.pem
和--ssl-mode=VERIFY_IDENTITY
选项不是必需的,但可以提高安全性,使用这些选项,客户端可以验证服务器的身份。尝试以禁用 TLS 的
example
用户身份进行连接:mysql -u example -p -h server.example.com --ssl-mode=DISABLED
# 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 Copied! Toggle word wrap Toggle overflow 服务器拒绝登录尝试,因为此用户需要 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
[client] ssl-mode=VERIFY_IDENTITY ssl-ca=/etc/pki/tls/certs/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置定义 MySQL 客户端使用 TLS 加密,并且客户端将主机名与服务器证书中的 CN (
ssl-mode=VERIFY_IDENTITY
)进行比较。另外,它还指定到 CA 证书的路径(ssl-ca
)。
验证
使用主机名连接到服务器,并显示服务器的状态:
mysql -u root -p -h server.example.com -e status
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
SSL
条目包含Cipher in use is…
,则连接加密了。请注意,您在这个命令中使用的用户具有远程身份验证的权限。
如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则
ssl-mode=VERIFY_IDENTITY
参数导致连接失败。例如,如果您连接到localhost
:mysql -u root -p -h localhost -e status
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# mysqldump [options] --databases db_name > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要一次转储多个数据库,请运行:
mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
# mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储所有数据库,请运行:
mysqldump [options] --all-databases > backup-file.sql
# mysqldump [options] --all-databases > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将一个或多个转储的完整数据库加载回服务器,请运行:
mysql < backup-file.sql
# mysql < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将数据库加载到远程 MySQL 服务器,请运行:
mysql --host=remote_host < backup-file.sql
# mysql --host=remote_host < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要转储一个数据库中的表的子集,请在
mysqldump
命令的末尾添加所选表的列表:mysqldump [options] db_name [tbl_name ...] > backup-file.sql
# mysqldump [options] db_name [tbl_name ...] > backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要载入从一个数据库转储的表的子集,请运行:
mysql db_name < backup-file.sql
# mysql db_name < backup-file.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此时,db_name 数据库必须存在。
要查看
mysqldump
支持的选项的列表,请运行:mysqldump --help
$ mysqldump --help
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6.2. 在 MySQL 服务器上执行文件系统备份 复制链接链接已复制到粘贴板!
要创建 MySQL 数据文件的文件系统备份,请将 MySQL 数据目录的内容复制到您的备份位置。
要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:
流程
停止
mysqld
服务:systemctl stop mysqld.service
# systemctl stop mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将数据文件复制到所需位置:
cp -r /var/lib/mysql/ /backup-location/data/
# cp -r /var/lib/mysql/ /backup-location/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将配置文件复制到所需位置:
cp -r /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
# cp -r /etc/my.cnf /etc/my.cnf.d/ /backup-location/configuration/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将日志文件复制到所需位置:
cp /var/log/mysql/* /backup-location/logs/
# cp /var/log/mysql/* /backup-location/logs/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mysqld
服务:systemctl start mysqld.service
# systemctl start mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在将备份位置的备份数据加载到
/var/lib/mysql/
目录时,请确保mysql:mysql
是/var/lib/mysql/
中所有数据的所有者:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7. 在 RHEL 10 上将 MySQL 实例从以前的 RHEL 版本迁移到 MySQL 8.4 复制链接链接已复制到粘贴板!
RHEL 10 提供 MySQL 8.4.如果在以前的 RHEL 版本上运行 MySQL 实例,您可以在新主机上设置 RHEL 10,并将实例迁移到其上。
先决条件
- 您可以在新主机上设置 RHEL 10。
- 您在 RHEL 8 或 RHEL 9 主机上执行 MySQL 实例的文件系统备份。
流程
安装
mysql8.4-server
软件包:dnf install mysql8.4-server
# dnf install mysql8.4-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务已在运行,停止该服务:
systemctl stop mysqld.service
# systemctl stop mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将之前主机上
/var/lib/mysql/
目录的内容复制到 RHEL 10 主机上的相同位置。 -
将之前主机中的配置文件复制到
/etc/my.cnf.d/
目录中,并确保文件只包含对 MySQL 8.4 有效的选项。详情请查看 上游文档。 恢复 SELinux 上下文:
restorecon -rv /var/lib/mysql/ restorecon -rv /etc/my.cnf.d/
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
/var/lib/mysql/
及其子目录的正确所有权:chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
mysqld
服务:systemctl enable --now mysqld.service
# systemctl enable --now mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当服务启动时,MySQL 会自动检查、修复和更新内部表。
验证
建立到 MySQL 服务器的连接:
mysql -u root -p -h <hostname>
# mysql -u root -p -h <hostname>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8. 复制具有 TLS 加密的 MySQL 复制链接链接已复制到粘贴板!
MySQL 为复制提供了各种配置选项,范围从基本到高级。这部分论述了使用全局事务标识符(GTID)在新安装的 MySQL 服务器上的 MySQL 中进行复制的基于事务的方法。使用 GTID 简化了事务识别和一致性验证。
如果要使用现有的 MySQL 服务器进行复制,您必须首先同步数据。如需更多信息,请参阅 上游文档。
2.8.1. 配置 MySQL 源服务器 复制链接链接已复制到粘贴板!
您可以设置 MySQL 源服务器所需的配置选项,以便通过 TLS 协议正确地运行并复制数据库服务器上所做的所有更改。
先决条件
- 源服务器已安装。
源服务器有 TLS 设置。
重要源和目标证书必须由同一证书颁发机构签名。
流程
包括
/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
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:
binlog_ignore_db=db_name
使用此选项从复制中排除特定的数据库。
重启
mysqld
服务:systemctl restart mysqld.service
# systemctl restart mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.2. 配置 MySQL 副本服务器 复制链接链接已复制到粘贴板!
您可以设置 MySQL 副本服务器所需的配置选项,以确保成功复制。
先决条件
- 副本服务器已安装。
副本服务器有 TLS 设置。
重要源和目标证书必须由同一证书颁发机构签名。
流程
包括
/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
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:
binlog_ignore_db=db_name
使用此选项从复制中排除特定的数据库。
重启
mysqld
服务:systemctl restart mysqld.service
# systemctl restart mysqld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.3. 在 MySQL 源服务器上创建复制用户 复制链接链接已复制到粘贴板!
您必须创建一个复制用户,并授予这个用户所需的复制流量的权限。此流程演示了如何创建具有适当权限的复制用户。仅在源服务器上执行这些步骤。
先决条件
- 源服务器已安装并配置,如 配置 MySQL 源服务器 中所述。
流程
创建复制用户:
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授予用户复制权限:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新在 MySQL 数据库中载入授权表:
mysql> FLUSH PRIVILEGES;
mysql> FLUSH PRIVILEGES;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将源服务器设置为只读状态:
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.4. 将 MySQL 副本服务器连接到源服务器 复制链接链接已复制到粘贴板!
在 MySQL 副本服务器上,您必须配置凭证和源服务器的地址。使用以下流程实现副本服务器。
先决条件
- 源服务器已安装并配置,如 配置 MySQL 源服务器 中所述。
- 副本服务器已安装并配置,如 配置 MySQL 副本服务器 中所述。
- 您已创建了复制用户。请参阅 在 MySQL 源服务器上创建复制用户。
流程
将副本服务器设置为只读状态:
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置复制源:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 MySQL 副本服务器中启动副本线程:
mysql> START REPLICA;
mysql> START REPLICA;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在源和目标服务器上取消只读状态的设置:
mysql> SET @@GLOBAL.read_only = OFF;
mysql> SET @@GLOBAL.read_only = OFF;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:检查副本服务器的状态以进行调试:
mysql> SHOW REPLICA STATUS\G;
mysql> SHOW REPLICA STATUS\G;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果复制服务器启动或连接失败,您可以跳过
SHOW MASTER STATUS
命令的输出中显示的二进制日志文件位置后的某些事件。例如,从定义的位置跳过第一个事件:mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 之后,尝试再次启动副本服务器。
可选:停止副本服务器中的副本线程:
mysql> STOP REPLICA;
mysql> STOP REPLICA;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.5. 验证 MySQL 服务器上的复制 复制链接链接已复制到粘贴板!
在多个 MySQL 服务器中配置复制后,您应该验证它是否正常工作。
流程
在源服务器上创建一个示例数据库:
mysql> CREATE DATABASE test_db_name;
mysql> CREATE DATABASE test_db_name;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
验证
test_db_name
数据库是否在副本服务器上进行复制。 在源或副本服务器上执行以下命令,显示 MySQL 服务器的二进制日志文件的状态信息:
mysql> SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 实例。
流程
安装 PostgreSQL 服务器软件包:
dnf install postgresql-server
# dnf install postgresql-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgres
超级用户会自动创建。初始化数据库集群:
postgresql-setup --initdb
# postgresql-setup --initdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将数据存储在默认的
/var/lib/pgsql/data
目录中。启用并启动
postgresql
服务:systemctl enable --now postgresql.service
# systemctl enable --now postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. 使用容器在单个主机上运行多个 PostgreSQL 实例 复制链接链接已复制到粘贴板!
如果您从软件包安装 PostgreSQL,则只能在同一主机上运行它的一个版本。TU 运行 PostgreSQL 的多个实例或不同的版本,您可以在容器中运行服务。
先决条件
-
podman
软件包已安装。
流程
使用您的红帽客户门户网站帐户认证到
registry.redhat.io
注册中心:podman login registry.redhat.io
# podman login registry.redhat.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已登录到容器注册中心,请跳过这一步。
启动您要使用的容器。对于每个容器,请输入:
podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_1>:5432 rhel10/postgresql-16
$ 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 Copied! Toggle word wrap Toggle overflow 有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
重要容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
连接到数据库服务器,并以 root 用户身份登录:
psql -u postgres -p -h localhost -P <host_port> --protocol tcp
# psql -u postgres -p -h localhost -P <host_port> --protocol tcp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示正在运行的容器的信息:
podman ps
$ podman ps
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 命令将对象特权分配给其他角色。
标准数据库管理特权包括 SELECT
、INSERT
、UPDATE
、DELETE
、TRUNCATE
、REFERENCES
、TRIGGER
、CREATE
、CONNECT
、TEMPORARY
、EXECUTE
和 USAGE
。
角色属性是特殊的特权,如 LOGIN
、SUPERUSER
、CREATEDB
和 CREATEROLE
。
以不是超级用户的角色执行大部分任务。常见的做法是创建一个具有 CREATEDB
和 CREATEROLE
特权的角色,并将此角色用于所有数据库和角色的日常管理。
先决条件
- PostgreSQL 服务器已安装。
- 数据库集群已初始化。
-
/var/lib/pgsql/data/postgresql.conf
文件中的password_encryption
参数已设为scram-sha-256
。 -
/var/lib/pgsql/data/pg_hba.conf
文件中的条目使用scram-sha-256
哈希算法作为身份验证方法。
流程
以
postgres
系统用户身份登录,或切换到这个用户:su - postgres
# su - postgres
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动 PostgreSQL 交互式终端:
psql
$ psql psql (16.4) Type "help" for help. postgres=#
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:获取有关当前数据库连接的信息:
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个名为
mydbuser
的用户,为其设置密码,并向用户分配CREATEROLE
和CREATEDB
权限:postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB; CREATE ROLE
postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB; CREATE ROLE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuser
用户现在可以执行日常数据库管理操作:创建数据库并管理用户索引。使用
\q
meta 命令从交互终端退出:postgres=# \q
postgres=# \q
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
以
mydbuser
用户身份登录到 PostgreSQL 终端,指定主机名,并连接到默认的postgres
数据库,该数据库是在初始化过程中创建的:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建数据库:
postgres=> CREATE DATABASE <db_name>;
postgres=> CREATE DATABASE <db_name>;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 退出会话:
postgres=# \q
postgres=# \q
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
mydbuser
用户身份连接到新数据库:psql -U mydbuser -h 127.0.0.1 -d <db_name>
# 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 Copied! Toggle word wrap Toggle overflow
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 数据库配置客户端身份验证。
流程
编辑
/var/lib/pgsql/data/postgresql.conf
文件,并配置数据库集群参数的基本设置,例如:log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256
log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/var/lib/pgsql/data/pg_hba.conf
文件,并配置客户端身份验证,例如:TYPE DATABASE USER ADDRESS METHOD
# 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 Copied! Toggle word wrap Toggle overflow 重启
postgresql
服务,以使修改生效:systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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"。
流程
将私钥和服务器证书存储在
/var/lib/pgsql/data/
目录中:cp server.{key,crt} /var/lib/pgsql/data/
# cp server.{key,crt} /var/lib/pgsql/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置私钥和证书的所有权:
chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对只允许 PostgreSQL 服务器读取文件的服务器证书设置权限:
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对服务器证书文件设置严格的权限。
编辑
/var/lib/pgsql/data/postgresql.conf
文件并进行以下更改:设置
scram-sha-256
哈希算法:password_encryption = scram-sha-256
password_encryption = scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 TLS 加密:
ssl = on
ssl = on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
编辑
/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
hostssl all all 192.0.2.0/24 scram-sha-256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
postgresql
服务:systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
postgres
超级用户连接到 PostgreSQL 服务器,并执行\conninfo
元命令:psql "postgresql://postgres@localhost:5432" -c '\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 Copied! Toggle word wrap Toggle overflow
3.6. 使用 SQL 转储备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
SQL 转储方法基于使用 SQL 命令生成转储文件。当转储上传回数据库服务器时,它会按与转储时相同的状态重新创建数据库。
以下 PostgreSQL 客户端应用程序为 SQL 转储提供了保证:
-
pg_dump
转储单个数据库,而没有集群范围的有关角色或表空间的信息 -
pg_dumpall
转储给定集群中的每个数据库,并保留集群范围的数据,如角色和表空间定义。
默认情况下,pg_dump
和 pg_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>
$ pg_dump <db_name> > <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定
pg_dump
将联系哪个数据库服务器,请使用以下命令行选项:-h
选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST
环境变量所指定的主机。-p
选项用来定义端口 。默认端口是由
PGPORT
环境变量或编译后的默认值指明的。
3.6.3. 使用 pg_dumpall 执行 SQL 转储 复制链接链接已复制到粘贴板!
要转储给定数据库集群中的每个数据库,并保留集群范围的数据,请使用 pg_dumpall
工具。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
转储数据库集群中的所有数据库,并保留集群范围的数据:
pg_dumpall > <dump_file>
$ pg_dumpall > <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定 pg_dumpall 将联系哪个数据库服务器,请使用以下命令行选项:
-h
选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST
环境变量所指定的主机。-p
选项用来定义端口 。默认端口是由
PGPORT
环境变量或编译后的默认值指明的。-l
选项用来定义默认数据库。这个选项使您能够选择一个与初始化过程中自动创建的
postgres
数据库不同的默认数据库。
3.6.4. 使用 pg_dump 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dump
工具转储的 SQL 转储中恢复数据库,请按照以下步骤操作。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
创建新数据库:
createdb <db_name>
$ createdb <db_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证在转储数据库中拥有对象或被赋予了对象权限的所有用户是否已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行
psql
工具来恢复pg_dump
工具创建的文本文件转储:psql <db_name> < <dump_file>
$ psql <db_name> < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<dump_file>
是pg_dump
命令的输出。要恢复非文本文件转储,请使用pg_restore
工具:pg_restore <non-plain_text_file>
$ pg_restore <non-plain_text_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.5. 使用 pg_dumpall 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dumpall
工具转储的数据库集群中恢复数据,请按照以下步骤操作。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
- 确保在转储数据库中拥有对象或已被赋予了对象权限的所有用户已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行
psql
工具来恢复pg_dumpall
工具创建的文本文件转储:psql < <dump_file>
$ psql < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<dump_file>
是pg_dumpall
命令的输出。
3.6.6. 在另一服务器上执行数据库的 SQL 转储 复制链接链接已复制到粘贴板!
可以直接从一台服务器转储到另一台服务器,因为 pg_dump
和 psql
可以写入管道并从管道读取。
流程
要从一个服务器到另一个服务器转储数据库,请运行:
pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
$ pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.7. 在恢复过程中处理 SQL 错误 复制链接链接已复制到粘贴板!
默认情况下,如果出现 SQL 错误,psql
会继续执行,从而导致数据库只部分恢复。
要修改默认行为,在恢复转储时使用以下任一方法:
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
设置
ON_ERROR_STOP
变量,使psql
在发生 SQL 错误时退出,且退出状态为 3:psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
$ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。
当使用
psql
工具恢复文本文件转储时:psql -1
$ psql -1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当使用
pg_restore
工具恢复非文本文件转储时:pg_restore -e
$ pg_restore -e
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
请注意,当您使用此方法时,即使是小的错误也可能会取消已运行了数小时的恢复操作。
3.7. 使用文件系统级别备份来备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
要创建文件系统级备份,请将 PostgreSQL 数据库文件复制到另一个位置。例如,您可以使用以下任一方法:
- 使用 tar 工具创建存档文件。
- 使用 rsync 工具将文件复制到其他位置。
- 创建数据目录的一致快照。
3.7.1. 文件系统备份的优点和限制 复制链接链接已复制到粘贴板!
与其他 PostgreSQL 备份方法相比,文件系统级备份有以下优点:
- 文件系统级备份通常比 SQL 转储快。
与其它 PostgreSQL 备份方法相比,文件系统级备份有以下限制:
- 当您要从 RHEL 9 升级到 RHEL 10 ,并将您的数据迁移到升级的系统时,这个备份方法不适用。文件系统级别备份特定于架构和 RHEL 主版本。如果升级不成功,但您无法在 RHEL 10 系统上恢复数据,则您可以在 RHEL 9 系统上恢复数据。
- 在备份和恢复数据前,数据库服务器必须关闭。
- 无法备份和恢复某些单独的文件或表。备份文件系统只适用于整个数据库集群的完整备份和恢复。
3.7.2. 执行文件系统级备份 复制链接链接已复制到粘贴板!
要执行文件系统级备份,请使用以下流程。
流程
停止
postgresql
服务:systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用任意方法创建文件系统备份,如
tar
归档:tar -cf backup.tar /var/lib/pgsql/data/
$ tar -cf backup.tar /var/lib/pgsql/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
postgresql
服务:systemctl start postgresql.service
# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.8. 通过持续存档来备份 PostgreSQL 数据 复制链接链接已复制到粘贴板!
PostgreSQL 将对数据库的数据文件所做的每个更改都记录到预写日志(WAL)文件中,该文件位于集群数据目录的 pg_wal/
子目录中。此日志主要用于崩溃恢复。崩溃后,可用上次检查点以后所记录的日志条目将数据库恢复到一致。
持续归档方法也称为在线备份,以在运行的服务器上执行的基础备份或文件系统级备份的形式,将 WAL 文件与数据库集群的副本结合起来。
如果需要进行数据库恢复,您可以从数据库集群的副本恢复数据库,然后从备份的 WAL 文件中重新执行日志,使系统恢复到当前状态。
使用持续归档方法时,您必须保持所有归档的 WAL 文件的连续顺序,这些文件至少可扩展到上一次基础备份的开始时间。因此,基本备份的理想频率取决于:
- 归档 WAL 文件的存储卷。
- 需要恢复时数据恢复的最可能持续时间。自上次备份以来的很长一段时间,系统重新运行了更多 WAL 段,因此恢复需要更长的时间。
您不能使用 pg_dump
和 pg_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 归档,请使用以下流程:
流程
在
/var/lib/pgsql/data/postgresql.conf
文件中:-
将
wal_level
配置参数设置为replica
或更高的值。 -
将
archive_mode
参数设置为on
。 在
archive_command
配置参数中指定 shell 命令。您可以使用cp
命令、其它命令或 shell 脚本。例如:
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
%p
参数替换为归档文件的相对路径,%f
参数替换为文件名。此命令将可归档的 WAL 段复制到
/mnt/server/archivedir/
目录中。替换%p
和%f
参数后,执行的命令如下所示:test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对每个归档的新文件都会生成类似的命令。
注意归档命令只对已完成的 WAL 段执行。生成小 WAL 流量的服务器在交易完成和其归档存储中的安全记录之间可能会有很长时间的延迟。要限制未归档数据可保留多久,您可以:
-
设置
archive_timeout
参数,来强制服务器以给定频率切换到新的 WAL 段文件。 -
使用
pg_switch_wal
参数强制段切换,以确保交易在完成后立即归档。
-
设置
-
将
重启
postgresql
服务以使修改生效:systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 测试您的归档命令,并确保它不会覆盖现有的文件,如果失败,它将返回一个非零退出状态。
- 要保护您的数据,请确保将段文件归档到不具有组或全局读权限的目录中。
3.8.3. 进行基础备份 复制链接链接已复制到粘贴板!
您可以通过多种方法创建基础备份:执行基础备份的最简单方法是对运行的 PostgreSQL 服务器使用 pg_basebackup
工具。
基础备份进程会创建一个备份历史记录文件,该文件存储在 WAL 归档区,并以基础备份所需的第一个 WAL 段文件来命名。
备份历史记录文件是一个小文本文件,其包含开始和结束时间,以及备份的 WAL 段。如果您使用标签字符串来标识关联的转储文件,那么您可以使用备份历史记录文件来确定要恢复哪个转储文件。
请考虑保留多个备份集,以确保您可以恢复数据。
先决条件
-
您必须以
postgres
超级用户身份、具有数据库管理员特权的用户身份或至少具有REPLICATION
权限的其他用户身份来运行命令。 - 您必须保留在基础备份期间和之后生成的所有 WAL 段文件。
流程
使用
pg_basebackup
工具执行基础备份。将基础备份创建为单个的文件(纯格式):
pg_basebackup -D <backup_directory> -Fp
$ pg_basebackup -D <backup_directory> -Fp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您选择的备份位置替换 backup_directory。
如果您在与服务器相同的主机上使用表空间并执行基础备份,那么也必须使用
--tablespace-mapping
选项,否则当试图将备份写入到同一位置时,备份将失败。将基础备份创建为一个
tar
归档(tar
和压缩格式):pg_basebackup -D <backup_directory> -Ft -z
$ pg_basebackup -D <backup_directory> -Ft -z
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您选择的备份位置替换 backup_directory。
要恢复此数据,您必须手动提取正确位置中的文件。
要指定serverpg_basebackup将与哪个数据库联系,请使用以下命令行选项:
-h
选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST
环境变量所指定的主机。-p
选项用来定义端口。默认端口是由
PGPORT
环境变量或编译后的默认值指明的。
- 基础备份进程完成后,将备份历史记录文件中指定的数据库集群副本和备份过程中使用的 WAL 段文件进行安全归档。
- 删除比基础备份中使用的 WAL 段文件数值更低的WAL段,因为这些比基础备份旧,并且不再需要进行恢复。
3.8.4. 使用持续归档备份恢复数据库 复制链接链接已复制到粘贴板!
要使用持续备份恢复数据库,请使用以下流程:
流程
停止服务器:
systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将必要的数据复制到临时位置。
最好复制整个集群数据目录和任何表空间。请注意,这需要系统上有足够的可用空间来保存现有数据库的两个副本。
如果您没有足够的空间,就保存集群的
pg_wal
目录的内容,其中可能包含系统关闭前没有归档的日志。- 删除集群数据目录下的所有现有文件和子目录,并在您要使用的任何表空间的根目录下删除。
从您的基础备份恢复数据库文件。
确保:
-
恢复的文件具有正确的所有权(数据库系统用户,而不是
root
)。 - 恢复的文件具有正确的权限。
-
pg_tblspc/
子目录中的符号链接被正确恢复。
-
恢复的文件具有正确的所有权(数据库系统用户,而不是
删除
pg_wal/
子目录中的任何文件。这些文件源自基础备份,因此已过时。如果您没有归档
pg_wal/
,请重新创建它,并使其具有正确的权限。-
将你在步骤 2 中保存的任何未归档的 WAL 段文件复制到
pg_wal/
中。 在集群数据目录中创建
restore.conf
恢复命令文件,并在restore_command
配置参数中指定 shell 命令。您可以使用cp
命令、其它命令或 shell 脚本。例如:restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'cp /mnt/server/archivedir/%f "%p"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动服务器:
systemctl start postgresql.service
# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器将进入恢复模式,并继续读取所需的存档 WAL 文件。
如果恢复因为外部错误而终止,那么可以重启服务器,它将继续进行恢复。恢复过程完成后,服务器将
restore.conf
重命名为restore.done
。这可以防止服务器在启动正常的数据库操作后意外重新进入恢复模式。检查数据库的内容,以验证数据库是否已恢复到所需的状态。
如果数据库尚未恢复到所需状态,请返回到第 1 步。如果数据库已恢复到所需的状态,那么通过恢复
pg_hba.conf
文件中的客户端身份验证配置来允许用户进行连接。
如果您已在 RHEL 9 上运行了低于 16 的 PostgreSQL 版本,并希望将数据库软件移到运行 RHEL 10 的主机上,您可以迁移数据库。
可用的迁移方法是:
- 备份和恢复升级 - 这个方法可能需要更多的时间,但在大多数情况下可以正常工作。
-
使用
pg_upgrade
工具的快速升级 - 这个方法更快,但只有在从 PostgreSQL 13 迁移到 16 ,且硬件架构保持不变的情况下才可以正常工作。
在 PostgreSQL 迁移前,始终备份源主机上的 /var/lib/pgsql/data/
目录。
3.9.1. 使用备份和恢复方法迁移到 RHEL 10 上的 PostgreSQL 复制链接链接已复制到粘贴板!
您可以使用备份和恢复方法将数据从 PostgreSQL 的任何 RHEL 8 或 RHEL 9 版本迁移到 RHEL 10 上 PostgreSQL 的任何相等或更新版本。
先决条件
- 现有数据库服务器在 RHEL 8 或 RHEL 9 上运行,并使用从 RHEL 存储库安装的 PostgreSQL 版本。
-
两个主机上的区域设置是相同的。要验证这一点,请比较两个主机上的
echo $LANG
命令的输出。
流程
在具有您要迁移的现有 PostgreSQL 实例的主机上:
将所有数据库导出到
/var/lib/pgsql/pgdump_file.sql
文件中:su - postgres -c "pg_dumpall > /var/lib/pgsql/pgdump_file.sql"
# su - postgres -c "pg_dumpall > /var/lib/pgsql/pgdump_file.sql"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查导出的文件:
su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'
# su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将您在之前步骤中创建的数据库转储和 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/
# 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 Copied! Toggle word wrap Toggle overflow
在 RHEL 10 主机上:
安装
postgresql-server
软件包:dnf install postgresql-server
# dnf install postgresql-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化
/var/lib/pgsql/data/
目录:postgresql-setup --initdb
# postgresql-setup --initdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将复制的配置文件移到
/var/lib/pgsql/data/
目录中:mv /tmp/pg_hba.conf \ /tmp/pg_ident.conf \ /tmp/postgresql.conf \ /var/lib/pgsql/data/
# mv /tmp/pg_hba.conf \ /tmp/pg_ident.conf \ /tmp/postgresql.conf \ /var/lib/pgsql/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
/var/lib/pgsql/data/ directory
目录中内容的所有权正确:chown -R postgres:postgres /var/lib/pgsql/data/
# chown -R postgres:postgres /var/lib/pgsql/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对
/var/lib/pgsql/data/
恢复 SELinux 上下文:restorecon -Rv /var/lib/pgsql/data/
# restorecon -Rv /var/lib/pgsql/data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
postgresql
服务:systemctl enable --now postgresql.service
# systemctl enable --now postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
postgres
用户身份导入数据:su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'
# su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证您的数据库,并确保您的使用 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
命令的输出。
流程
在具有您要迁移的现有 PostgreSQL 实例的主机上:
停止
postgresql
服务:systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进到
/var/lib/pgsql/
目录,并备份data
子目录:cd /var/lib/pgsql/ tar -zcf ~/pgdata.bak.tar.gz data/
# cd /var/lib/pgsql/ # tar -zcf ~/pgdata.bak.tar.gz data/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
~/pgdata.bak.tar.gz
存档复制到 RHEL 10 主机,例如:scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/
# scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 RHEL 10 主机上:
安装所需的软件包:
dnf install postgresql-server postgresql-upgrade
# dnf install postgresql-server postgresql-upgrade
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql-upgrade
软件包提供在一个迁移过程中所需的 PostgreSQL 13 服务器。-
如果您使用第三方 PostgreSQL 服务器模块,请针对
postgresql-devel
和postgresql-upgrade-devel
软件包构建它们,并安装它们。 确保
postgresql
服务已停止:systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进入
/var/lib/pgsql/
目录,并从之前主机中提取备份的数据目录:cd /var/lib/pgsql/ tar -zxf /tmp/pgdata.bak.tar.gz
# cd /var/lib/pgsql/ # tar -zxf /tmp/pgdata.bak.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:删除
/tmp/pgdata.bak.tar.gz
归档:rm /tmp/pgdata.bak.tar.gz
# rm /tmp/pgdata.bak.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 执行升级过程:
postgresql-setup --upgrade
# postgresql-setup --upgrade
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 版本兼容。启用并启动
postgresql
服务:systemctl enable --now postgresql.service
# systemctl enable --now postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 清理和分析所有数据库:
su postgres -c 'vacuumdb --all --analyze-in-stages'
# su postgres -c 'vacuumdb --all --analyze-in-stages'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证您的数据库,并确保您的使用 PostgreSQL 服务器的应用程序可以正常工作。
可选:删除
/var/lib/pgsql/data-old/
目录,该目录包含迁移之前的数据库和配置文件。rm -r /var/lib/pgsql/data-old/
# rm -r /var/lib/pgsql/data-old/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:删除
postgresql-upgrade
软件包:dnf remove postgresql-upgrade
# dnf remove postgresql-upgrade
Copy to Clipboard Copied! Toggle word wrap Toggle overflow