Skip to content

MariaDB 升级步骤

升级步骤概述

MariaDB 版本升级是一个系统的过程,需要严格按照流程执行,确保升级过程的顺利进行和数据安全。升级步骤分为三个主要阶段:

  1. 准备阶段:完成升级前的所有准备工作
  2. 执行阶段:实际执行升级操作
  3. 验证阶段:验证升级结果和系统稳定性

1. 准备阶段

1.1 最后一次备份

在开始升级前,执行最后一次全量备份和二进制日志备份:

bash
# 使用 xtrabackup 进行全量备份
xtrabackup --backup --target-dir=/backup/mariadb-full-$(date +%Y%m%d_%H%M%S)

# 备份当前二进制日志
mysql -u root -p -e "FLUSH LOGS;"
mysqlbinlog --read-from-remote-server --raw --stop-never --host=localhost --user=root --password=password mysql-bin.$(mysql -u root -p -e "SHOW MASTER STATUS\G" | grep File | awk '{print $2}' | sed 's/mysql-bin.//')

1.2 停止应用服务

通知业务团队停止相关应用服务,避免升级过程中数据不一致:

bash
# 停止应用服务示例(根据实际情况调整)
systemctl stop app-service

1.3 停止复制服务(主从架构)

如果是主从架构,需要停止从库的复制服务:

sql
-- 在所有从库上执行
STOP SLAVE;

1.4 关闭 MariaDB 服务

bash
systemctl stop mariadb

2. 执行阶段

2.1 升级方式选择

根据实际情况选择合适的升级方式:

方式一:包管理器升级(推荐)

适用于使用包管理器安装的 MariaDB,如 apt、yum 等。

方式二:二进制文件升级

适用于使用二进制文件手动安装的 MariaDB。

方式三:源码编译升级

适用于需要自定义编译选项的场景。

2.2 包管理器升级步骤(以 CentOS 为例)

2.2.1 配置目标版本的 YUM 源

bash
# 创建 MariaDB 10.5 YUM 源文件
cat > /etc/yum.repos.d/MariaDB-10.5.repo << EOF
[mariadb]
name = MariaDB 10.5 CentOS repository
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

2.2.2 清理 YUM 缓存

bash
yum clean all
yum makecache

2.2.3 执行升级

bash
yum upgrade MariaDB-server MariaDB-client -y

2.3 二进制文件升级步骤

2.3.1 下载目标版本的二进制文件

bash
wget https://downloads.mariadb.org/interstitial/mariadb-10.5.22/bintar-linux-systemd-x86_64/mariadb-10.5.22-linux-systemd-x86_64.tar.gz

2.3.2 解压二进制文件

bash
tar -zxvf mariadb-10.5.22-linux-systemd-x86_64.tar.gz -C /usr/local/

2.3.3 更新符号链接

bash
rm -f /usr/local/mysql
ln -s /usr/local/mariadb-10.5.22-linux-systemd-x86_64 /usr/local/mysql

2.3.4 复制配置文件

bash
cp /etc/my.cnf /etc/my.cnf.bak
# 如果需要,更新配置文件中的路径和参数

2.4 启动 MariaDB 服务

bash
systemctl start mariadb

2.5 执行 mysql_upgrade 命令

mysql_upgrade 命令用于升级系统表结构和检查数据兼容性:

bash
mysql_upgrade -u root -p

输出说明

  • OK:表结构已经是最新的
  • note:提示信息,不需要处理
  • error:错误信息,需要处理

2.6 重启 MariaDB 服务

bash
systemctl restart mariadb

3. 验证阶段

3.1 基本状态验证

bash
# 检查 MariaDB 服务状态
systemctl status mariadb

# 检查 MariaDB 版本
mysql -u root -p -e "SELECT VERSION();"

# 检查系统表状态
mysql -u root -p -e "SHOW DATABASES;"
mysql -u root -p -e "USE mysql; SHOW TABLES;"

3.2 数据完整性验证

bash
# 使用 mysqlcheck 检查表完整性
mysqlcheck -u root -p --check --all-databases

# 验证关键表的数据
mysql -u root -p -e "SELECT COUNT(*) FROM db_name.table_name;"

3.3 主从复制验证(主从架构)

sql
-- 在主库上执行
SHOW MASTER STATUS;

-- 在从库上执行
START SLAVE;
SHOW SLAVE STATUS\G;

验证 Slave_IO_RunningSlave_SQL_Running 都为 YesSeconds_Behind_Master0

3.4 应用兼容性验证

启动应用服务,验证应用与数据库的兼容性:

bash
# 启动应用服务
systemctl start app-service

# 验证应用日志
tail -f /var/log/app-service.log

3.5 性能验证

执行性能测试,验证升级后系统性能:

bash
# 使用 sysbench 进行性能测试
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=test --table-size=1000000 --threads=16 --events=100000 --time=60 oltp_read_write run

4. 特殊场景处理

4.1 主从架构升级

主从架构的升级顺序:

  1. 先升级所有从库
  2. 最后升级主库
  3. 升级完成后,重新建立复制关系

4.2 Galera Cluster 升级

Galera Cluster 的升级步骤:

  1. 滚动升级:逐个节点升级,避免整个集群不可用
  2. 节点隔离:将节点从集群中隔离
  3. 升级节点:执行升级操作
  4. 节点重新加入:将升级后的节点重新加入集群
  5. 验证集群状态:使用 SHOW STATUS LIKE 'wsrep%' 验证集群状态

