Red Hat Training

A Red Hat training course is available for RHEL 8

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,请使用以下流程:

流程

  1. 通过从 mariadb 模块选择流(版本),并指定 server 配置文件来安装 MariaDB 服务器软件包。例如:

    # yum module install mariadb:10.3/server
  2. 启动 mariadb 服务:

    # systemctl start mariadb.service
  3. 启用 mariadb 服务,使其在引导时启动:

    # systemctl enable mariadb.service
  4. 推荐的 MariaDB 10.3: 要在安装 MariaDB 时提高安全性,请运行以下命令:

    $ mysql_secure_installation

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

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

      注意

      mysql_secure_installation 脚本在 MariaDB 10.5 或更高版本中不再有价值。安全性增强是自 MariaDB 10.5 以来的默认行为的一部分。

重要

由于 RPM 软件包有冲突,MariaDBMySQL 数据库服务器无法在 RHEL 8 中并行安装。在 RHEL 7 的红帽软件集合中可以并行安装组件。在 RHEL 8 中,可在容器中使用不同版本的数据库服务器。

7.2.2. 配置 MariaDB

要为联网配置 MariaDB 服务器,请使用以下流程:

流程

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

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

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

      • 0 - 监听所有客户端
      • 1 - 只监听本地客户端
    • port - MariaDB 监听 TCP/IP 连接的端口。
  2. 重启 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 文档。

流程

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

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

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem

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

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

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

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem

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

  5. 恢复 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)字段与服务器的主机名相匹配。

流程

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

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

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

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
    3. 可选:如果您运行 MariaDB 10.5.2 或更高版本,那么您可以拒绝未加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
    4. 可选:如果您运行 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。

  2. 重启 mariadb 服务:

    # systemctl restart mariadb

验证

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

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

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | have_ssl      | YES             |
    +---------------+-----------------+

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

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

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

7.2.3.3. 对特定的用户帐户需要 TLS 加密连接

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

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

先决条件

  • MariaDB 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。
  • 客户端信任签发服务器证书的 CA 证书。

流程

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

    # mysql -u root -p -h server.example.com

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

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

    MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;

验证

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

    # mysql -u example -p -h server.example.com --ssl
    ...
    MariaDB [(none)]>

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

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

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

    服务器拒绝登录尝试,因为此用户需要 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 证书已被复制到客户端。

流程

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

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

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

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

      # update-ca-trust
  2. 使用以下内容创建 /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 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

要使用 Mariabackup 创建数据库备份,请使用以下流程:

流程

  • 要在在命令行上提供凭证的同时创建备份,请运行:

    $ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>

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

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

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

    1. /etc/my.cnf.d/ 目录中创建配置文件,例如 /etc/my.cnf.d/mariabackup.cnf
    2. 将以下行添加到新文件的 [xtrabackup][mysqld] 部分中:

      [xtrabackup]
      user=myuser
      password=mypassword
    3. 执行备份:

      $ mariabackup --backup --target-dir <backup_directory>
重要

mariabackup 不读取配置文件 [mariadb] 部分中的选项。如果在 MariaDB 服务器上指定了非默认数据目录,那么您必须在配置文件的 [xtrabackup][mysqld] 部分中指定此目录,以便 Mariabackup 能够找到数据目录。

要指定非默认数据目录,请在 MariaDB 配置文件的 [xtrabackup][mysqld] 部分中包含以下行:

datadir=/var/mycustomdatadir

7.2.5.3. 使用 Mariabackup 工具恢复数据

备份完成后,您可以使用 mariabackup 命令及以下一个选项来从备份中恢复数据:

  • --copy-back 允许您保存原始的备份文件。
  • --move-back 将备份文件移到数据目录中,并删除原始的备份文件。

要使用 Mariabackup 工具来恢复数据,请使用以下流程:

先决条件

  • 验证 mariadb 服务是否没有运行:

    # systemctl stop mariadb.service
  • 验证数据目录是否为空。
  • Mariabackup 的用户必须具有 RELOADLOCK TABLESREPLICATION CLIENT 特权。

流程

  1. 运行 mariabackup 命令:

    • 要恢复数据并保留原始备份文件,请使用 --copy-back 选项:

      $ mariabackup --copy-back --target-dir=/var/mariadb/backup/
    • 要恢复数据并删除原始备份文件,请使用 --move-back 选项:

      $ mariabackup --move-back --target-dir=/var/mariadb/backup/
  2. 修复文件权限。

    恢复数据库时,Mariabackup 会保留备份的文件和目录特权。但是,Mariabackup 以恢复数据库的用户和组的身份将文件写入磁盘。恢复备份后,您可能需要调整数据目录的所有者,以匹配 MariaDB 服务器的用户和组,通常两者都为 mysql

    例如,要递归地将文件的所有权改为 mysql 用户和组:

    # chown -R mysql:mysql /var/lib/mysql/
  3. 启动 mariadb 服务:

    # systemctl start mariadb.service

