TiDB 升级与升级后常见问题全面解析
前言
作为一款分布式数据库系统,TiDB 的版本升级是运维工作中的重要环节。本文将深入剖析 TiDB 升级过程中可能遇到的各类问题,并提供专业解决方案,帮助数据库管理员顺利完成版本迭代。
升级前的关键考量
滚动升级的影响评估
滚动升级是 TiDB 推荐的升级方式,但需要注意:
- 业务影响:升级过程中会对业务运行产生一定影响,建议避开业务高峰期执行升级操作
- 最小集群拓扑:为确保升级顺利进行,集群至少需要包含:
- 2 个 TiDB 实例
- 3 个 PD 实例
- 3 个 TiKV 实例
DDL 操作与升级的兼容性
根据升级前版本的不同,DDL 操作与升级的兼容性存在差异:
-
v7.1.0 以下版本:
- 存在正在执行的 DDL 语句时(如
ADD INDEX
或列类型变更等耗时操作),禁止升级 - 升级前建议使用
ADMIN SHOW DDL
检查运行中的 DDL 任务 - 升级过程中禁止执行新的 DDL 语句
- 存在正在执行的 DDL 语句时(如
-
v7.1.0 及以上版本:
- 升级过程中可以正常接收用户 DDL 任务
- 建议参考平滑升级方案进行操作
升级方式的专业建议
虽然 TiDB 支持 Binary 升级方式,但强烈建议使用 TiUP 工具进行升级,原因包括:
- 确保分布式系统各组件版本一致性
- 提供更好的兼容性保障
- 简化升级流程,降低操作风险
升级后的典型问题解析
JDBC 连接排序规则变更
问题现象:
从低版本升级到 v7.4+ 后,JDBC 连接的默认排序规则可能从 utf8mb4_bin
变为 utf8mb4_0900_ai_ci
。
解决方案: 在 JDBC URL 中明确指定排序规则:
connectionCollation=utf8mb4_bin
字符集相关 DDL 问题
案例一:字符集不匹配错误
错误信息:
unsupported modify column charset utf8mb4 not match origin utf8
原因分析: v2.1.0 及之前版本默认使用 UTF8 字符集,v2.1.1 开始改为 UTF8MB4。当表使用 UTF8 而尝试修改列时会报错。
解决方案:
- 显式指定列字符集与原始一致:
ALTER TABLE t CHANGE COLUMN a a VARCHAR(22) CHARACTER SET utf8;
- 通过 HTTP API 检查列的实际字符集:
curl "http://$IP:10080/schema/test/t" | python -m json.tool
案例二:字符集修改限制
错误信息:
unsupported modify charset from utf8mb4 to utf8
解决方案:
- 推荐将表字符集统一改为 UTF8MB4:
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4;
- 或保持列字符集不变:
ALTER TABLE t CHANGE COLUMN a a VARCHAR(20) CHARACTER SET utf8mb4;
案例三:UTF8 值校验错误
错误信息:
ERROR 1366 (HY000): incorrect utf8 value f09f8c80(🌀) for column a
版本差异:
- v2.1.1 及之前:不严格检查 4-byte UTF8 数据
- v2.1.2 及之后:添加严格检查
解决方案:
- v2.1.2 版本:
SET @@session.tidb_skip_utf8_check=1;
- v2.1.3+ 版本:
ALTER TABLE t CHANGE COLUMN a a VARCHAR(100) CHARACTER SET utf8mb4;
- 高级配置选项:
tidb_check_mb4_value_in_utf8
:控制是否检查 UTF8 中的 4-byte 值treat-old-version-utf8-as-utf8mb4
(v2.1.7+):自动将旧版 UTF8 视为 UTF8MB4
专业建议与最佳实践
-
升级前检查:
- 确认无长时间运行的 DDL 任务
- 备份重要数据
- 评估业务影响时间窗口
-
字符集规范:
- 新系统建议统一使用 UTF8MB4
- 旧系统升级时注意字符集兼容性
-
监控与验证:
- 升级后立即进行基本功能测试
- 监控系统性能指标变化
- 验证业务SQL执行情况
通过遵循本文指南,您可以有效规避 TiDB 升级过程中的常见问题,确保数据库系统平稳过渡到新版本。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考