4.3 大版本升级

大版本升级(如从 10.3 升级到 10.5)的注意事项:

  • 必须按照版本顺序升级,不能跳过中间版本
  • 每个版本升级后都需要执行 mysql_upgrade
  • 详细阅读每个版本的升级说明

5. 升级后优化

5.1 更新统计信息

sql
-- 更新所有表的统计信息
ANALYZE TABLE db_name.table_name;

-- 或者使用 mysqlcheck
mysqlcheck -u root -p --analyze --all-databases

5.2 优化配置参数

根据目标版本的新特性和最佳实践,优化配置参数:

ini
# 示例:启用并行复制
slave_parallel_threads = 4
slave_parallel_mode = optimistic

5.3 清理备份文件

根据备份策略,清理过期的备份文件:

bash
# 删除 7 天前的备份文件
find /backup -name "mariadb-full-*" -mtime +7 -delete

6. 回滚操作

如果升级过程中出现严重错误,需要执行回滚操作:

6.1 回滚条件

  • 升级过程中出现不可修复的错误
  • 升级后系统性能严重下降
  • 应用与数据库兼容性问题无法解决

6.2 回滚步骤

  1. 停止 MariaDB 服务

    bash
    systemctl stop mariadb
  2. 恢复数据

    bash
    # 使用 xtrabackup 恢复数据
    xtrabackup --prepare --target-dir=/backup/latest-full-backup
    xtrabackup --copy-back --target-dir=/backup/latest-full-backup
    chown -R mysql:mysql /var/lib/mysql
  3. 恢复配置文件

    bash
    cp /etc/my.cnf.bak /etc/my.cnf
  4. 启动 MariaDB 服务

    bash
    systemctl start mariadb
  5. 恢复复制关系(主从架构):

    sql
    -- 在从库上执行
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxxxxx', MASTER_LOG_POS=xxxx;
    START SLAVE;
  6. 启动应用服务

    bash
    systemctl start app-service
  7. 验证回滚结果

    bash
    mysql -u root -p -e "SELECT VERSION();"

7. 常见问题处理

7.1 mysql_upgrade 失败

问题现象

mysql_upgrade: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) while connecting to the MySQL server

解决方法

  • 检查用户名和密码是否正确
  • 检查 root 用户的权限
  • 尝试使用 --force 参数强制执行

7.2 服务启动失败

问题现象

Job for mariadb.service failed because the control process exited with error code.

解决方法

  • 查看错误日志:tail -f /var/log/mariadb/mariadb.log
  • 检查配置文件:mysqld --validate-config
  • 检查数据目录权限:ls -la /var/lib/mysql

7.3 复制启动失败

问题现象

Slave_IO_Running: No
Slave_SQL_Running: Yes

解决方法

  • 检查主库地址、用户名、密码是否正确
  • 检查网络连接
  • 检查主库二进制日志文件和位置是否正确

8. 最佳实践

  1. 测试环境验证:在测试环境中完整测试升级流程
  2. 自动化脚本:使用自动化脚本执行升级操作,减少人为错误
  3. 详细记录:记录升级过程中的所有操作和输出
  4. 逐步升级:大版本升级时,逐步升级,避免跳过中间版本
  5. 监控系统:升级过程中开启实时监控,及时发现问题
  6. 回滚准备:确保回滚方案可行,备份文件可用

9. 常见问题(FAQ)

问:升级过程中需要多长时间?

答:升级时间取决于数据库大小、服务器性能和升级方式。一般来说:

  • 小数据库(< 10GB):30 分钟 - 1 小时
  • 中等数据库(10GB - 100GB):1 - 3 小时
  • 大数据库(> 100GB):3 小时以上

问:mysql_upgrade 命令的作用是什么?

答:mysql_upgrade 命令的主要作用是:

  1. 升级系统表结构到最新版本
  2. 检查用户表的兼容性
  3. 更新系统表的统计信息
  4. 修复可能存在的表结构问题

问:升级后需要重新编译应用程序吗?

答:一般不需要重新编译应用程序,但需要验证应用与数据库的兼容性。如果应用使用了特定版本的 MariaDB 客户端库,可能需要更新客户端库。

问:如何处理升级后出现的慢查询?

答:

  1. 更新统计信息:ANALYZE TABLE table_name;
  2. 检查执行计划:EXPLAIN SELECT * FROM table_name WHERE condition;
  3. 优化索引:添加或修改索引
  4. 调整配置参数:如 innodb_buffer_pool_size、query_cache_size 等

问:升级后需要重启应用服务吗?

答:是的,升级完成后需要重启应用服务,确保应用与新版本的数据库正常通信。

10. 总结

MariaDB 版本升级是一项复杂的系统工程,需要严格按照流程执行,确保升级过程的顺利进行和数据安全。升级步骤包括准备阶段、执行阶段和验证阶段,每个阶段都有详细的操作步骤和注意事项。

在升级过程中,需要注意:

  • 充分的备份策略
  • 详细的回滚方案
  • 严格的验证步骤
  • 及时的监控和问题处理

通过遵循最佳实践和详细的升级步骤,可以降低升级风险,减少业务中断时间,确保升级后系统的稳定运行。