外观
TiDB 升级验证指南
升级后基础验证
集群状态验证
bash
# 使用 TiUP 检查集群状态
tiup cluster display <cluster-name>
# 检查 PD 集群状态
pd-ctl -u http://<pd-ip>:2379 cluster
pd-ctl -u http://<pd-ip>:2379 member
# 检查 TiKV 集群状态
tikv-ctl --host <tikv-ip>:20160 status
# 检查 TiDB 连接
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT version();"
# 检查 TiFlash 状态
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT * FROM information_schema.tiflash_replica;"
# 检查 TiCDC 状态
tiup cdc cli capture list --server=http://<cdc-ip>:8300
tiup cdc cli changefeed list --server=http://<cdc-ip>:8300组件版本验证
bash
# 检查 TiDB 版本
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT tidb_version()\G"
# 检查 PD 版本
curl http://<pd-ip>:2379/pd/api/v1/version
# 检查 TiKV 版本
curl http://<tikv-ip>:20180/status | grep version
# 检查 TiFlash 版本
curl http://<tiflash-ip>:3930/status | grep version
# 检查监控组件版本
curl http://<monitoring-ip>:3000/api/health
curl http://<monitoring-ip>:9090/api/v1/status进程状态验证
bash
# 检查各节点进程状态
ssh <node-ip> "ps aux | grep tidb"
ssh <node-ip> "ps aux | grep tikv"
ssh <node-ip> "ps aux | grep pd"
ssh <node-ip> "ps aux | grep tiflash"
# 检查进程端口
ssh <node-ip> "netstat -tlnp | grep tidb"
ssh <node-ip> "netstat -tlnp | grep tikv"
ssh <node-ip> "netstat -tlnp | grep pd"功能验证
核心功能验证
sql
-- 验证基本 DDL 操作
CREATE DATABASE IF NOT EXISTS test_upgrade;
USE test_upgrade;
CREATE TABLE IF NOT EXISTS test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
value INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 验证基本 DML 操作
INSERT INTO test_table (name, value) VALUES ('test1', 100), ('test2', 200);
UPDATE test_table SET value = 300 WHERE name = 'test1';
DELETE FROM test_table WHERE name = 'test2';
SELECT * FROM test_table;
-- 验证索引功能
CREATE INDEX idx_value ON test_table(value);
SELECT * FROM test_table WHERE value > 200;
DROP INDEX idx_value ON test_table;
-- 验证事务功能
BEGIN;
INSERT INTO test_table (name, value) VALUES ('txn_test', 500);
SELECT * FROM test_table WHERE name = 'txn_test';
ROLLBACK;
SELECT * FROM test_table WHERE name = 'txn_test';
-- 验证存储过程和函数
DELIMITER //
CREATE PROCEDURE sp_test()
BEGIN
SELECT COUNT(*) FROM test_table;
END //
DELIMITER ;
CALL sp_test();
-- 验证视图功能
CREATE VIEW v_test AS SELECT id, name FROM test_table;
SELECT * FROM v_test;
DROP VIEW v_test;
-- 清理测试数据
DROP TABLE test_table;
DROP DATABASE test_upgrade;高级功能验证
sql
-- 验证分区表功能
CREATE DATABASE IF NOT EXISTS partition_test;
USE partition_test;
CREATE TABLE partitioned_table (
id INT PRIMARY KEY,
created_at DATETIME NOT NULL
) PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026)
);
INSERT INTO partitioned_table VALUES (1, '2023-01-01'), (2, '2024-01-01');
SELECT * FROM partitioned_table PARTITION (p2023);
DROP TABLE partitioned_table;
DROP DATABASE partition_test;
-- 验证窗口函数
USE test;
CREATE TABLE IF NOT EXISTS window_test (id INT, value INT);
INSERT INTO window_test VALUES (1, 10), (2, 20), (3, 30), (4, 40);
SELECT id, value, SUM(value) OVER (ORDER BY id) AS running_total FROM window_test;
DROP TABLE window_test;
-- 验证 CTE (Common Table Expressions)
WITH cte AS (
SELECT 1 AS id, 'test' AS name
UNION ALL
SELECT 2, 'test2'
) SELECT * FROM cte;TiFlash 功能验证
sql
-- 验证 TiFlash 副本创建
CREATE DATABASE IF NOT EXISTS tiflash_test;
USE tiflash_test;
CREATE TABLE tiflash_table (
id INT PRIMARY KEY,
name VARCHAR(255),
value INT
);
ALTER TABLE tiflash_table SET TIFLASH REPLICA 1;
-- 等待 TiFlash 副本同步
SELECT * FROM information_schema.tiflash_replica WHERE table_schema = 'tiflash_test' AND table_name = 'tiflash_table';
-- 验证 TiFlash 查询
INSERT INTO tiflash_table VALUES (1, 'a', 100), (2, 'b', 200), (3, 'c', 300);
SELECT /*+ READ_FROM_STORAGE(TIFLASH[tiflash_table]) */ * FROM tiflash_table;
SELECT /*+ READ_FROM_STORAGE(TIFLASH[tiflash_table]) */ SUM(value) FROM tiflash_table;
-- 清理测试数据
DROP TABLE tiflash_table;
DROP DATABASE tiflash_test;数据一致性验证
表数据校验
bash
# 使用 sync-diff-inspector 验证数据一致性
# 1. 准备配置文件
echo '{
"source": {
"host": "<source-tidb-ip>",
"port": 4000,
"user": "root",
"password": "",
"table_filter": ["test.*"]
},
"target": {
"host": "<target-tidb-ip>",
"port": 4000,
"user": "root",
"password": "",
"table_filter": ["test.*"]
},
"check_thread_count": 4,
"export_result": true
}' > config.json
# 2. 运行数据一致性检查
tiup sync-diff-inspector --config config.json索引一致性验证
sql
-- 检查索引完整性
mysql -h <tidb-ip> -P 4000 -u root -e "
SELECT table_schema, table_name, index_name
FROM information_schema.statistics
WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
"
-- 验证索引可用性
mysql -h <tidb-ip> -P 4000 -u root -e "
USE test;
EXPLAIN SELECT * FROM your_table WHERE indexed_column = 'value';
"事务一致性验证
bash
# 使用 go-tpc 进行事务一致性测试
tiup bench tpcc --warehouses 10 --threads 4 run -D test -h <tidb-ip> -P 4000 -u root性能验证
基准性能测试
bash
# 使用 Sysbench 进行 OLTP 性能测试
# 1. 准备测试数据
sysbench oltp_read_write --mysql-host=<tidb-ip> --mysql-port=4000 --mysql-user=root --mysql-db=test --tables=10 --table-size=1000000 prepare
# 2. 运行只读测试
sysbench oltp_read_only --mysql-host=<tidb-ip> --mysql-port=4000 --mysql-user=root --mysql-db=test --tables=10 --table-size=1000000 --threads=16 --time=60 run
# 3. 运行读写测试
sysbench oltp_read_write --mysql-host=<tidb-ip> --mysql-port=4000 --mysql-user=root --mysql-db=test --tables=10 --table-size=1000000 --threads=16 --time=60 run
# 4. 清理测试数据
sysbench oltp_read_write --mysql-host=<tidb-ip> --mysql-port=4000 --mysql-user=root --mysql-db=test --tables=10 cleanup关键性能指标监控
查询延迟
- 监控 TiDB Dashboard 中的查询延迟图表
- 关注 P95、P99 延迟是否在合理范围内
吞吐量
- 监控 QPS 和 TPS 指标
- 比较升级前后的吞吐量变化
资源利用率
- CPU 利用率:各组件节点的 CPU 使用情况
- 内存利用率:各组件的内存使用情况
- 磁盘 I/O:TiKV 节点的磁盘读写速率
- 网络流量:节点间的网络传输速率
TiKV 核心指标
- RocksDB 写入延迟
- Raft 快照发送速率
- Region 数量和分布
- 热点 Region 分布
慢查询分析
bash
# 查看慢查询日志
cat /tidb-deploy/tidb-<port>/logs/tidb-slow.log | head -100
# 使用 pt-query-digest 分析慢查询
pt-query-digest /tidb-deploy/tidb-<port>/logs/tidb-slow.log > slow_query_analysis.txt监控和告警验证
监控系统验证
bash
# 检查 Prometheus 目标状态
curl -s http://<monitoring-ip>:9090/api/v1/targets | jq .data.activeTargets
# 检查 Grafana 仪表盘
curl -I http://<monitoring-ip>:3000
curl -s -u admin:<password> http://<monitoring-ip>:3000/api/dashboards/home | jq .dashboard.id
# 检查 TiDB Dashboard 可用性
curl -I http://<tidb-ip>:2379/dashboard/告警规则验证
bash
# 查看 Prometheus 告警规则
curl -s http://<monitoring-ip>:9090/api/v1/rules | jq .data.groups
# 手动触发测试告警(可选)
# 1. 创建测试告警规则
cat > test_alert.yaml << EOF
groups:
- name: test-alerts
rules:
- alert: TestAlert
expr: vector(1)
for: 10s
labels:
severity: warning
annotations:
summary: "Test alert"
description: "This is a test alert"
EOF
# 2. 加载测试告警规则
# 将 test_alert.yaml 复制到 Prometheus 规则目录,然后重载配置
curl -X POST http://<monitoring-ip>:9090/-/reload
# 3. 检查告警状态
curl -s http://<monitoring-ip>:9090/api/v1/alerts | jq .data.alerts高可用性验证
故障转移测试
bash
# 模拟 PD 节点故障
ssh <pd-node-ip> "pkill pd-server"
tiup cluster display <cluster-name>
sleep 30
tiup cluster display <cluster-name>
# 恢复 PD 节点
tiup cluster start <cluster-name> -R pd
# 模拟 TiKV 节点故障
ssh <tikv-node-ip> "pkill tikv-server"
tiup cluster display <cluster-name>
sleep 60
tiup cluster display <cluster-name>
# 恢复 TiKV 节点
tiup cluster start <cluster-name> -R tikv
# 模拟 TiDB 节点故障
ssh <tidb-node-ip> "pkill tidb-server"
tiup cluster display <cluster-name>
# 验证其他 TiDB 节点仍可正常提供服务
mysql -h <other-tidb-ip> -P 4000 -u root -e "SELECT version();"
# 恢复 TiDB 节点
tiup cluster start <cluster-name> -R tidb数据可靠性验证
bash
# 验证数据持久性
mysql -h <tidb-ip> -P 4000 -u root -e "
CREATE DATABASE IF NOT EXISTS reliability_test;
USE reliability_test;
CREATE TABLE test_data (id INT PRIMARY KEY, data VARCHAR(255));
INSERT INTO test_data VALUES (1, 'persistent_data');
"
# 重启集群
tiup cluster restart <cluster-name>
# 验证数据仍然存在
mysql -h <tidb-ip> -P 4000 -u root -e "
USE reliability_test;
SELECT * FROM test_data;
DROP TABLE test_data;
DROP DATABASE reliability_test;
"兼容性验证
客户端兼容性
bash
# 验证不同 MySQL 客户端版本兼容性
mysql --version
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT version();"
# 验证 ORM 框架兼容性
# 示例:使用 Python MySQLdb 连接
python3 -c "
import MySQLdb
conn = MySQLdb.connect(host='<tidb-ip>', port=4000, user='root', db='test')
cursor = conn.cursor()
cursor.execute('SELECT 1')
print(cursor.fetchone())
cursor.close()
conn.close()
"应用程序兼容性
功能验证
- 运行应用程序的功能测试套件
- 验证核心业务流程正常运行
- 检查应用程序日志中的错误信息
性能验证
- 运行应用程序的性能测试
- 比较升级前后的响应时间
- 监控应用程序的资源利用率
回滚准备和验证
回滚计划验证
检查回滚所需资源
- 验证备份数据的完整性
- 检查回滚脚本的可用性
- 确认回滚时间窗口
预演回滚流程
- 在测试环境中演练回滚流程
- 记录回滚步骤和时间
- 验证回滚后的集群状态
关键数据备份验证
bash
# 验证全量备份数据
ls -lh /path/to/backup/
# 验证增量备份数据
ls -lh /path/to/incremental/backup/
# 验证日志备份
ls -lh /path/to/binlog/backup/验证报告生成
验证报告内容
基础信息
- 集群名称和版本
- 升级时间和持续时间
- 参与人员
验证结果摘要
- 集群状态:正常/异常
- 功能验证:通过/失败
- 性能验证:符合预期/需要优化
- 监控告警:正常/异常
详细验证结果
- 各验证项的具体结果
- 发现的问题和解决方案
- 建议和改进措施
附录
- 验证命令和输出
- 监控图表截图
- 慢查询分析报告
报告模板
markdown
# TiDB 升级验证报告
## 基本信息
- **集群名称**: cluster-name
- **升级前版本**: old-version
- **升级后版本**: new-version
- **升级时间**: start-time 至 end-time
- **验证时间**: verify-time
- **验证人员**: name
## 验证结果摘要
| 验证类别 | 结果 | 备注 |
|----------|------|------|
| 集群状态 | ✅ 正常 | 所有组件运行正常 |
| 功能验证 | ✅ 通过 | 核心功能和高级功能均正常 |
| 数据一致性 | ✅ 一致 | 未发现数据不一致问题 |
| 性能验证 | ✅ 符合预期 | 性能指标达到或超过升级前水平 |
| 监控告警 | ✅ 正常 | 监控系统运行正常,无异常告警 |
| 高可用性 | ✅ 正常 | 故障转移测试通过 |
## 详细验证结果
### 集群状态验证
- PD 集群:3/3 节点正常
- TiKV 集群:3/3 节点正常
- TiDB 集群:2/2 节点正常
- TiFlash 集群:1/1 节点正常
- 监控组件:正常
### 功能验证
- 基础功能:✅ 通过
- 高级功能:✅ 通过
- TiFlash 功能:✅ 通过
### 数据一致性验证
- 表数据:✅ 一致
- 索引数据:✅ 一致
- 事务一致性:✅ 正常
### 性能验证
- OLTP 只读性能:QPS = value,比升级前提升 percentage
- OLTP 读写性能:QPS = value,比升级前提升 percentage
- 延迟指标:P95 = valuems,P99 = valuems
### 监控和告警验证
- 监控系统:✅ 正常
- 告警规则:✅ 配置正确
- 告警通知:✅ 正常
## 发现的问题和解决方案
| 问题描述 | 严重程度 | 解决方案 | 状态 |
|----------|----------|----------|------|
| <问题描述> | <严重程度> | <解决方案> | ✅ 已解决 |
## 建议和改进措施
1. <建议1>
2. <建议2>
3. <建议3>
## 附录
- [验证命令和输出](附录1-验证命令和输出.md)
- [监控图表截图](附录2-监控图表截图/)
- [慢查询分析报告](附录3-慢查询分析报告.txt)常见问题(FAQ)
Q1: 升级后发现某个 TiKV 节点状态异常,如何处理?
A1: 可以按照以下步骤处理:
- 检查节点日志:
cat /tidb-deploy/tikv-[port]/logs/tikv.log | grep -i error - 检查节点资源利用率:
ssh [node-ip] "top -bn1" - 尝试重启节点:
tiup cluster restart [cluster-name] -R tikv -N [node-ip]:20160 - 如果重启失败,检查数据目录完整性,考虑替换节点
Q2: 升级后性能下降,如何排查?
A2: 性能下降的排查步骤:
- 检查监控指标,确定瓶颈所在(CPU、内存、磁盘 I/O、网络)
- 分析慢查询日志,找出性能差的 SQL
- 检查执行计划变化:
EXPLAIN ANALYZE [sql] - 检查配置参数是否被重置
- 对比升级前后的配置差异
- 考虑回滚或调整配置参数
Q3: 升级后出现数据不一致,如何处理?
A3: 数据不一致的处理方法:
- 使用 sync-diff-inspector 确认不一致的范围
- 从备份恢复不一致的数据
- 如果是小范围不一致,可以手动修正
- 分析不一致的原因,避免再次发生
- 考虑执行全量备份
Q4: 升级后监控系统无法访问,如何处理?
A4: 监控系统故障排查:
- 检查监控节点状态:
tiup cluster display [cluster-name] -R monitoring - 检查监控进程:
ssh [monitoring-ip] "ps aux | grep prometheus" - 检查端口是否开放:
ssh [monitoring-ip] "netstat -tlnp | grep 9090" - 检查防火墙规则:
ssh [monitoring-ip] "iptables -L" - 重启监控组件:
tiup cluster restart [cluster-name] -R monitoring
Q5: 升级后应用程序连接失败,如何处理?
A5: 应用连接问题排查:
- 检查 TiDB 节点状态:
tiup cluster display [cluster-name] -R tidb - 检查 TiDB 监听端口:
ssh [tidb-ip] "netstat -tlnp | grep 4000" - 验证直接连接:
mysql -h [tidb-ip] -P 4000 -u root - 检查应用程序配置:确认连接参数正确
- 检查 TiDB 日志中的连接错误:
cat /tidb-deploy/tidb-[port]/logs/tidb.log | grep -i connection