7.2.5.4. 执行文件系统备份

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

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

流程

  1. 停止 mariadb 服务:

    # systemctl stop mariadb.service
  2. 将数据文件复制到所需位置:

    # cp -r /var/lib/mysql /backup-location
  3. (可选)将配置文件复制到所需位置:

    # cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
  4. (可选)将日志文件复制到所需位置:

    # cp /var/log/mariadb/* /backup-location/logs
  5. 启动 mariadb 服务:

    # systemctl start mariadb.service
  6. 将备份位置的备份数据加载到 /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.3MariaDB 10.5MySQL 8.0

这部分描述了从 RHEL 7 或 MariaDB 的红帽软件集合版本迁移到 MariaDB 10.3。如果要在 RHEL 8 上从 MariaDB 10.3 迁移到 MariaDB 10.5,请参阅 从 MariaDB 10.3 升级到 MariaDB 10.5

7.2.6.1. RHEL 7 和 RHEL 8 版本的 MariaDB 之间的显著区别

MariaDB 5.5MariaDB 10.3 之间的最重要的变化如下:

  • MariaDB Galera 集群 是同步的多源集群,自 10.1 起就是 MariaDB 的标准部分。
  • 默认情况下不再启用 ARCHIVE 存储引擎,插件需要专门启用。
  • 默认情况下不再启用 BLACKHOLE 存储引擎,插件需要专门启用。
  • InnoDB 而不是 XtraDB 被用作默认存储引擎,后者用于 MariaDB 10.1 及更早的版本。

    如需了解更多详细信息,请参阅 MariaDB 10.2 为什么使用 InnoDB 而不是 XtraDB?

  • 新的 mariadb-connector-c 软件包为 MySQL 和 MariaDB 提供通用客户端库。这个程序库可用于 MySQLMariaDB 数据库服务器的任何版本。因此,用户可以将应用程序的一个构建连接到 Red Hat Enterprise Linux 8 发布的任何 MySQL 和 MariaDB 服务器。

要从 MariaDB 5.5 迁移到 MariaDB 10.3,您需要执行多个配置更改,如 迁移到 MariaDB 中所述。

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 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 数据库中的所有数据。

流程

  1. 确保 RHEL 8 系统上安装了 mariadb-server 软件包:

    # yum install mariadb-server
  2. 确保 mariadb 服务在复制数据时没有在源和目标系统上运行:

    # systemctl stop mariadb.service
  3. 将源位置的数据复制到 RHEL 8 目标系统上的 /var/lib/mysql/ 目录。
  4. 对目标系统上复制的文件设置适当的权限和 SELinux 上下文:

    # restorecon -vr /var/lib/mysql
  5. 在目标系统中启动 MariaDB 服务器:

    # systemctl start mariadb.service
  6. 运行 mysql_upgrade 命令来检查和修复内部表:

    $ mysql_upgrade
  7. 升级完成后,验证 /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.3MariaDB 10.5 之间的显著变化包括:

  • MariaDB 现在默认使用 unix_socket 身份验证插件。该插件允许用户在通过本地 UNIX 套接字文件连接到 MariaDB 时使用操作系统凭证。
  • MariaDB 添加了以 mariadb-* 命名的二进制代码,mysql* 符号链接指向 mariadb-* 的二进制代码。例如,mysqladminmysqlaccessmysqlshow 分别指向 mariadb-adminmariadb-accessmariadb-show 二进制代码。
  • SUPER 特权已被分成几个特权,以更好地与每个用户角色保持一致。因此,某些语句已更改了所需的权限。
  • 在并行 复制中,slave_parallel_mode 现在被默认设置为 静态
  • InnoDB 存储引擎 中,以下变量的默认值已发生变化:innodb_adaptive_hash_index 变为 OFFinnodb_checksum_algorithm 变为 full_crc32
  • MariaDB 现在使用用于管理 MariaDB 命令历史记录(the .mysql_history 文件)的底层软件的 libedit 实施,而不是之前使用的 readline 库。此更改会影响直接使用 .mysql_history 文件的用户。注意 .mysql_history 是一个由 MariaDBMySQL 应用管理的文件,用户不应直接使用该文件。人类可读的外表是巧合。

    注意

    要提高安全性,您可以考虑不维护历史记录文件。禁用记录命令历史记录:

    1. 删除 .mysql_history 文件(如果存在的话)。
    2. 使用以下任一方法:

      • 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 服务器一起安装 。要在 MariaDB 10.5 中提供 PAM 身份验证插件,请手动安装 mariadb-pam 软件包。

