第一部分:考试信息
1.1 考试概况
| 项目 |
详情 |
| 认证全称 |
PingCAP Certified TiDB Associate(平凯数据库认证 TiDB 数据库专员) |
| 考试形式 |
在线监考,全程视频 |
| 题目数量 |
50 道选择题 |
| 题型分布 |
前半部分单选题,后半部分多选题 |
| 考试时长 |
60 分钟 |
| 满分/合格 |
100 分 / 60 分及格 |
| 报名费用 |
699 元或 1599 积分 |
| 报考条件 |
无门槛,任何人均可参加 |
1.2 考试范围三大模块
┌──────────────────────────────────────────────────┐
│ PCTA 考试知识体系 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌────────┐ │
│ │ 架构原理 │ │ 安装部署 │ │ 周边工具│ │
│ │ (40%) │ │ (30%) │ │ (30%) │ │
│ ├──────────────┤ ├──────────────┤ ├────────┤ │
│ │• 核心组件 │ │• TiUP 部署 │ │• Dumpling│ │
│ │• Region 分裂 │ │• 集群管理 │ │• Lightning│ │
│ │• Raft 共识 │ │• 扩缩容 │ │• DM │ │
│ │• 事务模型 │ │• 配置参数 │ │• BR 备份 │ │
│ │• MVCC │ │• 升级回滚 │ │• CDC │ │
│ │• 存储引擎 │ │• 运维监控 │ │• sync-diff│ │
│ └──────────────┘ └──────────────┘ └────────┘ │
└──────────────────────────────────────────────────┘
1.3 备考建议
- 官方课程:https://learn.pingcap.com/learner/course(视频课后练习题必做,考试有原题)
- 官方文档:https://docs.pingcap.com/zh/tidb/stable(视频外的补充,理解前因后果)
- AskTUG 论坛:https://asktug.com(搜索疑难问题)
- 动手实操:搭建 TiDB Playground 环境实际操作
第二部分:TiDB 架构原理
2.1 整体架构
TiDB 采用纯分布式架构,将系统拆分为多个模块,各模块互相通信组成完整集群:
┌──────────────┐
│ 客户端 │
└──────┬───────┘
│ MySQL 5.7 协议
┌──────▼───────┐
│ 负载均衡 │
│ HAProxy 等 │
└──────┬───────┘
│
┌─────────────┼─────────────┐
│ │ │
┌──────▼──────┐ │ ┌──────▼──────┐
│ TiDB Server │─────┼─────▶│ TiDB Server │ ×N (无状态)
└──┬───────┬──┘ │ └─────────────┘
│ │ │
┌──────▼──┐ │ │
│ PD │ │ │
│ ≥3 节点│ │ │
└─────────┘ │ │
┌──────▼────────▼──────┐
│ │
┌─────▼──────┐ ┌──────▼──────┐
│ TiKV │ │ TiFlash │
│ (行存) │ │ (列存) │
│ ×N 节点 │ │ ×N 节点 │
│ Region │ │ Raft Learner│
│ Multi-Raft│ │ OLAP │
└───────────┘ └─────────────┘
2.2 五大核心优势
| 优势 |
说明 |
| 弹性扩缩容 |
增减节点无需停机,TiDB 无状态、TiKV 自动迁移 Region |
| MySQL 兼容 |
兼容 MySQL 5.7 协议与语法,多数场景可直接替换 |
| 默认高可用 |
Multi-Raft 多副本,自动容灾切换 |
| ACID 事务 |
分布式事务,支持 Snapshot Isolation 隔离级别 |
| HTAP 能力 |
行存 TiKV (OLTP) + 列存 TiFlash (OLAP) 实时同步 |
2.3 三层架构核心职责
| 层级 |
组件 |
职责 |
特性 |
| SQL 层 |
TiDB Server |
接收连接、SQL 解析/优化、分布式执行计划生成、KV 转换、DDL、GC |
无状态,可水平扩展 |
| 调度层 |
PD |
元数据管理、TSO 生成、事务 ID 分配、Region 调度、Dashboard |
集成 etcd,至少 3 节点 |
| 存储层 |
TiKV / TiFlash |
数据持久化存储、分布式事务、Raft 共识、MVCC |
多副本,Region 分片 |
第三部分:核心组件详解
3.1 TiDB Server
3.1.1 核心特性
- 无状态:不存储任何数据,支持水平扩展
- 开发语言:Go
- 协议兼容:兼容 MySQL 5.7
- 可替换 MySQL:多数场景下,应用只需修改连接地址
3.1.2 七大功能
┌─────────────────────────────────────────┐
│ TiDB Server 七大功能 │
├─────────────────────────────────────────┤
│ 1. 处理客户端连接 │
│ 2. SQL 解析和编译 │
│ 3. 关系型数据 ↔ KV 双向转换 │
│ 4. SQL 执行 │
│ 5. Online DDL(不阻塞读写) │
│ 6. GC(垃圾回收,清理 MVCC 历史版本) │
│ 7. 热点小表缓存(v6.0+) │
└─────────────────────────────────────────┘
3.1.3 SQL 处理流程
客户端 SQL
│
▼
┌──────────────┐
│ Protocol Layer │ ── 同时异步向 PD 请求 TSO
└──────┬───────┘
▼
┌──────────────┐
│ Parser │ ── 词法/语法解析 → AST
└──────┬───────┘
▼
┌──────────────┐
│ Optimizer │ ── CBO 代价优化 → 分布式执行计划
└──────┬───────┘
▼
┌──────────────┐
│ Executor │ ── KV 转换 + 下推计算
└──────┬───────┘
▼
TiKV / TiFlash(实际数据存储)
3.1.4 DDL 执行机制
- Online DDL:DDL 不阻塞读写
- Owner 模式:同一时刻整个集群只能有一个 TiDB Server(Owner 角色)执行 DDL
- 非 Owner 节点收到 DDL → 持久化到 TiKV 的 job queue → Owner 的 workers 获取执行
- Add Index 有独立队列,可与 job queue 并行执行
- 执行完成后通过 Schema Load 通知所有 TiDB Server
3.1.5 GC(垃圾回收)机制
- 默认每 10 分钟触发一次
- 删除 safe point 之前的 MVCC 历史版本数据
- safe point 由 PD 维护,等于当前 TSO 减去
tidb_gc_life_time(默认 10min)
3.1.6 热点小表缓存(v6.0+)
| 项目 |
说明 |
| 条件 |
表数据 ≤ 64MB |
| 开启 |
ALTER TABLE users CACHE; |
| 租约 |
tidb_table_cache_lease = 5s(默认) |
| 租约内 |
只读,不能写 |
| 租约到期 |
写操作写入 TiKV,读从 TiKV 读取 |
| 限制 |
不支持对缓存表直接做 DDL |
3.1.7 表类型与 KV 映射
| 类型 |
特点 |
KV 映射 |
| 聚簇表 |
必须有主键,数据按主键组织 |
主键即 Key |
| 非聚簇表 |
有无主键均可 |
额外生成隐藏 RowID 作为 Key |
3.2 PD(Placement Driver)
3.2.1 底层架构
- 集成 etcd,用于元数据存储
- 至少 3 个节点,建议部署奇数个
- PD 自身也是通过 Raft 实现高可用
3.2.2 六大核心功能
┌─────────────────────────────────────────┐
│ PD 六大功能 │
├─────────────────────────────────────────┤
│ 1. 集群元数据存储 │
│ → 记录数据在哪些 TiKV / TiFlash 上 │
│ │
│ 2. 分配全局 ID 和事务 ID │
│ │
│ 3. 生成全局时间戳 TSO │
│ → 只能从 PD Leader 获取 │
│ │
│ 4. Region 调度 │
│ → 平衡存储和 Leader 分布 │
│ │
│ 5. Label 标签 │
│ → 拓扑感知调度(机房/机架/主机) │
│ │
│ 6. TiDB Dashboard │
└─────────────────────────────────────────┘
3.2.3 TSO(全局时间戳)
- 格式:
TSO = physical time + logical time
- 类型:int64
- 特性:保证单调递增,但不保证连续
- 来源:只能从 PD 的 Leader 节点获取
- 用途:为分布式事务提供全局有序的时间基准
3.2.4 Label 机制
- 需要在 PD 和 TiKV 上同时配置
- 支持多级标签:
zone → host → dc → rack 等
- 实现拓扑感知调度(跨机房容灾、就近读取)
3.3 TiKV
3.3.1 架构组成
TiKV = Transaction + MVCC + Raft + RocksDB
事务支持 多版本 共识 存储引擎
- 包含 两个 RocksDB 实例:
rocksdb raft:存储 Raft 日志
rocksdb kv:存储实际用户数据
3.3.2 RocksDB 持久化流程
写入请求
│
▼
┌──────────────┐
│ WAL 文件 │ ── 先写磁盘(sync_log=true 确保落盘)
└──────┬───────┘
▼
┌──────────────┐
│ MemTable │ ── 内存表(写缓冲)
└──────┬───────┘
▼ (满了)
┌──────────────┐
│ Immutable │ ── 只读内存表
│ MemTable │
└──────┬───────┘
▼ (异步落盘)
┌──────────────┐
│ SST 文件 │ ── 分层存储(Level 0~N)
└──────────────┘
- 流控机制:MemTable 写入速度远大于落盘速度时,自动降低客户端写入速度
3.3.3 Column Families(列簇)
三个列簇共享一份 WAL,各有独立的 MemTable 和 SST:
| 列簇 |
用途 |
| Default |
存储长度 ≥ 255 字节的用户数据 |
| Write |
存储长度 < 255 字节的用户数据 + 事务元信息 |
| Lock |
存储锁信息 |
3.3.4 Coprocessor(协处理器)
- 核心思想:移动计算不移动数据
- 将计算下推到 TiKV 节点执行
- 减少网络传输量,提升查询性能
3.3.5 写入涉及的线程池
| 线程池/模块 |
职责 |
| Scheduler |
接收并发请求,通过 latch 解决同一 key 写入冲突 |
| Raftstore |
持久化 Raft 日志,向其他节点同步 |
| Apply |
从 rocksdb raft 读取日志,写入 rocksdb kv |
3.4 TiFlash
3.4.1 定位
- TiKV 的列存版本
- 承载 OLAP 业务(QPS < 50)
- 兼容 TiDB Server 和 TiSpark
3.4.2 数据复制
- 使用 Raft Learner 角色与 TiKV 复制
- Learner 不参与投票和选举,对线上业务影响小
- Region 与 TiKV 完全对应,同步分裂与合并
3.4.3 核心功能
- 异步复制:基于主键快速更新
- 一致性读取:存储多个时间戳版本,按读取时间筛选
- 引擎智能选择:CBO 自动选择 TiKV/TiFlash,甚至可混合使用
- MPP 查询:多节点并行计算
3.4.4 MPP 执行流程
过滤(各 TiFlash 并行)
│
▼
数据交换(将关联表交换到同一节点)
│
▼
表连接(并行,仅等值连接)
│
▼
数据交换(聚合数据交换到同一节点)
│
▼
聚合(并行)
重要:MPP 只支持等值连接,所有计算在 TiFlash 内存中完成
第四部分:关键机制深入
4.1 Region 机制
4.1.1 Region 基本属性
| 属性 |
值 |
| Region 大小范围 |
96MB ~ 144MB |
| 默认副本数 |
3 副本(1 Leader + 2 Follower) |
| 分区方式 |
Key Range,左闭右开 [StartKey, EndKey) |
4.1.2 分裂与合并
数据增长
│
▼
Region 达到 96MB → 不再插入新数据(仍可修改已有数据)
│
▼
继续修改 → Region 在 96MB~144MB 波动
│
▼
超过 144MB → 触发分裂 → 一分为二
│
▼
各副本同步分裂
4.1.3 PD 调度职责
PD 负责以下调度操作:
| 调度类型 |
说明 |
| Region 分裂 |
数据量超阈值时分裂 |
| Region 合并 |
数据删除后合并 |
| Region 迁移 |
节点间数据均衡 |
| Leader 迁移 |
读写负载均衡 |
4.2 Raft 共识机制
4.2.1 Multi-Raft 架构
集群中有成千上万个 Region
每个 Region + 其副本 = 一个 Raft Group
Region1: [Leader ─ Follower ─ Follower]
Region2: [Leader ─ Follower ─ Follower]
Region3: [Leader ─ Follower ─ Follower]
...
4.2.2 角色分工
| 角色 |
职责 |
| Leader |
处理所有读写 I/O |
| Follower |
只同步变化日志,不处理客户端读写 |
4.2.3 Raft 日志复制完整流程
① Propose → 写 Raft 日志
② Append → Leader 持久化到 rocksdb raft
③ Replicate → 复制 Raft 日志到其他 TiKV
③.1 Append → Follower 持久化到自己的 rocksdb raft
④ Committed → Follower 给 Leader 回应
⑤ Apply → 各节点将数据从 rocksdb raft 写入 rocksdb kv
→ 用户提交成功
写入成功条件:Leader + 多数 Follower 写入成功
4.2.4 三种读取方式
| 方式 |
原理 |
特点 |
| ReadIndex Read |
获取已 commit 的 Raft 日志位置,等待 apply 完成 |
通用方式 |
| Lease Read |
心跳保证自己是 Leader,心跳到超时期间安全读取 |
性能最优 |
| Follower Read |
从 Follower 读取,可能读到最新数据 |
分担读压力 |
4.2.5 Leader 选举优化
- 为每个节点的选举超时时间增加随机值
- 避免多节点同时发起选举(防止活锁)
4.3 事务模型
4.3.1 分布式事务 = 两阶段提交
TiDB Server TiKV
│ │
▼ │
┌──────────────┐ │
│ Prewrite │ ── 修改数据 + 加锁 ──→ 锁写入 Lock CF
│ (预写) │ │
└──────┬───────┘ │
▼ │
┌──────────────┐ │
│ Commit │ ── 提交 + 释放锁 ──→ 事务完成
│ (提交) │ │
└──────────────┘ │
4.3.2 锁机制优化
- 修改多行数据时:只给第一行加主锁,其他行的锁指向主锁
- 减少锁管理开销
4.3.3 三种事务模式对比
| 模式 |
加锁时机 |
锁存储位置 |
特点 |
| 乐观锁 |
Commit 时 Prewrite |
TiKV 磁盘(Lock CF) |
默认模式,其他事务不知道有锁 |
| 悲观锁 |
事务执行中 |
TiKV 磁盘(Lock CF) |
其他事务能感知锁 |
| 内存悲观锁 (v6.0) |
事务执行中 |
Leader 节点内存 |
性能最优,宕机丢锁 |
内存悲观锁开启方式:
SET CONFIG tikv pessimistic-txn.pipelined='true';
SET CONFIG tikv pessimistic-txn.in-memory='true';
4.3.4 隔离级别
- 默认:SI(Snapshot Isolation,快照隔离)
- 支持 RC(Read Committed)
- 不支持 RR(Repeatable Read)和 Serializable
4.4 MVCC(多版本并发控制)
4.4.1 原理
- 每行数据维护多个版本
- 不同事务读取时看到自己启动时的快照版本
- 不阻塞新事务读取正在事务中的数据的之前已提交版本
4.4.2 版本清理
- 由 TiDB Server 的 GC 机制负责
- 删除 safe point 之前的历史版本
tidb_gc_life_time(默认 10 分钟)
4.5 HTAP 架构
4.5.1 HTAP 三大要求
1. 可扩展性 → 分布式事务 + 分布式存储
2. OLTP/OLAP 隔离 → 行存(TiKV) + 列存(TiFlash)
3. 实时性 → 行存与列存实时同步
4.5.2 引擎选择策略
| 场景 |
推荐引擎 |
说明 |
| 高并发 OLTP |
TiKV |
行存,低延迟 |
| 复杂分析 OLAP |
TiFlash |
列存,MPP 并行 |
| 混合查询 |
CBO 自动选择 |
不同表走不同引擎,结果在 TiDB Server 汇总 |
强制使用 TiFlash:
SELECT /*+ read_from_storage(tiflash[orders]) */
DATE(created_at), SUM(amount)
FROM orders
GROUP BY DATE(created_at);
手动设置 TiFlash 副本:
ALTER TABLE orders SET TIFLASH REPLICA 1;
第五部分:安装部署与运维
5.1 TiUP 工具
5.1.1 TiUP 简介
- TiDB 4.0 版本引入的集群运维工具
- 包含多个组件:
cluster(生产部署)、playground(本地测试)、client(客户端)
5.1.2 安装 TiUP
# 安装
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.bash_profile
# 验证
tiup --version
5.1.3 Playground(本地测试)
# 一键启动(包含 TiDB + TiKV + PD + TiFlash + Monitor)
tiup playground v7.5.0
# 指定组件版本和节点数
tiup playground v7.5.0 --db 3 --kv 3 --pd 3 --tiflash 1
5.1.4 生产部署流程
# 1. 生成配置模板
tiup cluster template --full > topology.yaml
# 2. 编辑 topology.yaml(配置各节点信息)
# 需要配置:PD servers、TiDB servers、TiKV servers、
# TiFlash servers、Monitor servers、Grafana servers
# 3. 检查部署环境
tiup cluster check ./topology.yaml --user root -i ~/.ssh/id_rsa
# 4. 执行部署
tiup cluster deploy tidb-prod v7.5.0 ./topology.yaml --user root -p
# 5. 启动集群
tiup cluster start tidb-prod
# 6. 验证状态
tiup cluster display tidb-prod
5.1.5 topology.yaml 关键配置
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
server_configs:
tidb:
log.slow-threshold: 300
tikv:
storage.reserve-space: "0MB"
pd:
schedule.leader-schedule-limit: 4
pd_servers: # 至少 3 个,奇数
- host: 10.0.1.11
- host: 10.0.1.12
- host: 10.0.1.13
tidb_servers: # 建议 2+ 个
- host: 10.0.1.21
- host: 10.0.1.22
tikv_servers: # 至少 3 个
- host: 10.0.1.31
- host: 10.0.1.32
- host: 10.0.1.33
tiflash_servers: # 可选
- host: 10.0.1.41
monitoring_servers:
- host: 10.0.1.51
grafana_servers:
- host: 10.0.1.51
5.2 集群运维操作
5.2.1 日常管理命令
# 查看集群状态
tiup cluster display tidb-prod
# 启动 / 停止 / 重启
tiup cluster start tidb-prod
tiup cluster stop tidb-prod
tiup cluster restart tidb-prod
# 查看组件列表
tiup component list
# 升级集群
tiup cluster upgrade tidb-prod v7.6.0
# 查看集群日志
tiup cluster log tidb-prod
5.2.2 扩缩容
# 扩容 TiKV(创建 scale-out-tikv.yaml)
tiup cluster scale-out tidb-prod scale-out-tikv.yaml
# 缩容 TiKV(移除指定节点)
tiup cluster scale-in tidb-prod -N 10.0.1.33:20160
# 扩容 TiDB
tiup cluster scale-out tidb-prod scale-out-tidb.yaml
5.2.3 配置管理
# 修改配置(会 rolling restart)
tiup cluster edit-config tidb-prod
# 查看当前配置
tiup cluster show-config tidb-prod
# 重载配置(不重启,部分参数支持)
tiup cluster reload tidb-prod
5.2.4 数据目录规划
| 组件 |
deploy_dir(程序) |
data_dir(数据) |
| TiDB |
/tidb-deploy/tidb-4000 |
无(无状态) |
| PD |
/tidb-deploy/pd-2379 |
/tidb-data/pd-2379 |
| TiKV |
/tidb-deploy/tikv-20160 |
/tidb-data/tikv-20160 |
| TiFlash |
/tidb-deploy/tiflash-9000 |
/tidb-data/tiflash-9000 |
5.3 部署前置条件
5.3.1 硬件要求
| 组件 |
最低配置 |
推荐配置 |
| TiDB |
8C/16G |
16C/32G |
| PD |
4C/8G |
8C/16G,SSD |
| TiKV |
8C/32G/1TB SSD |
32C/128G/2TB+ NVMe SSD |
| TiFlash |
8C/32G/1TB SSD |
32C/128G/2TB+ SSD |
| Monitor |
4C/8G/500G |
8C/16G/1TB |
5.3.2 系统要求
# 关闭 swap
swapoff -a
# 调整文件描述符
echo "* soft nofile 1000000" >> /etc/security/limits.conf
echo "* hard nofile 1000000" >> /etc/security/limits.conf
# 关闭 THP(透明大页)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 时间同步
yum install -y ntpdate
ntpdate pool.ntp.org
# SSH 互信
ssh-keygen -t rsa
ssh-copy-id tidb@10.0.1.11
5.3.3 网络端口
| 组件 |
端口 |
说明 |
| TiDB |
4000 |
SQL 服务端口 |
| TiDB |
10080 |
Status / Metrics |
| PD |
2379 |
Client API |
| PD |
2380 |
Raft 通信 |
| TiKV |
20160 |
服务端口 |
| TiKV |
20180 |
Status |
| TiFlash |
9000 |
HTTP 服务 |
| TiFlash |
3930 |
RPC 服务 |
| Grafana |
3000 |
监控面板 |
| Prometheus |
9090 |
指标采集 |
第六部分:周边工具生态
6.1 Dumpling(数据导出工具)
6.1.1 功能
- 从 MySQL / TiDB 导出数据
- 支持 SQL / CSV / Parquet 格式
- 支持全量 / 按库 / 按表导出
6.1.2 常用命令
# 全量导出
tiup dumpling \
-h 127.0.0.1 -P 3306 -u root -p "" \
-o /data/backup \
--filetype sql
# 仅导出 Schema(不含数据)
tiup dumpling \
-h 127.0.0.1 -P 3306 -u root \
--no-data \
-o /data/schema
# 指定库导出(Parquet 格式)
tiup dumpling \
-h 127.0.0.1 -P 3306 -u root \
--filetype parquet \
-o /data/parquet \
--databases db1,db2 \
-r 200000 --threads 8
# 过滤表导出
tiup dumpling -h 127.0.0.1 -P 3306 -u root \
-o /data/partial \
-T db1.orders,db1.users
6.1.3 重要参数
| 参数 |
说明 |
-r |
每个文件最大行数 |
--threads |
导出线程数 |
--filetype |
输出格式:sql/csv/parquet |
--no-data |
仅导出结构 |
--consistency |
一致性保证:flush/lock/none |
-F |
分割文件大小(如 256MiB) |
6.2 TiDB Lightning(数据导入工具)
6.2.1 功能
- 将 Dumpling / CSV 导出的数据快速导入 TiDB
- 适合全量数据迁移和大规模数据导入
- 速度远快于 SQL INSERT
6.2.2 导入模式
| 模式 |
Backend |
特点 |
适用场景 |
| Physical Mode |
local |
直接写 TiKV 数据文件,极快 |
TB 级数据,首次导入 |
| Logical Mode |
tidb |
通过 SQL INSERT 导入 |
小数据量 |
| Physical Mode (TiDB-backend) |
tidb |
物理模式 + TiDB 目标 |
需要校验的场景 |
6.2.3 配置示例
[lightning]
table-concurrency = 6
index-concurrency = 2
[tikv-importer]
backend = "local"
sorted-kv-dir = "/tmp/lightning-sorted"
[mydumper]
data-source-dir = "/data/export"
no-schema = false
filter = ["*.*"]
[tidb]
host = "127.0.0.1"
port = 4000
user = "root"
pd-addr = "127.0.0.1:2379"
[checkpoint]
enable = true
driver = "file"
dsn = "/tmp/lightning_checkpoints.db"
6.2.4 执行命令
# 导入数据
tiup tidb-lightning --config lightning.toml
# 检查点错误处理(checksum mismatch)
tiup tidb-lightning-ctl --config lightning.toml --checkpoint-error-destroy=all
tiup tidb-lightning --config lightning.toml
6.3 DM(Data Migration,数据迁移平台)
6.3.1 功能
- 将 MySQL/MariaDB 数据全量+增量迁移到 TiDB
- 支持数据源合并(多对一)
- 支持过滤、路由、分库分表合并
6.3.2 架构
MySQL Source 1 ─────┐
├──▶ DM-master ──▶ DM-worker ──▶ TiDB
MySQL Source 2 ─────┘ (调度) (执行迁移)
6.3.3 部署
# 编写 dm-topology.yaml
cat > dm-topology.yaml << 'EOF'
master_servers:
- host: 10.0.1.61
port: 8261
worker_servers:
- host: 10.0.1.62
port: 8262
- host: 10.0.1.63
port: 8262
EOF
# 部署启动
tiup dm deploy dm-cluster v7.5.0 dm-topology.yaml --user root -p
tiup dm start dm-cluster
6.3.4 迁移任务配置
name: "mysql-to-tidb"
task-mode: all # all = 全量 + 增量
target-database:
host: "10.0.1.21"
port: 4000
user: "root"
password: ""
mysql-instances:
- source-id: "mysql-replica-01"
route-rules: ["route-rule-1"]
filter-rules: ["filter-1"]
routes:
route-rule-1:
schema-pattern: "old_db"
target-schema: "new_db"
table-pattern: "t_*"
target-table: "t_"
filters:
filter-1:
schema-pattern: "old_db"
events: ["drop table", "truncate table"]
action: Ignore
6.3.5 任务管理
# 启动任务
tiup dmctl --master-addr 10.0.1.61:8261 start-task task.yaml
# 查看状态
tiup dmctl --master-addr 10.0.1.61:8261 query-status mysql-to-tidb
# 暂停 / 恢复 / 停止
tiup dmctl --master-addr 10.0.1.61:8261 pause-task mysql-to-tidb
tiup dmctl --master-addr 10.0.1.61:8261 resume-task mysql-to-tidb
tiup dmctl --master-addr 10.0.1.61:8261 stop-task mysql-to-tidb
6.4 BR(Backup & Restore,备份恢复)
6.4.1 功能
- TiDB 的分布式备份与恢复工具
- 支持全量/增量备份
- 支持多种存储后端:S3 / GCS / Azure Blob / 本地
6.4.2 全量备份
tiup br backup full \
--pd "10.0.1.11:2379" \
--storage "s3://bucket/backup/full-$(date +%Y%m%d)" \
--send-credentials-to-tikv=true
6.4.3 全量恢复
tiup br restore full \
--pd "10.0.1.11:2379" \
--storage "s3://bucket/backup/full-20260529"
6.4.4 增量备份
# 增量备份(基于上一次全量/增量)
tiup br backup incremental \
--pd "10.0.1.11:2379" \
--storage "s3://bucket/backup/incr-$(date +%Y%m%d)" \
--last-backup-ts "2026-05-28T00:00:00+08:00" \
--send-credentials-to-tikv=true
6.4.5 库/表级别备份
# 备份指定库
tiup br backup db \
--pd "10.0.1.11:2379" \
--db your_db \
--storage "local:///data/backup/your_db"
# 备份指定表
tiup br backup table \
--pd "10.0.1.11:2379" \
--db your_db \
--table orders \
--storage "local:///data/backup/orders"
6.5 CDC(Change Data Capture)
6.5.1 功能
- 捕获 TiDB 的增量数据变更
- 输出到下游:MySQL / Kafka / Confluent 等
- 实现数据同步和分发
6.5.2 使用
# 创建同步任务(同步到 MySQL)
tiup cdc cli changefeed create \
--server "http://10.0.1.21:8300" \
--sink-uri "mysql://root:password@10.0.2.11:3306/" \
--changefeed-id "mysql-replication"
# 查看变更流列表
tiup cdc cli changefeed list --server "http://10.0.1.21:8300"
# 暂停/恢复
tiup cdc cli changefeed pause --changefeed-id mysql-replication
tiup cdc cli changefeed resume --changefeed-id mysql-replication
6.6 sync-diff-inspector(数据校验工具)
6.6.1 功能
- 比较两个数据库的数据一致性
- 支持 MySQL vs TiDB、TiDB vs TiDB
- 可生成修复 SQL
6.6.2 配置
check-thread-count = 4
export-fix-sql = true
[task]
output-dir = "./diff-output"
[data-sources.source-db]
host = "10.0.2.11"
port = 3306
user = "root"
password = ""
[data-sources.target-db]
host = "10.0.1.21"
port = 4000
user = "root"
password = ""
6.6.3 执行
./sync_diff_inspector --config=diff-config.toml
cat diff-output/summary.txt
# 如有差异 → diff-output/fix.sql
6.7 工具速查表
| 工具 |
用途 |
方向 |
| Dumpling |
数据导出 |
TiDB/MySQL → 文件 |
| Lightning |
数据导入 |
文件 → TiDB |
| DM |
数据迁移 |
MySQL → TiDB(全量+增量) |
| BR |
备份恢复 |
TiDB ↔ 存储后端 |
| CDC |
增量同步 |
TiDB → MySQL/Kafka |
| sync-diff-inspector |
数据校验 |
DB A vs DB B |
| TiUP |
集群管理 |
部署/运维/升级 |
| TiDB Dashboard |
管控界面 |
PD 提供,Web UI |
第七部分:SQL 兼容性与应用开发
7.1 MySQL 兼容性
7.1.1 兼容的特性
- MySQL 5.7 协议和大部分语法
- DDL:CREATE/ALTER/DROP TABLE、INDEX
- DML:SELECT/INSERT/UPDATE/DELETE
- 事务:BEGIN/COMMIT/ROLLBACK
- 大部分内置函数
- Online DDL(不阻塞读写)
7.1.2 不兼容/需注意的特性
| 特性 |
TiDB 行为 |
| 外键 |
语法支持但默认不强制 |
| 存储引擎 |
只支持 InnoDB(无 MyISAM/Memory) |
| 触发器 |
不支持 |
| 存储过程/函数 |
部分支持,复杂逻辑需评估 |
GROUP BY |
默认开启 ONLY_FULL_GROUP_BY |
| 自增 ID |
分布式自增,不连续但单调递增 |
| 空间索引 |
部分支持 |
| 临时表 |
不支持真正的临时表 |
7.2 应用连接参数
# JDBC 推荐参数
jdbc:mysql://tidb-host:4000/your_db\
?useSSL=false\
&characterEncoding=UTF-8\
&useServerPrepStmts=true\
&cachePrepStmts=true\
&rewriteBatchedStatements=true\
&connectionCollation=utf8mb4_unicode_ci
7.3 性能优化写法
-- 1. 游标分页(替代大 offset)
-- ❌ 避免
SELECT * FROM orders ORDER BY id LIMIT 100000, 20;
-- ✅ 推荐
SELECT * FROM orders WHERE id > :last_id ORDER BY id LIMIT 20;
-- 2. 批量 INSERT(开启 rewriteBatchedStatements)
INSERT INTO orders (col1, col2) VALUES (?, ?), (?, ?), (?, ?);
-- 3. 分批 DELETE(避免大事务)
DELETE FROM logs WHERE create_time < '2023-01-01' LIMIT 1000;
-- 循环执行直到影响行数为 0
-- 4. 避免热点写入:AUTO_RANDOM
CREATE TABLE orders (
id BIGINT AUTO_RANDOM PRIMARY KEY,
user_id INT NOT NULL
);
-- 5. 预分裂 Region
ALTER TABLE orders SPLIT BY (100000), (200000), (300000);
7.4 统计信息
-- 手动收集统计信息(迁移后或大批量数据变更后)
ANALYZE TABLE your_db.orders;
-- 设置自动收集比例
SET GLOBAL tidb_auto_analyze_ratio = 0.1;
-- 设置自动收集时间窗口
SET GLOBAL tidb_auto_analyze_start_time = '02:00 +0800';
SET GLOBAL tidb_auto_analyze_end_time = '06:00 +0800';
第八部分:高可用与容灾
8.1 多副本机制
- TiKV 默认 3 副本
- 基于 Multi-Raft 共识
- 少数副本失效 → 自动故障转移,业务无感知
8.2 PD 高可用
- PD 至少 3 节点(奇数个)
- PD 自身通过 Raft 实现高可用
- PD Leader 自动选举
8.3 故障自动处理
TiKV 节点宕机
│
▼
Raft Follower 超时未收到心跳
│
▼
发起 Leader 选举(随机超时避免冲突)
│
▼
新 Leader 上线
│
▼
PD 检测副本缺失
│
▼
调度其他节点补充副本
8.4 备份策略
| 策略 |
工具 |
频率 |
RPO |
| 全量备份 |
BR |
每日 |
24h |
| 增量备份 |
BR |
每小时 |
1h |
| 实时同步 |
CDC |
持续 |
≈0 |
第九部分:性能调优
9.1 SQL 调优
-- 1. 查看 SQL 执行计划
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 100;
-- 2. 使用 HINT 优化
SELECT /*+ USE_INDEX(orders, idx_user_id) */ * FROM orders WHERE user_id = 100;
-- 3. 强制走 TiFlash
SELECT /*+ read_from_storage(tiflash[orders]) */ COUNT(*) FROM orders;
-- 4. 强制 MPP
SELECT /*+ hash_join_build(orders) */ * FROM orders JOIN users ON orders.user_id = users.id;
9.2 热点处理
-- 检查热点 Region
SELECT region_id, written_bytes, read_bytes
FROM information_schema.TIKV_REGION_STATUS
ORDER BY written_bytes DESC LIMIT 10;
-- 处理写热点方案
ALTER TABLE orders MODIFY id BIGINT AUTO_RANDOM;
ALTER TABLE logs SHARD_ROW_ID_BITS = 4 PRE_SPLIT_REGIONS = 4;
9.3 关键参数调优
| 参数 |
说明 |
推荐值 |
tidb_max_txn_size |
单事务大小上限 |
100MB |
raftstore.apply-pool-size |
Apply 线程数 |
2 × CPU 核数 |
rocksdb.write-buffer-size |
RocksDB MemTable 大小 |
128MB |
tidb_executor_concurrency |
执行并发度 |
CPU 核数 |
9.4 监控指标
| 指标 |
告警阈值 |
工具 |
| TiDB QPS |
持续下降 |
Grafana → TiDB Summary |
| TiKV CPU |
> 80% |
Grafana → TiKV Details |
| TiKV 存储 |
> 80% |
Grafana → TiKV Details |
| 慢查询 |
P99 > 1s |
Grafana → TiDB Summary |
| Region 健康 |
有 Pending Region |
Grafana → PD |
第十部分:高频考点速记
10.1 必背数字
| 知识点 |
值 |
| Region 默认大小范围 |
96MB ~ 144MB |
| TiKV 默认副本数 |
3 副本 |
| PD 最少节点数 |
3 个(奇数) |
| GC 默认间隔 |
10 分钟 |
| 热点小表缓存阈值 |
≤ 64MB |
| TSO 格式 |
physical + logical |
| TiDB Server 特性 |
无状态,可水平扩展 |
| TiDB 默认隔离级别 |
SI(Snapshot Isolation) |
| TiDB MySQL 兼容版本 |
MySQL 5.7 |
| TiKV 存储引擎 |
RocksDB × 2(raft + kv) |
10.2 必背架构关系
客户端 → 负载均衡 → TiDB Server(无状态,Go 语言)
│
┌────────────┼────────────┐
▼ ▼ ▼
PD TiKV TiFlash
(etcd) (行存) (列存)
≥3 节点 Multi-Raft Raft Learner
TSO/元数据 Region OLAP
事务/MVCC MPP
10.3 必背流程
| 流程 |
关键步骤 |
| Raft 写入 |
Propose → Append(Leader) → Replicate(Followers) → Committed → Apply |
| 两阶段提交 |
Prewrite(加锁)→ Commit(释放锁) |
| Region 分裂 |
达 96MB 停止写入 → 超 144MB 触发分裂 |
| RocksDB 写入 |
WAL → MemTable → Immutable → SST |
| SQL 处理 |
Parser → Optimizer(CBO) → Executor → TiKV/TiFlash |
10.4 必背工具对应关系
| 场景 |
工具 |
| 部署/运维/升级 |
TiUP |
| 数据导出 |
Dumpling |
| 数据导入 |
Lightning |
| MySQL→TiDB 迁移 |
DM |
| 备份/恢复 |
BR |
| 增量同步 |
CDC |
| 数据校验 |
sync-diff-inspector |
| 管控界面 |
TiDB Dashboard(PD 提供) |
10.5 易错考点
| 考点 |
易错点 |
正确答案 |
| TSO 连续性 |
TSO 连续递增? |
单调递增,不连续 |
| PD Leader |
TSO 从任何 PD 获取? |
只能从 Leader 获取 |
| DDL 并发 |
多个 TiDB 同时执行 DDL? |
同一时刻只能一个 Owner |
| TiDB Server 存储 |
TiDB 存储数据? |
不存储,无状态 |
| TiFlash 角色 |
TiFlash 参与投票? |
Learner,不投票 |
| Column Families |
3 个 CF 各自独立 WAL? |
共享一份 WAL |
| MySQL 兼容 |
兼容 MySQL 8.0? |
兼容 5.7 |
| 外键 |
TiDB 强制外键? |
语法支持但不强制 |
| 自增 ID |
自增 ID 连续? |
不连续但单调递增 |
| MPP 连接类型 |
MPP 支持所有连接? |
只支持等值连接 |
10.6 关键命令速查
# TiUP 集群操作
tiup cluster deploy # 部署
tiup cluster start # 启动
tiup cluster stop # 停止
tiup cluster restart # 重启
tiup cluster display # 查看状态
tiup cluster scale-out # 扩容
tiup cluster scale-in # 缩容
tiup cluster upgrade # 升级
tiup cluster edit-config # 修改配置
# DM 操作
tiup dmctl start-task # 启动迁移
tiup dmctl query-status # 查看状态
tiup dmctl pause-task # 暂停
tiup dmctl stop-task # 停止
# BR 备份恢复
tiup br backup full # 全量备份
tiup br restore full # 全量恢复
tiup br backup incremental # 增量备份
# 通用连接
mysql -h 127.0.0.1 -P 4000 -u root -附录:备考资源链接
祝你考试顺利,一举通过 PCTA!