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 - available since 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.1.1. 在容器中运行多个 MariaDB 版本
要在同一主机上运行不同版本的 MariaDB,请在容器中运行它们,因为您无法并行安装同一模块的多个版本(streams)。
先决条件
-
container-tools
模块已安装。
流程
使用您的红帽客户门户网站帐户向
registry.redhat.io
registry 进行身份验证:# podman login registry.redhat.io
如果您已登录到容器 registry,请跳过这一步。
在容器中运行 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.2. 配置 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.3. 在 MariaDB 服务器上设置 TLS 加密
默认情况下,MariaDB 使用未加密的连接。对于安全连接,在 MariaDB 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。
7.2.3.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.3.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
验证
要简化故障排除,请在将本地客户端配置为使用 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.3.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.4. 在 MariaDB 客户端中全局启用 TLS 加密
如果您的 MariaDB 服务器支持 TLS 加密,请将客户端配置为仅建立安全连接,并验证服务器证书。这个流程描述了如何为服务器上的所有用户启用 TLS 支持。
7.2.4.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
其它资源
-
mysql(1)
手册页中的--ssl*
参数描述。
7.2.5. 备份 MariaDB 数据
在 Red Hat Enterprise Linux 8 中从 MariaDB 数据库备份数据主要有两种方法:
- 逻辑备份
- 物理备份
逻辑备份 由恢复数据所需的 SQL 语句组成。这种类型的备份以纯文本文件的形式导出信息和记录。
与物理备份相比,逻辑备份的主要优势在于可移植性和灵活性。数据可以在其他硬件配置上恢复,MariaDB 版本或数据库管理系统(DBMS)上恢复,这些系统无法进行物理备份。
请注意,如果 mariadb.service
正在运行,则可以执行逻辑备份。逻辑备份不包括日志和配置文件。
物理备份由保存内容的文件和目录副本组成。
与逻辑备份相比,物理备份具有以下优点:
- 输出更为紧凑。
- 备份的大小会较小。
- 备份和恢复速度更快。
- 备份包括日志和配置文件。
请注意,当 mariadb.service
没有运行或者数据库中的所有表都被锁定以防止备份期间更改时,必须执行物理备份。
您可以使用以下一种 MariaDB 备份方法,来从 MariaDB 数据库备份数据:
-
使用
mysqldump
的逻辑备份 -
使用
Mariabackup
工具的物理在线备份 - 文件系统备份
- 作为备份解决方案复制
7.2.5.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
其它资源
- 有关使用 mysqldump 进行逻辑备份的更多信息,请参阅 MariaDB 文档。
7.2.5.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.5.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.5.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.5.5. 作为备份解决方案复制
复制是源服务器的一个替代的备份解决方案。如果源服务器复制到副本服务器,备份可以在副本上运行,而不会对源造成任何影响。当您关闭副本,并从副本备份数据时,源仍然可以运行。
复制本身并不是一个足够的备份解决方案。复制可以防止源服务器出现硬件故障,但它不能确保防止数据的丢失。建议您将对副本的任何其他备份解决方案与此方法一起使用。
7.2.6. 迁移到 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.6.1. RHEL 7 和 RHEL 8 版本的 MariaDB 之间的显著区别
MariaDB 5.5 和 MariaDB 10.3 之间的最重要的变化是:
- MariaDB Galera 集群 是同步的多源集群,自 10.1 起就是 MariaDB 的标准部分。
- 默认情况下不再启用 ARCHIVE 存储引擎,插件需要特别启用。
- 默认情况下不再启用 BLACKHOLE 存储引擎,插件需要特别启用。
InnoDB 而不是 XtraDB 被用作默认存储引擎,后者用于 MariaDB 10.1 及更早的版本。
如需了解更多详细信息,请参阅 MariaDB 10.2 为什么使用 InnoDB 而不是 XtraDB?
-
新的
mariadb-connector-c
软件包为 MySQL 和 MariaDB 提供通用客户端库。这个程序库可用于 MySQL 和 MariaDB 数据库服务器的任何版本。因此,用户可以将应用程序的一个构建连接到 Red Hat Enterprise Linux 8 发布的任何 MySQL 和 MariaDB 服务器。
要从 MariaDB 5.5 迁移到 MariaDB 10.3,您需要执行多个 配置更改。
7.2.6.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.6.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.7. 从 MariaDB 10.3 升级到 MariaDB 10.5
这部分描述了在 RHEL 8 上从 MariaDB 10.3 迁移到 MariaDB 10.5。
7.2.7.1. MariaDB 10.3 和 MariaDB 10.5 之间的显著区别
MariaDB 10.3 和 MariaDB 10.5 之间的显著变化包括:
-
MariaDB 现在默认使用
unix_socket
身份验证插件。该插件允许用户在通过本地 UNIX 套接字文件连接到 MariaDB 时使用操作系统凭证。 -
MariaDB
添加了名为 binary、mysql*
符号链接,指向mariadb114
二进制文件。例如,
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.7.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_cluster
mariadb
服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
# mariadb-upgrade
在升级 Galera 集群节点时:
# mariadb-upgrade --skip-write-binlog
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的通用信息,请参阅 MariaDB 10.5 发行注记。
7.2.8. 从 MariaDB 10.5 升级到 MariaDB 10.11
这部分论述了在 RHEL 8 中从 MariaDB 10.5 迁移到 MariaDB 10.11。
7.2.8.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
字符集(和相关 collations)现在默认是utf8mb3
的别名。 - MariaDB 支持 Unicode Collation Algorithm (UCA) 14 联合。
-
MariaDB 的
systemd
套接字激活文件现在包括在/usr/share/
目录中。请注意,与上游相反,它们不是 RHEL 中默认配置的一部分。 -
错误消息现在包含
MariaDB
字符串而不是MySQL
。 - 错误消息现在包括在中文语言中。
- 默认的 logrotate 文件已更改。在迁移到 MariaDB 10.11 前检查您的配置。
-
对于 MariaDB 和 MySQL 客户端,命令行中指定的连接属性(如
--port=3306
)现在强制客户端和服务器间的协议通信类型,如tcp
、套接字
、管道
或内存
。在以前的版本中,如果通过 UNIX 套接字连接的 MariaDB 客户端,则指定的端口会被忽略。
7.2.8.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_cluster
mariadb
服务将自动启动。
执行 mariadb-upgrade 工具来检查和修复内部表。
在升级独立运行的数据库时:
# mariadb-upgrade
在升级 Galera 集群节点时:
# mariadb-upgrade --skip-write-binlog
有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的常规信息,请参阅 MariaDB 10.11 发行注记。
7.2.9. 使用 Galera 复制 MariaDB
这部分描述了如何在 Red Hat Enterprise Linux 8 上使用 Galera 解决方案复制 MariaDB 数据库。
7.2.9.1. MariaDB Galera 集群介绍
Galera 复制是基于同步多源 MariaDB Galera集群 的创建,该群集由多个 MariaDB 服务器组成。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。
Galera 复制和 MariaDB 数据库之间的接口由写集复制 API(wsrep API) 定义的。
MariaDB Galera 集群 的主要特性是 :
- 同步复制
- 主动-主动多源拓扑
- 对任何集群节点的读和写
- 自动成员资格控制,故障节点从集群中删除
- 自动节点加入
- 行一级的并行复制
- 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点
同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),可以体验类似于原生 MariaDB 的行为。
同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。
因此,与异步复制相比,同步复制具有以下优势:
- 在特定集群节点间传播更改没有延迟
- 所有集群节点始终一致
- 如果其中一个集群节点崩溃,则不会丢失最新的更改
- 所有集群节点上的事务都会并行执行
- 整个集群的因果关系
7.2.9.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 分别包含
garbd
systemd 服务的红帽版本,以及/usr/lib/systemd/system/garbd.service
和/usr/sbin/garbd-wrapper
文件中的galera
软件包的 wrapper 脚本。从 RHEL 8.6 开始,与 RHEL 一起分发的 MariaDB 还提供这些文件的上游版本(位于/usr/share/doc/galera/garb-systemd
和/usr/share/doc/galera/garbd.service
)。
7.2.9.3. 部署 MariaDB Galera 集群
先决条件
通过从
mariadb
模块选择流(版本),并指定galera
配置文件来安装 MariaDB Galera 集群 软件包。例如:# yum module install mariadb:10.3/galera
因此,会安装以下软件包:
-
mariadb-server-galera
-
mariadb-server
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 集群地址。
流程
通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:
# galera_new_cluster
这个打包程序确保 MariaDB 服务器守护进程(
mysqld
)使用--wsrep-new-cluster
选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。注意mariadb
服务支持 systemd 方法来与多个 MariaDB 服务器进程进行交互。因此,在有多个 MariaDB 服务器运行的情况下,您可以通过将实例名称指定为后缀来引导特定的实例:# galera_new_cluster mariadb@node1
在每个节点上运行以下命令将其他节点连接到集群:
# systemctl start mariadb
因此,节点连接到集群,并将自己与集群的状态同步。
其它资源
7.2.9.4. 在 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.9.5. 重启 MariaDB Galera 集群
如果您同时关闭所有节点,需要停止集群,运行的集群不再存在。但是,集群的数据仍然存在。
要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。
如果集群没有启动,并且第一个节点上的 mysqld
只是通过 systemctl start mariadb
命令来启动的,那么节点会尝试连接到 /etc/my.cnf.d/galera.cnf
文件 wsrep_cluster_address
选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。
其它资源
7.2.10. 开发 MariaDB 客户端应用程序
红帽建议针对 MariaDB 客户端库开发 MariaDB 客户端应用程序。
针对 MariaDB 客户端库构建应用程序所需的开发文件和程序由 mariadb-connector-c-devel
软件包提供。
不使用直接库名称,而是使用 mariadb_config
程序,该程序在 mariadb-connector-c-devel
软件包中分发。此程序确保返回正确的构建标志。