7.2.7.2. 从 MariaDB 10.3 的 RHEL 8 版本升级到 MariaDB 10.5

此流程描述了使用 yummariadb-upgrade工具从 mariadb:10.3 模块流升级到 mariadb:10.5 模块流。

mariadb-upgrade 实用程序由 mariadb-server-utils 子软件包提供,该子软件包作为 mariadb-server 软件包的依赖项安装。

先决条件

  • 在执行升级前,备份存储在 MariaDB 数据库中的所有数据。

流程

  1. 停止 MariaDB 服务器:

    # systemctl stop mariadb.service
  2. 执行以下命令,以确定您的系统是否已准备好切换到更新的流:

    # yum distro-sync

    这个命令必须以以下信息结束:Nothing to doComplete!如需更多信息,请参阅 切换到更新的流

  3. 重置系统上的 mariadb 模块:

    # yum module reset mariadb
  4. 启用新的 mariadb:10.5 模块流:

    # yum module enable mariadb:10.5
  5. 同步安装的软件包以在流间进行更改:

    # yum distro-sync

    这将更新所有已安装的 MariaDB 软件包。

  6. 调整配置,以便位于 /etc/my.cnf.d/ 中的选项文件只包含对 MariaDB 10.5 有效的选项。详情请参阅 MariaDB 10.4MariaDB 10.5 的上游文档。
  7. 启动 MariaDB 服务器。

    • 在升级独立运行的数据库时:

      # systemctl start mariadb.service
    • 在升级 Galera 集群节点时:

      # galera_new_cluster

      mariadb 服务将自动启动。

  8. 执行 mariadb-upgrade 工具来检查和修复内部表。

    • 在升级独立运行的数据库时:

      # mariadb-upgrade
    • 在升级 Galera 集群节点时:

      # mariadb-upgrade --skip-write-binlog
重要

有一些与原位升级相关的风险和已知问题。例如,一些查询可能无法正常工作,或者它们会以与升级前不同的顺序运行。有关这些风险和问题的更多信息,以及有关原位升级的通用信息,请参阅 MariaDB 10.5 发行注记

7.2.8. 使用 Galera 复制 MariaDB

这部分描述了如何在 Red Hat Enterprise Linux 8 上使用 Galera 解决方案复制 MariaDB 数据库。

7.2.8.1. MariaDB Galera 集群介绍

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

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

MariaDB Galera 集群 的主要特性是 :

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

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

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

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

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

7.2.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 8 中的 MariaDB 10.3 和 MariaDB10.5 分别包含 garbd systemd 服务的红帽版本和 galera 软件包的打包程序脚本,分别位于 /usr/lib/systemd/system/garbd.service/usr/sbin/garbd-wrapper 文件中。从 RHEL 8.6 开始,MariaDB 10.3 和 MariaDB 10.5 现在也提供位于 /usr/share/doc/galera/garb-systemd/usr/share/doc/galera/garbd.service 的这些文件的上游版本。

7.2.8.3. 部署 MariaDB Galera 集群

先决条件

  • 通过从 mariadb 模块选择流(版本),并指定 galera 配置文件来安装 MariaDB Galera 集群 软件包。例如:

    # yum module install mariadb:10.3/galera

    因此,会安装以下软件包:

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

      mariadb-server-galera 软件包将 mariadb-servergalera 软件包作为其依赖项。

      有关需要安装哪些软件包来构建 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 集群地址

流程

  1. 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:

    # galera_new_cluster

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

    注意

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

    # galera_new_cluster mariadb@node1
  2. 在每个节点上运行以下命令将其他节点连接到集群:

    # systemctl start mariadb

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

7.2.8.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.8.5. 重启 MariaDB Galera 集群

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

要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。

警告

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

7.2.9. 开发 MariaDB 客户端应用程序

红帽建议针对 MariaDB 客户端库开发 MariaDB 客户端应用程序。

针对 MariaDB 客户端库构建应用程序所需的开发文件和程序由 mariadb-connector-c-devel 软件包提供。

不使用直接库名称,而是使用 mariadb_config 程序,该程序在 mariadb-connector-c-devel 软件包中分发。此程序确保返回正确的构建标志。