7.2. 使用 MariaDB
MariaDB 服务器是一个基于 MySQL 技术的开源、快速、强大的数据库服务器。MariaDB 是一个关系型数据库,它将数据转换为结构化信息,并为访问数据提供 SQL 接口。它包含多个存储引擎和插件,以及地理信息系统(GIS)和 JavaScript 对象表示法(JSON)功能。
了解如何在 RHEL 系统上安装和配置 MariaDB,如何备份 MariaDB 数据、如何从早期的 MariaDB 版本迁移,以及如何使用 MariaDB Galera 集群 复制数据库。
7.2.1. 安装 MariaDB 复制链接链接已复制到粘贴板!
在 RHEL 8 中,以下版本都提供了 MariaDB 服务器,每个版本都由单独的流提供:
- MariaDB 10.3
- MariaDB 10.5 - 从 RHEL 8.4 开始提供
- MariaDB 10.11 - 从 RHEL 8.10 开始提供
按照设计,无法并行安装同一模块的多个版本(stream)。因此,您必须从 mariadb 模块中只选择一个可用的流。您可以在容器中使用不同版本的 MariaDB 数据库服务器,请参阅 在容器中运行多个 MariaDB 版本。
由于 RPM 软件包有冲突,MariaDB 和 MySQL 数据库服务器无法在 RHEL 8 中并行安装。您可以在容器中并行使用 MariaDB 和 MySQL 数据库服务器,请参阅 在容器中运行多个 MySQL 和 MariaDB 版本。
要安装 MariaDB,请使用以下流程:
流程
通过从
mariadb模块选择流(版本),并指定server配置文件来安装 MariaDB 服务器软件包。例如:# yum module install mariadb:10.3/server启动
mariadb服务:# systemctl start mariadb.service启用
mariadb服务,使其在引导时启动:# systemctl enable mariadb.service推荐用于 MariaDB 10.3: 要在安装 MariaDB 时提高安全性,请运行以下命令:
$ mysql_secure_installation此命令启动一个完全交互的脚本,该脚本会提示过程中的每一步。该脚本可让您通过以下方法提高安全性:
- 为 root 帐户设置密码
- 删除匿名用户
禁止远程 root 登录(在本地主机之外)
注意mysql_secure_installation 脚本在 MariaDB 10.5 或更高版本中不再有价值。从 MariaDB 10.5 开始,安全增强是默认行为的一部分。
如果要从 RHEL 8 中的早期 mariadb 流升级,请按照 切换到更新的流 和 从 MariaDB 10.3 升级到 MariaDB 10.5 或 从 MariaDB 10.5 升级到 MariaDB 10.11 中描述的流程操作。
7.2.2. 在容器中运行多个 MariaDB 版本 复制链接链接已复制到粘贴板!
要在同一主机上运行不同版本的 MariaDB,请在容器中运行它们,因为您无法并行安装同一模块的多个版本(流)。
先决条件
-
container-tools模块已安装。
流程
使用您的红帽客户门户网站帐户向
registry.redhat.io注册中心进行身份验证:# podman login registry.redhat.io如果您已登录到容器注册中心,请跳过这一步。
在容器中运行 MariaDB 10.3 :
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_1>:3306 rhel8/mariadb-103有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.5 :
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
在容器中运行 MariaDB 10.11 :
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011有关使用此容器镜像用法的更多信息,请参阅 红帽生态系统目录。
注意容器名称和两个数据库服务器的主机端口必须不同。
要确保客户端可以访问网络上的数据库服务器,请在防火墙中打开主机端口:
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,<host_port_3>/tcp...} # firewall-cmd --reload
验证
显示正在运行的容器的信息:
$ podman ps连接到数据库服务器,并以 root 用户身份登录:
# mysql -u root -p -h localhost -P <host_port> --protocol tcp
7.2.3. 配置 MariaDB 复制链接链接已复制到粘贴板!
要为联网配置 MariaDB 服务器,请使用以下流程:
流程
编辑
/etc/my.cnf.d/mariadb-server.cnf文件的[mysqld]部分。您可以设置以下配置指令:bind-address- 是服务器监听的地址。可能的选项有:- 主机名
- IPv4 地址
- IPv6 地址
skip-networking- 控制服务器是否监听 TCP/IP 连接。可能的值有:- 0 - 侦听所有客户端
- 1 - 只监听本地客户端
-
port- MariaDB 监听 TCP/IP 连接的端口。
重启
mariadb服务:# systemctl restart mariadb.service
7.2.4. 在 MariaDB 服务器上设置 TLS 加密 复制链接链接已复制到粘贴板!
默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。
7.2.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/设置 CA 和服务器证书的权限,使 MariaDB 服务器能够读取文件:
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/目录中:# mv <path>/server.example.com.key.pem /etc/pki/tls/private/对服务器的私钥设置安全权限:
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem如果未授权的用户可以访问私钥,因此到 MariaDB 服务器的连接不再是安全的。
恢复 SELinux 上下文:
# restorecon -Rv /etc/pki/tls/
7.2.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)字段与服务器的主机名匹配。
流程
创建
/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如果您有一个证书撤销列表(CRL),则将 MariaDB 服务器配置为使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem可选:如果您运行 MariaDB 10.5.2 或更高版本,那么您可以拒绝未加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on可选:如果您运行 MariaDB 10.4.6 或更高版本,那么您可以设置服务器应该支持的 TLS 版本。例如,要支持 TLS 1.2 和 TLS 1.3,请附加:
tls_version = TLSv1.2,TLSv1.3默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。
重启
mariadb服务:# systemctl restart mariadb.service
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MariaDB 服务器上执行以下步骤:
验证 MariaDB 现在是否启用了 TLS 加密:
# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_ssl | YES | +---------------+-----------------+如果
have_ssl变量设置为yes,则启用 TLS 加密。如果您将 MariaDB 服务配置为只支持特定的 TLS 版本,则显示
tls_version变量:# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tls_version | TLSv1.2,TLSv1.3 | +---------------+-----------------+
7.2.4.3. 对特定的用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MariaDB 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
- 客户端信任签发服务器证书的 CA 证书。
流程
以管理员用户身份连接到 MariaDB 服务器:
# mysql -u root -p -h server.example.com如果您的管理用户没有远程访问服务器的权限,请在 MariaDB 服务器上执行命令,并连接到
localhost。使用
REQUIRE SSL子句强制用户必须使用 TLS 加密连接进行连接:MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
验证
使用 TLS 加密,以
example用户身份连接到服务器:# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>如果没有显示错误,且您可以访问交互式 MariaDB 控制台,则与 TLS 的连接成功。
尝试以禁用 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)服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(
--skip-ssl)。
7.2.5. 在 MariaDB 客户端中全局启用 TLS 加密 复制链接链接已复制到粘贴板!
如果您的 MariaDB 服务器支持 TLS 加密,请将客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。
7.2.5.1. 将 MariaDB 客户端配置为默认使用 TLS 加密 复制链接链接已复制到粘贴板!
在 RHEL 上,您可以全局配置 MariaDB 客户端使用 TLS 加密,并验证服务器证书中的通用名称(CN)与用户连接的主机名匹配。这可防止中间人攻击。
先决条件
- MariaDB 服务器启用了 TLS 支持。
- 如果 RHEL 不信任发布服务器证书的证书颁发机构(CA),则 CA 证书已被复制到客户端。
流程
如果 RHEL 不信任发布服务器证书的 CA:
将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/目录中:# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/设置允许所有用户读取 CA 证书文件的权限:
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem重建 CA 信任数据库:
# update-ca-trust
使用以下内容创建
/etc/my.cnf.d/mariadb-client-tls.cnf文件:[client-mariadb] ssl ssl-verify-server-cert这些设置定义 MariaDB 客户端使用 TLS 加密(
ssl),并且客户端将主机名与服务器证书中的 CN(ssl-verify-server-cert)进行比较。
验证
使用主机名连接到服务器,并显示服务器的状态:
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384如果
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
7.2.6. 备份 MariaDB 数据 复制链接链接已复制到粘贴板!
从 MariaDB 数据库备份数据有两种主要方法:
- 逻辑备份
逻辑备份由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。
与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置、MariaDB 版本或数据库管理系统(DBMS)上恢复,这无法通过物理备份来实现。
请注意,逻辑备份只有在
mariadb.service运行时才能执行。逻辑备份不包括日志和配置文件。- 物理备份
物理备份由存储内容的文件和目录的副本组成。
与逻辑备份相比,物理备份具有以下优点:
- 输出更为紧凑。
- 备份的大小会较小。
- 备份和恢复速度更快。
备份包括日志和配置文件。
请注意,当
mariadb.service没有运行或者数据库中的所有表都被锁定以防止备份期间更改时,必须执行物理备份。
您可以使用以下一种 MariaDB 备份方法,来从 MariaDB 数据库备份数据:
-
使用
mysqldump的逻辑备份 -
使用
Mariabackup工具的物理在线备份 - 文件系统备份
- 作为备份解决方案复制
7.2.6.1. 使用 mysqldump 执行逻辑备份 复制链接链接已复制到粘贴板!
mysqldump 客户端是一种备份实用程序,可用于转储数据库或数据库集合,用于备份或传输到其他数据库服务器。mysqldump 的输出通常包含 SQL 语句,用于重新创建服务器表结构、给它填充数据或两者兼而有之。mysqldump 也可以以其他格式生成文件,包括 XML 和分隔的文本格式,如 CSV。
要执行 mysqldump 备份,您可以使用以下一种选项:
- 备份一个或多个所选的数据库
- 备份所有数据库
- 从一个数据库备份表子集
流程
要转储单个数据库,请运行:
# mysqldump [options] --databases db_name > backup-file.sql要一次转储多个数据库,请运行:
# mysqldump [options] --databases db_name1 [db_name2 …] > backup-file.sql要转储所有数据库,请运行:
# mysqldump [options] --all-databases > backup-file.sql要将一个或多个转储的完整数据库加载回服务器,请运行:
# mysql < backup-file.sql要将数据库加载到远程 MariaDB 服务器,请运行:
# mysql --host=remote_host < backup-file.sql要转储一个数据库中的表的子集,请在
mysqldump命令的末尾添加所选表的列表:# mysqldump [options] db_name [tbl_name …] > backup-file.sql要载入从一个数据库转储的表的子集,请运行:
# mysql db_name < backup-file.sql注意此时,db_name 数据库必须存在。
要查看 mysqldump 支持的选项列表,请运行:
$ mysqldump --help
7.2.6.2. 使用 Mariabackup 工具执行物理在线备份 复制链接链接已复制到粘贴板!
mariabackup 是一个基于 Percona XtraBackup 技术的工具,能够执行 InnoDB、Aria 和 MyISAM 表的物理在线备份。这个工具是由 AppStream 存储库中的 mariadb-backup 软件包提供的。
mariabackup 支持对 MariaDB 服务器的全备份功能,其中包括加密和压缩的数据。
先决条件
mariadb-backup软件包已在系统中安装:# yum install mariadb-backup
- 您必须为 Mariabackup 提供要在其下运行备份的用户的凭证。您可以在命令行中或通过配置文件来提供凭证。
-
Mariabackup 的用户必须具有
RELOAD、LOCK TABLES和REPLICATION CLIENT特权。
要使用 Mariabackup 创建数据库备份,请使用以下流程:
流程
要在在命令行上提供凭证的同时创建备份,请运行:
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>target-dir选项定义存储备份文件的目录。如果要执行全备份,目标目录必是空或者不存在。user和password选项允许您配置用户名和密码。要使用配置文件中设置的凭证创建备份:
-
在
/etc/my.cnf.d/目录中创建配置文件,例如/etc/my.cnf.d/mariabackup.cnf。 将以下行添加到新文件的
[xtrabackup]或[mysqld]部分中:[xtrabackup] user=myuser password=mypassword执行备份:
$ mariabackup --backup --target-dir <backup_directory>
-
在
7.2.6.3. 使用 Mariabackup 工具恢复数据 复制链接链接已复制到粘贴板!
备份完成后,您可以使用 mariabackup 命令及以下一个选项来从备份中恢复数据:
-
--copy-back允许您保存原始的备份文件。 -
--move-back将备份文件移到数据目录中,并删除原始的备份文件。
要使用 Mariabackup 工具来恢复数据,请使用以下流程:
先决条件
验证
mariadb服务是否没有运行:# systemctl stop mariadb.service- 验证数据目录是否为空。
-
Mariabackup 的用户必须具有
RELOAD、LOCK TABLES和REPLICATION CLIENT特权。
流程
运行
mariabackup命令:要恢复数据并保留原始备份文件,请使用
--copy-back选项:$ mariabackup --copy-back --target-dir=/var/mariadb/backup/要恢复数据并删除原始备份文件,请使用
--move-back选项:$ mariabackup --move-back --target-dir=/var/mariadb/backup/
修复文件权限。
恢复数据库时,Mariabackup 会保留备份的文件和目录特权。但是,Mariabackup 以恢复数据库的用户和组的身份将文件写入磁盘。恢复备份后,您可能需要调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组,通常两者都为
mysql。例如,要递归地将文件的所有权改为
mysql用户和组:# chown -R mysql:mysql /var/lib/mysql/启动
mariadb服务:# systemctl start mariadb.service
7.2.6.4. 执行文件系统备份 复制链接链接已复制到粘贴板!
要创建 MariaDB 数据文件的文件系统备份,请将 MariaDB 数据目录的内容复制到您的备份位置。
要同时备份当前的配置或日志文件,请使用以下流程的可选步骤:
流程
停止
mariadb服务:# systemctl stop mariadb.service将数据文件复制到所需位置:
# cp -r /var/lib/mysql /backup-location可选:将配置文件复制到所需位置:
# cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration可选:将日志文件复制到所需位置:
# cp /var/log/mariadb/* /backup-location/logs启动
mariadb服务:# systemctl start mariadb.service将备份位置的备份数据加载到
/var/lib/mysql目录时,请确保mysql:mysql是/var/lib/mysql中所有数据的所有者:# chown -R mysql:mysql /var/lib/mysql
7.2.6.5. 作为备份解决方案复制 复制链接链接已复制到粘贴板!
复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。
复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。
7.2.7. 迁移到 MariaDB 10.3 复制链接链接已复制到粘贴板!
RHEL 7 包含了 MariaDB 5.5,其作为来自 MySQL 数据库系列的服务器的默认实现。MariaDB 数据库服务器的后续版本可作为 RHEL 7 的软件集合提供。RHEL 8 提供 MariaDB 10.3、MariaDB 10.5、MariaDB 10.11 和 MySQL 8.0。
这部分描述了从 RHEL 7 或 MariaDB 的红帽软件集合版本迁移到 MariaDB 10.3。
如果要在 RHEL 8 中从 MariaDB 10.3 迁移到 MariaDB 10.5,请参阅 从 MariaDB 10.3 升级到 MariaDB 10.5。
如果要在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11,请参阅 从 MariaDB 10.5 升级到 MariaDB 10.11。
7.2.7.1. RHEL 7 和 RHEL 8 版本的 MariaDB 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 5.5 和 MariaDB 10.3 之间的最重要的变化是:
- MariaDB Galera 集群 是同步的多源集群,自 10.1 起就是 MariaDB 的标准部分。
- 默认情况下 ARCHIVE 存储引擎不再启用,插件需要专门启用。
- 默认情况下 BLACKHOLE 存储引擎不再启用,插件需要专门启用。
InnoDB 而不是 XtraDB 被用作默认存储引擎,后者用于 MariaDB 10.1 及更早的版本。
如需了解更多详细信息,请参阅 InnoDB 而不是 XtraDB。
-
新的
mariadb-connector-c软件包为 MySQL 和 MariaDB 提供通用客户端库。这个程序库可用于 MySQL 和 MariaDB 数据库服务器的任何版本。因此,用户可以将应用程序的一个构建连接到 Red Hat Enterprise Linux 8 发布的任何 MySQL 和 MariaDB 服务器。
要从 MariaDB 5.5 迁移到 MariaDB 10.3,您需要执行多个 配置更改。
7.2.7.2. 配置更改 复制链接链接已复制到粘贴板!
从 MariaDB 5.5 升级到 MariaDB10.3 的迁移路径是首先升级到 MariaDB 10.0,然后再每次升级一个版本。
一次升级一个次要版本的主要优点是数据库(包括数据和配置)可以更好地适应变化。这样,升级过程可以结束后获得的主版本与 RHEL 8 中的相同(MariaDB 10.3),这可显著减少配置更改或其他问题。
有关从 MariaDB 5.5 迁移到 MariaDB 10.0 时配置更改的更多信息,请参阅 Red Hat Software Collections 文档中的 迁移到 MariaDB 10.0 。
以下介绍了迁移到 MariaDB 连续版本以及所需的配置更改:
- 红帽软件集合文档中的 迁移至MariaDB 10.1。
- 红帽软件集合文档中的 迁移到 MariaDB 10.2。
- 红帽软件集合文档中的 迁移到 MariaDB 10.3。
也可以直接从 MariaDB 5.5 迁移到 MariaDB 10.3,但您必须执行上述迁移文档中描述的不同部分所需的所有配置变化。
7.2.7.3. 使用 mysql_upgrade 工具进行原位升级 复制链接链接已复制到粘贴板!
要将数据库文件迁移到 RHEL 8,RHEL 7 上 MariaDB 的用户必须使用 mysql_upgrade 工具执行原位升级。mysql_upgrade 工具是由 mariadb-server-utils 子软件包提供的,该子软件包作为 mariadb-server 软件包的依赖项而安装的。
要执行原位升级,您必须将二进制数据文件复制到 RHEL 8 系统上的 /var/lib/mysql/ 数据目录,并使用 mysql_upgrade 工具。
您可以使用此方法迁移以下数据:
- Red Hat Enterprise Linux 7 的 MariaDB 5.5
红帽软件集合的以下版本:
- MariaDB 5.5 (不再支持)
- MariaDB 10.0 (不再支持)
- MariaDB 10.1 (不再支持)
- MariaDB 10.2 (不再支持)
MariaDB 10.3 (不再支持)
请注意,建议依次升级到 MariaDB 10.3。请参阅 红帽软件集合发行注记中相应的迁移章节。
如果您从 MariaDB 的 RHEL 7 版本升级,那么源数据将存储在 /var/lib/mysql/ 目录中。对于 MariaDB 的红帽软件集合版本,源数据目录为 /var/opt/rh/<collection_name>/lib/mysql/ (mariadb55 除外,它使用 /opt/rh/mariadb55/root/var/lib/mysql/ 数据目录)。
要使用 mysql_upgrade 工具执行升级,请使用以下流程:
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
确保 RHEL 8 系统上安装了
mariadb-server软件包:# yum install mariadb-server确保
mariadb服务在复制数据时没有在源和目标系统上运行:# systemctl stop mariadb.service-
将源位置的数据复制到 RHEL 8 目标系统上的
/var/lib/mysql/目录。 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:
# restorecon -vr /var/lib/mysql在目标系统中启动 MariaDB 服务器:
# systemctl start mariadb.service运行
mysql_upgrade命令来检查和修复内部表:$ mysql_upgrade-
升级完成后,验证
/etc/my.cnf.d/目录中的所有配置文件是否只包含 MariaDB 10.3 的有效选项。
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.3 发行注记。
7.2.8. 从 MariaDB 10.3 升级到 MariaDB 10.5 复制链接链接已复制到粘贴板!
这部分描述了在 RHEL 8 上从 MariaDB 10.3 迁移到 MariaDB 10.5。
7.2.8.1. MariaDB 10.3 和 MariaDB 10.5 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 10.3 和 MariaDB 10.5 之间的显著变化包括:
-
MariaDB 现在默认使用
unix_socket身份验证插件。该插件允许用户在通过本地 UNIX 套接字文件连接到 MariaDB 时使用操作系统凭证。 -
MariaDB添加了mariadb-*命名的二进制文件和指向mariadb-*的mysql*符号链接。例如,mysqladmin、mysqlaccess和mysqlshow分别指向mariadb-admin、mariadb-access和mariadb-show二进制代码。 -
SUPER特权已被分成几个特权,以更好地与每个用户角色保持一致。因此,某些语句已更改了所需的权限。 -
在并行
复制中,slave_parallel_mode现在被默认设置为静态。 -
在 InnoDB 存储引擎 中,以下变量的默认值已发生变化:
innodb_adaptive_hash_index变为OFF,innodb_checksum_algorithm变为full_crc32。 MariaDB 现在使用用于管理 MariaDB 命令历史记录(the
.mysql_history文件)的底层软件的libedit实施,而不是之前使用的readline库。此更改会影响直接使用.mysql_history文件的用户。注意.mysql_history是一个由 MariaDB 或 MySQL 应用管理的文件,用户不应直接使用该文件。人类可读的外表是巧合。注意要提高安全性,您可以考虑不维护历史记录文件。禁用记录命令历史记录:
-
删除
.mysql_history文件(如果存在的话)。 使用以下任一方法:
-
将
MYSQL_HISTFILE变量设置为/dev/null,并将此设置包含在您的任何 shell 启动文件中。 将
.mysql_history文件更改为指向/dev/null的符号链接:$ ln -s /dev/null $HOME/.mysql_history
-
将
-
删除
MariaDB Galera 集群 已升级到版本 4,有以下显著变化:
- Galera 添加了一个新的流复制特性,其支持复制无限大小的事务。在执行流复制的过程中,集群以小片段复制事务。
- Galera 现在完全支持全球交易 ID(GTID)。
-
/etc/my.cnf.d/galera.cnf文件中的wsrep_on选项的默认值已从1改为0,以防止最终用户在没有配置所需的附加选项的情况下启动wsrep复制。
MariaDB 10.5 中对 PAM 插件的更改包括:
-
MariaDB 10.5 添加了一个新版本的可插拔验证模块(PAM)插件。PAM 插件版本 2.0 使用单独的
setuid root助手二进制文件执行 PAM 身份验证,这使 MariaDB 能够使用额外的 PAM 模块。 -
帮助程序二进制文件只能由
mysql组中的用户执行。默认情况下,组只包含mysql用户。红帽建议管理员不要向mysql组添加更多用户,以防止无需通过这个助手工具进行节流或记录的情况下的密码猜测攻击。 -
在 MariaDB 10.5 中,可插拔验证模块(PAM)插件及其相关文件已移至新软件包
mariadb-pam中。因此,在不使用对MariaDB进行PAM 验证的系统中不会引入新的setuid root二进制文件。 -
mariadb-pam软件包同时包含 PAM 插件版本:版本 2.0 是默认值,版本 1.0 作为auth_pam_v1共享对象库提供。 -
默认情况下,
mariadb-pam软件包不与 MariaDB 服务器一起安装 。要使 PAM 身份验证插件在 MariaDB 10.5 中可用,请手动安装mariadb-pam软件包。
7.2.8.2. 从 MariaDB 10.3 的 RHEL 8 版本升级到 MariaDB 10.5 复制链接链接已复制到粘贴板!
此流程描述了使用 yum 和 mariadb-upgrade工具从 mariadb:10.3 模块流升级到 mariadb:10.5 模块流。
mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
停止 MariaDB 服务器:
# systemctl stop mariadb.service执行以下命令,以确定您的系统是否已准备好切换到更新的流:
# yum distro-sync这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流。
重置系统上的
mariadb模块:# yum module reset mariadb启用新的
mariadb:10.5模块流:# yum module enable mariadb:10.5同步安装的软件包以在流间进行更改:
# yum distro-sync这将更新所有已安装的 MariaDB 软件包。
-
调整配置,以便位于
/etc/my.cnf.d/中的选项文件只包含对 MariaDB 10.5 有效的选项。详情请参阅 MariaDB 10.4 和 MariaDB 10.5 的上游文档。 启动 MariaDB 服务器。
在升级独立运行的数据库时:
# systemctl start mariadb.service在升级 Galera 集群节点时:
# galera_new_clustermariadb服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
# mariadb-upgrade在升级 Galera 集群节点时:
# mariadb-upgrade --skip-write-binlog
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.5 发行注记。
7.2.9. 从 MariaDB 10.5 升级到 MariaDB 10.11 复制链接链接已复制到粘贴板!
这部分描述了在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11。
7.2.9.1. MariaDB 10.5 和 MariaDB 10.11 之间的显著区别 复制链接链接已复制到粘贴板!
MariaDB 10.5 和 MariaDB 10.11 之间的显著变化包括:
-
新的
sys_schema功能是一个视图、功能和流程的集合,用来提供有关数据库使用情况的信息。 -
CREATE TABLE,ALTER TABLE,RENAME TABLE,DROP TABLE,DROP DATABASE以及相关的数据定义语言(DDL)语句现在都是原子的。语句必须全部完成,否则更改会被恢复。请注意,当使用DROP TABLE删除多个表时,只有每个单独的删除是原子的,而不是表的完整列表。 -
提供了一个新的
GRANT … TO PUBLIC特权。 -
SUPER和READ ONLY ADMIN权限现在是分开的。 -
现在,您可以在新的
UUID数据库数据类型中存储通用的唯一标识符。 - MariaDB 现在支持安全套接字层(SSL)协议版本 3。
- MariaDB 服务器现在需要正确配置的 SSL 才能启动。在以前的版本中,MariaDB 默默禁用 SSL,并在 SSL 配置错误的情况下使用不安全连接。
-
MariaDB 现在支持通过
natural_sort_key()函数的自然排序。 -
新的
SFORMAT功能现在用于任意文本格式化。 -
utf8字符集(和相关排序规则)现在默认是utf8mb3的别名。 - MariaDB 支持 Unicode Collation Algorithm (UCA) 14 排序规则。
-
MariaDB 的
systemd套接字激活文件现在在/usr/share/目录中提供。请注意,与上游不同,它们不是 RHEL 中默认配置的一部分。 -
错误消息现在包含
MariaDB字符串,而不是MySQL。 - 错误消息现在以中文提供。
- 默认的 logrotate 文件已发生了很大变化。在迁移到 MariaDB 10.11 前检查您的配置。
-
对于 MariaDB 和 MySQL 客户端,命令行上指定的连接属性(如
--port=3306)现在强制客户端和服务器之间的协议通信类型,如tcp、socket、pipe或memory。例如,在以前的版本中,如果 MariaDB 客户端通过 UNIX 套接字连接,则指定的端口会被忽略。
7.2.9.2. 从 RHEL 8 版本的 MariaDB 10.5 升级到 MariaDB 10.11 复制链接链接已复制到粘贴板!
这个流程描述了使用 yum 和 mariadb-upgrade 工具从 mariadb:10.5 模块流升级到 mariadb:10.11 模块流。
mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。
先决条件
- 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。
流程
停止 MariaDB 服务器:
# systemctl stop mariadb.service执行以下命令,以确定您的系统是否已准备好切换到更新的流:
# yum distro-sync这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流。
重置系统上的
mariadb模块:# yum module reset mariadb启用新的
mariadb:10.11模块流:# yum module enable mariadb:10.11同步安装的软件包以在流间进行更改:
# yum distro-sync这将更新所有已安装的 MariaDB 软件包。
-
调整配置,以便位于
/etc/my.cnf.d/中的选项文件只包含对 MariaDB 10.11 有效的选项。详情请查看 MariaDB 10.6 和 MariaDB 10.11 的上游文档。 启动 MariaDB 服务器。
在升级独立运行的数据库时:
# systemctl start mariadb.service在升级 Galera 集群节点时:
# galera_new_clustermariadb服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
# mariadb-upgrade在升级 Galera 集群节点时:
# mariadb-upgrade --skip-write-binlog
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.11 发行注记。
7.2.10. 使用 Galera 复制 MariaDB 复制链接链接已复制到粘贴板!
您可以在 Red Hat Enterprise Linux 8 中使用 Galera 解决方案复制 MariaDB 数据库
7.2.10.1. MariaDB Galera 集群介绍 复制链接链接已复制到粘贴板!
Galera 复制是基于同步多源 MariaDB Galera集群 的创建,该群集由多个 MariaDB 服务器组成。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。
Galera 复制和 MariaDB 数据库之间的接口由写集复制 API(wsrep API) 定义的。
MariaDB Galera 集群 的主要特性是 :
- 同步复制
- 主动-主动多源拓扑
- 对任何集群节点的读和写
- 自动成员资格控制,故障节点从集群中删除
- 自动节点加入
- 行一级的并行复制
- 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点
同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),可以体验类似于原生 MariaDB 的行为。
同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。
因此,与异步复制相比,同步复制具有以下优势:
- 在特定集群节点间传播更改没有延迟
- 所有集群节点始终一致
- 如果其中一个集群节点崩溃,则不会丢失最新的更改
- 所有集群节点上的事务都会并行执行
- 整个集群的因果关系
7.2.10.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 8 中的 MariaDB 10.3、MariaDB 10.5 和 MariaDB 10.11 包括
garbdsystemd 服务的红帽版本,以及/usr/lib/systemd/system/garbd.service中galera软件包和/usr/sbin/garbd-wrapper文件中相应的包装器脚本。从 RHEL 8.6 开始,与 RHEL 一起分发的 MariaDB 还提供位于/usr/share/doc/galera/garb-systemd和/usr/share/doc/galera/garbd.service中的这些文件的上游版本。
7.2.10.3. 部署 MariaDB Galera 集群 复制链接链接已复制到粘贴板!
您可以部署 MariaDB Galera Cluster 软件包,并更新配置。要组成一个新集群,您必须引导集群的第一个节点。
先决条件
- 集群中的所有节点都 设置了 TLS。
所有节点上所有证书的
Extended Key Usage字段都必须设置为:TLS Web Server Authentication, TLS Web Client Authentication
流程
通过从
mariadb模块选择流(版本),并指定galera配置文件来安装 MariaDB Galera 集群 软件包。例如:# yum module install mariadb:10.3/galera因此,以下软件包会与依赖项一起安装:
-
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://对于初始节点,可以将
wsrep_cluster_address设置为空列表:wsrep_cluster_address="gcomm://"对于所有其他节点,将
wsrep_cluster_address设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:wsrep_cluster_address="gcomm://10.0.0.10"有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址。
-
通过在
/etc/my.cnf.d/galera.cnf配置文件中设置wsrep_on=1选项来在每个节点上启用wsrepAPI。 将
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”通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:
# galera_new_cluster这个打包程序确保 MariaDB 服务器守护进程(
mysqld)使用--wsrep-new-cluster选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。注意mariadb服务支持 systemd 方法来与多个 MariaDB 服务器进程进行交互。因此,在有多个 MariaDB 服务器运行的情况下,您可以通过将实例名称指定为后缀来引导特定的实例:# galera_new_cluster mariadb@node1在每个节点上运行以下命令将其他节点连接到集群:
# systemctl start mariadb.service因此,节点连接到集群,并将自己与集群的状态同步。
验证
7.2.10.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 | +--------------------+-------+显示节点的集群组件状态:
# mysql -u root -p -e 'show status like "wsrep_cluster_status";' +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | wsrep_cluster_status | Primary | +----------------------+---------+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 | +---------------------------+--------+以下是
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 | +---------------+-------+当
wsrep_ready变量为ON时,节点已成功初始化其组件,并连接到集群。另外,节点也会同步,或达到一个可以提供查询的状态。检查节点是否与其他主机有网络连接:
# mysql -u root -p -e 'show status like "wsrep_connected";' +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | wsrep_connected | ON | +-----------------+-------+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 | +----------------------------+-------+接近 0 的值是理想的状态,表示节点在收到写集时继续应用它们。持久高或增长的值可能是性能瓶颈的一种指示,如磁盘 I/O 慢。
显示流控制状态:
# mysql -u root -p -e 'show status like "wsrep_flow_control_paused";' +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | wsrep_flow_control_paused | 0 | +---------------------------+-------+这个变量代表节点已暂停,且无法处理新传入的事务的时间分数,因为其本地接收队列太满、触发了流控制。接近 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 | +--------------------------+-------+数值越高,表示并行的程度越大。它是您可以在
/etc/my.cnf.d/galera.cnf文件中的wsrep_slave_threads参数中可使用的最佳值。
7.2.10.5. 在 MariaDB Galera 集群中添加新节点 复制链接链接已复制到粘贴板!
要在 MariaDB Galera 集群 中添加新节点,请使用以下步骤。
请注意,您也可以使用此流程重新连接已存在的节点。
流程
在特定节点上,在
/etc/my.cnf.d/galera.cnf配置文件的[mariadb]部分的wsrep_cluster_address选项中为一个或多个现有群集成员提供一个地址:[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。
但是,最好在
wsrep_cluster_address中列出集群的所有节点。因此,任何节点都可以通过连接到任何其他群集节点来加入群集,即使一个或多个群集节点停机了也没关系。当所有成员就成员资格达成一致时,集群的状态将会改变。如果新节点的状态与集群状态不同,新节点需要请求增加状态转移(IST)或状态快照传输(SST),来确保与其他节点保持一致。
7.2.10.6. 重启 MariaDB Galera 集群 复制链接链接已复制到粘贴板!
如果您同时关闭所有节点,您将停止集群,正在运行的集群不再存在。但是,集群的数据仍然存在。
要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。
如果集群没有 bootstrap ,并且 mariadb 在第一个节点上仅通过 systemctl start mariadb.service 命令启动,则节点会尝试连接到 /etc/my.cnf.d/galera.cnf 文件中 wsrep_cluster_address 选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。
7.2.11. 开发 MariaDB 客户端应用程序 复制链接链接已复制到粘贴板!
红帽建议针对 MariaDB 客户端库开发 MariaDB 客户端应用程序。
针对 MariaDB 客户端库构建应用程序所需的开发文件和程序由 mariadb-connector-c-devel 软件包提供。
不使用直接库名称,而是使用 mariadb_config 程序,该程序在 mariadb-connector-c-devel 软件包中分发。此程序确保返回正确的构建标志。