diff --git a/TOC.md b/TOC.md
index 853182eeccaa..f4bc26b8d3b5 100644
--- a/TOC.md
+++ b/TOC.md
@@ -772,6 +772,7 @@
- [`BEGIN`](/sql-statements/sql-statement-begin.md)
- [`CALIBRATE RESOURCE`](/sql-statements/sql-statement-calibrate-resource.md)
- [`CANCEL IMPORT JOB`](/sql-statements/sql-statement-cancel-import-job.md)
+ - [`CANCEL TRAFFIC JOBS`](/sql-statements/sql-statement-cancel-traffic-jobs.md)
- [`COMMIT`](/sql-statements/sql-statement-commit.md)
- [`CREATE BINDING`](/sql-statements/sql-statement-create-binding.md)
- [`CREATE DATABASE`](/sql-statements/sql-statement-create-database.md)
@@ -878,6 +879,7 @@
- [`SHOW TABLE REGIONS`](/sql-statements/sql-statement-show-table-regions.md)
- [`SHOW TABLE STATUS`](/sql-statements/sql-statement-show-table-status.md)
- [`SHOW TABLES`](/sql-statements/sql-statement-show-tables.md)
+ - [`SHOW TRAFFIC JOBS`](/sql-statements/sql-statement-show-traffic-jobs.md)
- [`SHOW VARIABLES`](/sql-statements/sql-statement-show-variables.md)
- [`SHOW WARNINGS`](/sql-statements/sql-statement-show-warnings.md)
- [`SHUTDOWN`](/sql-statements/sql-statement-shutdown.md)
@@ -885,6 +887,8 @@
- [`START TRANSACTION`](/sql-statements/sql-statement-start-transaction.md)
- [`TABLE`](/sql-statements/sql-statement-table.md)
- [`TRACE`](/sql-statements/sql-statement-trace.md)
+ - [`TRAFFIC CAPTURE`](/sql-statements/sql-statement-traffic-capture.md)
+ - [`TRAFFIC REPLAY`](/sql-statements/sql-statement-traffic-replay.md)
- [`TRUNCATE`](/sql-statements/sql-statement-truncate.md)
- [`UNLOCK STATS`](/sql-statements/sql-statement-unlock-stats.md)
- [`UPDATE`](/sql-statements/sql-statement-update.md)
diff --git a/enable-tls-between-components.md b/enable-tls-between-components.md
index 4315e517257c..77252aa1db76 100644
--- a/enable-tls-between-components.md
+++ b/enable-tls-between-components.md
@@ -109,11 +109,23 @@ aliases: ['/docs-cn/dev/enable-tls-between-components/','/docs-cn/dev/how-to/sec
cdc server --pd=https://127.0.0.1:2379 --log-file=ticdc.log --addr=0.0.0.0:8301 --advertise-addr=127.0.0.1:8301 --ca=/path/to/ca.pem --cert=/path/to/ticdc-cert.pem --key=/path/to/ticdc-key.pem
```
+ - TiProxy
+
+ 在 `config` 文件中设置,并设置相应的 URL 为 https:
+
+ ```toml
+ [security]
+ [server-http-tls]
+ ca = "/path/to/ca.pem"
+ cert = "/path/to/tiproxy-server.pem"
+ key = "/path/to/tiproxy-server-key.pem"
+ ```
+
此时 TiDB 集群各个组件间已开启加密传输。
> **注意:**
>
- > 若 TiDB 集群各个组件间开启加密传输后,在使用 tidb-ctl、tikv-ctl 或 pd-ctl 工具连接集群时,需要指定 client 证书,示例:
+ > 若 TiDB 集群各个组件间开启加密传输后,在使用 tidb-ctl、tikv-ctl、pd-ctl 或 tiproxyctl 工具连接集群时,需要指定 client 证书,示例:
{{< copyable "shell-regular" >}}
@@ -150,7 +162,7 @@ aliases: ['/docs-cn/dev/enable-tls-between-components/','/docs-cn/dev/how-to/sec
```toml
[security]
- cluster-verify-cn = ["tidb", "test-client", "prometheus"]
+ cluster-verify-cn = ["tidb", "tiproxy", "test-client", "prometheus"]
```
- TiKV
@@ -168,7 +180,7 @@ aliases: ['/docs-cn/dev/enable-tls-between-components/','/docs-cn/dev/how-to/sec
```toml
[security]
- cert-allowed-cn = ["tidb", "pd", "tikv", "tiflash", "test-client", "prometheus"]
+ cert-allowed-cn = ["tidb", "pd", "tikv", "tiflash", "tiproxy", "test-client", "prometheus"]
```
- TiFlash(从 v4.0.5 版本开始引入)
@@ -187,10 +199,19 @@ aliases: ['/docs-cn/dev/enable-tls-between-components/','/docs-cn/dev/how-to/sec
cert-allowed-cn = ["tidb", "tikv", "tiflash", "prometheus"]
```
+- TiProxy(从 v1.4.0 版本开始引入)
+
+ 在 `config` 文件中设置:
+
+ ```toml
+ [security]
+ cert-allowed-cn = ["tiproxy", "tidb", "test-client", "prometheus"]
+ ```
+
## 证书重新加载
-- 如果 TiDB 集群部署在本地的数据中心,TiDB、PD、TiKV、TiFlash、TiCDC 和各种 client 在每次新建相互通讯的连接时都会重新读取当前的证书和密钥文件内容,实现证书和密钥的重新加载,无需重启 TiDB 集群。
-- 如果 TiDB 集群部署在自己管理的 Cloud,TLS 证书的签发需要与云服务商的证书管理服务集成,TiDB、PD、TiKV、TiFlash、TiCDC 组件的 TLS 证书支持自动轮换,无需重启 TiDB 集群。
+- 如果 TiDB 集群部署在本地的数据中心,TiDB、PD、TiKV、TiFlash、TiCDC、TiProxy 和各种 client 在每次新建相互通讯的连接时都会重新读取当前的证书和密钥文件内容,实现证书和密钥的重新加载,无需重启 TiDB 集群。
+- 如果 TiDB 集群部署在自己管理的 Cloud,TLS 证书的签发需要与云服务商的证书管理服务集成,TiDB、PD、TiKV、TiFlash、TiCDC、TiProxy 组件的 TLS 证书支持自动轮换,无需重启 TiDB 集群。
## 证书有效期
diff --git a/media/tiproxy/tiproxy-balance-label.png b/media/tiproxy/tiproxy-balance-label.png
index c291c40ba05c..44fee918cdcc 100644
Binary files a/media/tiproxy/tiproxy-balance-label.png and b/media/tiproxy/tiproxy-balance-label.png differ
diff --git a/privilege-management.md b/privilege-management.md
index d97632e2dacb..72010f02456c 100644
--- a/privilege-management.md
+++ b/privilege-management.md
@@ -292,6 +292,8 @@ SHOW GRANTS FOR `rw_user`@`192.168.%`;
* `RESTRICTED_USER_ADMIN` 不允许在 SEM 打开的情况下使用 `SUPER` 用户撤销访问权限。
* `RESTRICTED_CONNECTION_ADMIN` 允许 KILL 属于 `RESTRICTED_USER_ADMIN` 用户的连接。该权限对 `KILL` 和 `KILL TIDB` 语句生效。
* `RESTRICTED_REPLICA_WRITER_ADMIN` 允许权限拥有者在 TiDB 集群开启了只读模式的情况下不受影响地执行写入或更新操作,详见 [`tidb_restricted_read_only` 配置项](/system-variables.md#tidb_restricted_read_only-从-v520-版本开始引入)。
+* `TRAFFIC_CAPTURE_ADMIN` 允许执行、查看和取消流量捕获任务。详见 [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)。
+* `TRAFFIC_REPLAY_ADMIN` 允许执行、查看和取消流量回放任务。详见 [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)。
若要查看全部的动态权限,请执行 `SHOW PRIVILEGES` 语句。由于用户可使用插件来添加新的权限,因此可分配的权限列表可能因用户的 TiDB 安装情况而异。
@@ -506,6 +508,22 @@ SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE grantee = "'root'@'%'";
当系统变量 [`tidb_resource_control_strict_mode`](/system-variables.md#tidb_resource_control_strict_mode-从-v820-版本开始引入) 设置为 `ON` 时,你需要有 `SUPER` 或者 `RESOURCE_GROUP_ADMIN` 或者 `RESOURCE_GROUP_USER` 权限才能执行该语句。
+### TRAFFIC CAPTURE
+
+需要拥有 `SUPER` 或者 `TRAFFIC_CAPTURE_ADMIN` 权限。
+
+### TRAFFIC REPLAY
+
+需要拥有 `SUPER` 或者 `TRAFFIC_REPLAY_ADMIN` 权限。
+
+### CANCEL TAFFIC JOBS
+
+取消捕获任务,需要拥有 `SUPER` 或者 `TRAFFIC_CAPTURE_ADMIN` 权限。取消回放任务,需要拥有 `SUPER` 或者 `TRAFFIC_REPLAY_ADMIN` 权限。
+
+### SHOW TRAFFIC JOBS
+
+查看捕获任务,需要拥有 `SUPER` 或者 `TRAFFIC_CAPTURE_ADMIN` 权限。查看回放任务,需要拥有 `SUPER` 或者 `TRAFFIC_REPLAY_ADMIN` 权限。
+
## 权限系统的实现
### 授权表
diff --git a/sql-statements/sql-statement-cancel-traffic-jobs.md b/sql-statements/sql-statement-cancel-traffic-jobs.md
new file mode 100644
index 000000000000..b3b06fcdc3cb
--- /dev/null
+++ b/sql-statements/sql-statement-cancel-traffic-jobs.md
@@ -0,0 +1,73 @@
+---
+title: CANCEL TRAFFIC JOBS
+summary: TiDB 数据库中 CANCEL TRAFFIC JOBS 的使用概况。
+---
+
+# CANCEL TRAFFIC JOBS
+
+TiDB v9.0.0 引入了 `CANCEL TRAFFIC JOBS` 语法,用于取消集群中所有 TiProxy 正在执行的流量捕获或回放任务。该操作需要如下权限:
+
+- 取消流量捕获任务,需要有 `SUPER` 或 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限。
+- 取消流量回放任务,需要有 `SUPER` 或 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+## 语法图
+
+```ebnf+diagram
+TrafficStmt ::=
+ "CANCEL" "TRAFFIC" "JOBS"
+```
+
+## 示例
+
+例如当前有 2 台 TiProxy 正在流量捕获:
+
+```sql
+SHOW TRAFFIC JOBS
+```
+
+```
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| START_TIME | END_TIME | INSTANCE | TYPE | PROGRESS | STATUS | FAIL_REASON |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| 2024-12-17 10:54:41.000000 | | 10.1.0.10:3080 | capture | 45% | running | |
+| 2024-12-17 10:54:41.000000 | | 10.1.0.11:3080 | capture | 45% | running | |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+2 rows in set (0.01 sec)
+```
+
+取消当前的任务:
+
+```sql
+CANCEL TRAFFIC JOBS
+```
+
+```
+Query OK, 0 rows affected (0.13 sec)
+```
+
+再次查看任务,显示任务已被取消:
+
+```sql
+SHOW TRAFFIC JOBS
+```
+
+```
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+| START_TIME | END_TIME | INSTANCE | TYPE | PROGRESS | STATUS | FAIL_REASON |
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+| 2024-12-17 10:54:41.000000 | 2024-12-17 11:20:42.000000 | 10.1.0.10:3080 | replay | 45% | canceled | manually stopped |
+| 2024-12-17 10:54:41.000000 | 2024-12-17 11:20:42.000000 | 10.1.0.11:3080 | replay | 45% | canceled | manually stopped |
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+2 rows in set (0.01 sec)
+```
+
+## MySQL 兼容性
+
+该语句是 TiDB 对 MySQL 语法的扩展。
+
+## 另请参阅
+
+* [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)
+* [TRAFFIC CAPTURE](/sql-statements/sql-statement-traffic-capture.md)
+* [TRAFFIC REPLAY](/sql-statements/sql-statement-traffic-replay.md)
+* [SHOW TRAFFIC JOBS](/sql-statements/sql-statement-show-traffic-jobs.md)
diff --git a/sql-statements/sql-statement-show-traffic-jobs.md b/sql-statements/sql-statement-show-traffic-jobs.md
new file mode 100644
index 000000000000..4cee4f0952d7
--- /dev/null
+++ b/sql-statements/sql-statement-show-traffic-jobs.md
@@ -0,0 +1,76 @@
+---
+title: SHOW TRAFFIC JOBS
+summary: TiDB 数据库中 SHOW TRAFFIC JOBS 的使用概况。
+---
+
+# SHOW TRAFFIC JOBS
+
+TiDB v9.0.0 引入了 `SHOW TRAFFIC JOBS` 语法,用于查看集群中所有 TiProxy 的流量捕获或回放任务。每行代表一台 TiProxy 实例的一个任务。每台 TiProxy 实例最多保存最近的 10 条任务。
+
+当前用户拥有的权限不同,执行该语句显示结果也不同。
+
+- 如果用户有 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限,执行该语句显示流量捕获任务。
+- 如果用户有 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限,执行该语句显示流量回放任务。
+- 如果用户有 `SUPER` 权限或同时具有上述两种权限,执行该语句同时显示流量捕获和流量回放任务。
+
+`SHOW TRAFFIC JOBS` 返回以下列:
+
+| 列名 | 说明 |
+| :-------- | :------------- |
+| `START_TIME` | 该任务的开始时间 |
+| `END_TIME` | 如果该任务已结束,该列为结束时间,否则为空 |
+| `INSTANCE` | TiProxy 的实例地址 |
+| `TYPE` | 表示任务类型,`capture` 代表流量捕获任务,`replay` 代表流量回放任务 |
+| `PROGRESS` | 该任务的完成百分比 |
+| `STATUS` | 该任务当前的状态,`running` 表示正在运行,`done` 表示正常完成,`canceled` 表示任务失败 |
+| `FAIL_REASON` | 如果该任务失败,该列为失败的原因,否则为空。例如 `manually stopped` 表示用户执行 `CANCEL TRAFFIC JOBS` 手动取消任务 |
+
+## 语法图
+
+```ebnf+diagram
+TrafficStmt ::=
+ "SHOW" "TRAFFIC" "JOBS"
+```
+
+## 示例
+
+查看流量捕获或回放任务:
+
+```sql
+SHOW TRAFFIC JOBS
+```
+
+下面输出示例表示有 2 台 TiProxy 正在捕获流量,进度都为 45%:
+
+```
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| START_TIME | END_TIME | INSTANCE | TYPE | PROGRESS | STATUS | FAIL_REASON |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| 2024-12-17 10:54:41.000000 | | 10.1.0.10:3080 | capture | 45% | running | |
+| 2024-12-17 10:54:41.000000 | | 10.1.0.11:3080 | capture | 45% | running | |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+2 rows in set (0.01 sec)
+```
+
+下面输出示例表示 2 台 TiProxy 的流量回放任务被手动取消:
+
+```
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+| START_TIME | END_TIME | INSTANCE | TYPE | PROGRESS | STATUS | FAIL_REASON |
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+| 2024-12-17 10:54:41.000000 | 2024-12-17 11:34:42.000000 | 10.1.0.10:3080 | replay | 70% | canceled | manually stopped |
+| 2024-12-17 10:54:41.000000 | 2024-12-17 11:34:43.000000 | 10.1.0.11:3080 | replay | 69% | canceled | manually stopped |
++----------------------------+----------------------------+----------------+--------+----------+----------+------------------+
+2 rows in set (0.01 sec)
+```
+
+## MySQL 兼容性
+
+该语句是 TiDB 对 MySQL 语法的扩展。
+
+## 另请参阅
+
+* [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)
+* [TRAFFIC CAPTURE](/sql-statements/sql-statement-traffic-capture.md)
+* [TRAFFIC REPLAY](/sql-statements/sql-statement-traffic-replay.md)
+* [CANCEL TRAFFIC JOBS](/sql-statements/sql-statement-cancel-traffic-jobs.md)
diff --git a/sql-statements/sql-statement-traffic-capture.md b/sql-statements/sql-statement-traffic-capture.md
new file mode 100644
index 000000000000..609427ce3ad8
--- /dev/null
+++ b/sql-statements/sql-statement-traffic-capture.md
@@ -0,0 +1,67 @@
+---
+title: TRAFFIC CAPTURE
+summary: TiDB 数据库中 TRAFFIC CAPTURE 的使用概况。
+---
+
+# TRAFFIC CAPTURE
+
+TiDB v9.0.0 引入了 `TRAFFIC CAPTURE` 语法,用于向集群中所有 TiProxy 实例发送请求,让 TiProxy 捕获客户端流量到流量文件。
+
+TiProxy 支持捕获流量到本地和外部存储。捕获流量到本地时,需要在捕获流量之后把流量文件手动复制到回放的 TiProxy 集群上,而使用外部存储时则无需手动复制。
+
+TiProxy 支持的外部存储包括 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage,或者实现 S3 协议的其他文件存储服务。关于外部存储,请参见[外部存储服务的 URI 格式](/external-storage-uri.md)。
+
+`TRAFFIC CAPTURE` 有以下选项:
+
+- `DURATION`:(必填)指定捕获的时长。可选单位为 `m`(分钟)、`h`(小时)或 `d`(天)。例如 `DURATION="1h"`,表示指定捕获一小时的流量。
+- `COMPRESS`:(可选)指定是否压缩流量文件。`true` 表示压缩,压缩格式为 gzip。`false` 表示不压缩。默认值为 `true`。
+- `ENCRYPTION_METHOD`:(可选)指定加密流量文件的算法。仅支持 `""`, `plaintext` 和 `aes256-ctr`。`""` 和 `plaintext` 表示不加密,`aes256-ctr` 表示使用 AES256-CTR 算法加密。指定加密时,需要同时配置 [`encrytion-key-path`](/tiproxy/tiproxy-configuration.md#encryption-key-path)。默认值为 `""`。
+
+捕获流量要求当前用户具有 `SUPER` 或 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+## 语法图
+
+```ebnf+diagram
+TrafficStmt ::=
+ "TRAFFIC" "CAPTURE" "TO" stringLit TrafficCaptureOptList
+
+TrafficCaptureOptList ::=
+ TrafficCaptureOpt
+| TrafficCaptureOptList TrafficCaptureOpt
+
+TrafficCaptureOpt ::=
+ "DURATION" EqOpt stringLit
+| "ENCRYPTION_METHOD" EqOpt stringLit
+| "COMPRESS" EqOpt Boolean
+```
+
+## 示例
+
+捕获 1 天流量到 TiProxy 实例的本地 `/tmp/traffic` 目录:
+
+```sql
+TRAFFIC CAPTURE TO "/tmp/traffic" DURATION="1d"
+```
+
+捕获 10 分钟流量到 S3:
+
+```sql
+TRAFFIC CAPTURE TO "s3://external/traffic?access-key=${access-key}&secret-access-key=${secret-access-key}" DURATION="10m"
+```
+
+捕获时,流量文件自动加密,但不自动压缩:
+
+```sql
+TRAFFIC CAPTURE TO "/tmp/traffic" DURATION="1h" COMPRESS=false ENCRYPTION_METHOD="aes256-ctr"
+```
+
+## MySQL 兼容性
+
+该语句是 TiDB 对 MySQL 语法的扩展。
+
+## 另请参阅
+
+* [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)
+* [TRAFFIC REPLAY](/sql-statements/sql-statement-traffic-replay.md)
+* [CANCEL TRAFFIC JOBS](/sql-statements/sql-statement-cancel-traffic-jobs.md)
+* [SHOW TRAFFIC JOBS](/sql-statements/sql-statement-show-traffic-jobs.md)
diff --git a/sql-statements/sql-statement-traffic-replay.md b/sql-statements/sql-statement-traffic-replay.md
new file mode 100644
index 000000000000..ab5a63bc9e9d
--- /dev/null
+++ b/sql-statements/sql-statement-traffic-replay.md
@@ -0,0 +1,71 @@
+---
+title: TRAFFIC REPLAY
+summary: TiDB 数据库中 TRAFFIC REPLAY 的使用概况。
+---
+
+# TRAFFIC REPLAY
+
+TiDB v9.0.0 引入了 `TRAFFIC REPLAY` 语法,用于向集群中所有 TiProxy 实例发送请求,让 TiProxy 从流量文件回放流量到 TiDB。
+
+回放流量需要当前用户具有 `SUPER` 或 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+`TRAFFIC REPLAY` 有以下选项:
+
+- `USER`:(必填)指定回放时使用的 TiDB 用户名。
+- `PASSWORD`:(可选)指定以上用户名的密码,默认为空字符串 `""`。
+- `SPEED`:(可选)指定回放速率的倍数,范围为 `[0.1, 10]`,默认为 `1`,表示原速回放。
+- `READ_ONLY`:(可选)指定是否仅回放只读 SQL 语句。`true` 表示仅回放只读 SQL 语句,`false` 表示回放只读和写入 SQL 语句。默认值为 `false`。
+
+## 语法图
+
+```ebnf+diagram
+TrafficStmt ::=
+ "TRAFFIC" "REPLAY" "FROM" stringLit TrafficReplayOptList
+
+TrafficReplayOptList ::=
+ TrafficReplayOpt
+| TrafficReplayOptList TrafficReplayOpt
+
+TrafficReplayOpt ::=
+ "USER" EqOpt stringLit
+| "PASSWORD" EqOpt stringLit
+| "SPEED" EqOpt NumLiteral
+| "READ_ONLY" EqOpt Boolean
+```
+
+## 示例
+
+从 TiProxy 实例的本地 `/tmp/traffic` 目录回放流量,使用 TiDB 用户 `u1` 回放,其密码为 `"123456"`:
+
+```sql
+TRAFFIC REPLAY FROM "/tmp/traffic" USER="u1" PASSWORD="123456"
+```
+
+从存放在 S3 的流量文件回放流量:
+
+```sql
+TRAFFIC REPLAY FROM "s3://external/traffic?access-key=${access-key}&secret-access-key=${secret-access-key}" USER="u1" PASSWORD="123456"
+```
+
+2 倍速回放流量:
+
+```sql
+TRAFFIC REPLAY FROM "/tmp/traffic" USER="u1" PASSWORD="123456" SPEED=2
+```
+
+仅回放只读语句,不回放写入语句:
+
+```sql
+TRAFFIC REPLAY FROM "/tmp/traffic" USER="u1" PASSWORD="123456" READONLY=true
+```
+
+## MySQL 兼容性
+
+该语句是 TiDB 对 MySQL 语法的扩展。
+
+## 另请参阅
+
+* [TiProxy 流量回放](/tiproxy/tiproxy-traffic-replay.md)
+* [TRAFFIC CAPTURE](/sql-statements/sql-statement-traffic-capture.md)
+* [CANCEL TRAFFIC JOBS](/sql-statements/sql-statement-cancel-traffic-jobs.md)
+* [SHOW TRAFFIC JOBS](/sql-statements/sql-statement-show-traffic-jobs.md)
diff --git a/tiproxy/tiproxy-command-line-flags.md b/tiproxy/tiproxy-command-line-flags.md
index fcd30992d3cd..1ec919f4a18c 100644
--- a/tiproxy/tiproxy-command-line-flags.md
+++ b/tiproxy/tiproxy-command-line-flags.md
@@ -165,6 +165,8 @@ level = 'warning'
- `--output`:(必填)指定流量文件存放的目录。
- `--duration`:(必填)指定捕获的时长。可选单位为 `m`(分钟)、`h`(小时)或 `d`(天)。例如 `--duration=1h` 指定捕获一小时的流量。
+- `--compress`:(可选)指定是否压缩流量文件。`true` 表示压缩,压缩格式为 gzip。`false` 代表不压缩。默认值为 `true`。
+- `--encryption-method`:(可选)指定加密流量文件的算法。支持 `""`, `plaintext` 和 `aes256-ctr`。`""` 和 `plaintext` 表示不加密,`aes256-ctr` 表示使用 AES256-CTR 算法加密。指定加密时,需要同时配置 [`encrytion-key-path`](/tiproxy/tiproxy-configuration.md#encryption-key-path)。默认值为 `""`。
示例:
@@ -181,9 +183,10 @@ tiproxyctl traffic capture --host 10.0.1.10 --port 3080 --output="/tmp/traffic"
选项:
- `--username`:(必填)指定回放时使用的数据库用户名。
-- `--password`:(可选)指定以上用户名的密码,默认为空字符串 `""`。
+- `--password`:(可选)指定以上用户名的密码。如未指定,将通过交互模式输入密码。
- `--input`:(必填)指定流量文件存放的目录。
-- `--speed`:(可选)指定回放速率的倍数,范围为 `[0.1, 10]`,默认为 1,表示原速回放。
+- `--speed`:(可选)指定回放速率的倍数,范围为 `[0.1, 10]`,默认为 `1`,表示原速回放。
+- `--read-only`:(可选)指定是否仅回放只读 SQL 语句。`true` 表示仅回放只读 SQL 语句,`false` 表示回放只读和写入 SQL 语句。默认值为 `false`。
示例:
@@ -199,13 +202,19 @@ tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --passwor
#### `traffic show`
-`tiproxyctl traffic show` 用于显示历史的捕获和回放任务。
+`tiproxyctl traffic show` 用于显示历史的捕获和回放任务。它输出的是一个对象的数组,每一个对象表示一个任务。每个任务有以下字段:
-输出中的 `status` 字段表示任务的状态,其可能的值包括:
-
-- `done`:任务正常完成。
-- `canceled`:任务被取消,查看 `error` 字段了解原因。
-- `running`:任务正在运行,查看 `progress` 字段了解进度。
+- `type`:表示任务类型,`capture` 代表流量捕获任务,`replay` 代表流量回放任务
+- `start_time`:该任务的开始时间
+- `end_time`:如果该任务已结束,该列为结束时间,否则为空
+- `duration`:捕获流量的时长
+- `output`:捕获输出的流量文件的路径
+- `input`:回放读取流量文件的路径
+- `username`:回放使用的数据库用户名
+- `speed`:回放的速率的倍数
+- `progress`:该任务的完成百分比
+- `status`:该任务当前的状态,`running` 表示正在运行,`done` 表示正常完成,`canceled` 表示任务失败
+- `err`:如果该任务失败,该列为失败的原因,否则为空。例如 `manually stopped` 表示用户执行 `CANCEL TRAFFIC JOBS` 手动取消任务
输出示例:
@@ -228,7 +237,7 @@ tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --passwor
"output": "/tmp/traffic",
"progress": "25%",
"status": "canceled",
- "error": "canceled manually"
+ "error": "manually stopped"
},
{
"type": "capture",
diff --git a/tiproxy/tiproxy-configuration.md b/tiproxy/tiproxy-configuration.md
index 1aceafe64ed1..33533b6560c0 100644
--- a/tiproxy/tiproxy-configuration.md
+++ b/tiproxy/tiproxy-configuration.md
@@ -137,7 +137,7 @@ TiProxy 的高可用配置。
+ 默认值:`""`
+ 支持热加载:否
-+ 指定虚拟 IP 地址,使用 CIDR 格式表示,例如 `"10.0.1.10/24"`。当集群中部署了多台 TiProxy 时,只有一台 TiProxy 会绑定虚拟 IP。当该 TiProxy 下线时,另外一台 TiProxy 会自动绑定该 IP,确保客户端始终能通过虚拟 IP 连接到可用的 TiProxy。
++ 指定虚拟 IP 地址,使用 CIDR 格式表示,例如 `"10.0.1.10/24"`。当集群中有多台 TiProxy 配置同一虚拟 IP 时,只有一台 TiProxy 会绑定该虚拟 IP。当该 TiProxy 下线时,另外一台 TiProxy 会自动绑定该 IP,确保客户端始终能通过虚拟 IP 连接到可用的 TiProxy。
配置示例:
@@ -148,6 +148,8 @@ server_configs:
ha.interface: "eth0"
```
+当需要隔离计算层资源时,可以配置多个虚拟 IP,并结合使用[基于标签的负载均衡](/tiproxy/tiproxy-load-balance.md#基于标签的负载均衡)。示例可参见[基于标签的负载均衡](/tiproxy/tiproxy-load-balance.md#基于标签的负载均衡)。
+
> **注意:**
>
> - 虚拟 IP 仅支持 Linux 操作系统。
@@ -249,10 +251,26 @@ TLS 对象字段:
- 设置 `cert`、`key` 或 `auto-certs` 后支持 TLS 连接,否则不支持 TLS 连接。
- 可选:如果 `ca` 不为空,则启用服务器端的客户端验证。客户端必须提供证书。如果 `skip-ca` 为 `true` 且 `ca` 不为空,则服务器仅在客户端提供证书时才验证客户端证书。
+#### `cert-allowed-cn`
+
++ 默认值:`""`
++ 支持热加载:是
++ 当其他组件通过 TLS 连接 TiProxy 的 [HTTP 状态端口](#api)时,TiProxy 可通过校验调用者证书中的 `Common Name` 以防止非法访问者访问。该配置项指定了合法的调用者的 `Common Name` 列表。设置了该配置项后,`server-http-tls` 必须要开启 TLS,否则该配置项不生效。关于组件间认证调用者身份的详细信息,请参见[认证组件调用者身份](/enable-tls-between-components.md#认证组件调用者身份)。
+
#### `cluster-tls`
客户端 TLS 对象。用于访问 TiDB 或 PD。
+#### `encryption-key-path`
+
++ 默认值:`""`
++ 支持热加载:是
++ 指定流量捕获时用于加密流量文件的密钥的文件路径。该文件须包含一个 256 位(32 字节)的十六进制字符串,并以换行符结尾(即 \n),且不包含其他任何内容。密钥文件示例如下:
+
+```
+3b5896b5be691006e0f71c3040a29495ddcad20b14aff61806940ebd780d3c62
+```
+
#### `require-backend-tls`
+ 默认值:`false`
diff --git a/tiproxy/tiproxy-load-balance.md b/tiproxy/tiproxy-load-balance.md
index 37350cdb215f..4a567e77274d 100644
--- a/tiproxy/tiproxy-load-balance.md
+++ b/tiproxy/tiproxy-load-balance.md
@@ -38,10 +38,11 @@ TiProxy 定时通过 SQL 端口和状态端口检查 TiDB 是否已下线或正
例如,若应用包含交易和 BI 两类业务,为了避免相互影响,可以按照如下方式配置集群:
1. 在 TiProxy 上配置 [`balance.label-name`](/tiproxy/tiproxy-configuration.md#label-name) 为 `"app"`,表示将按照标签名 `"app"` 匹配 TiDB server,并将连接路由到相同标签值的 TiDB server 上。
-2. 配置 2 台 TiProxy 实例,分别为配置项 [`labels`](/tiproxy/tiproxy-configuration.md#labels) 加上 `"app"="Order"` 和 `"app"="BI"`。
-3. 将 TiDB 实例分为 2 组,分别为配置项 [`labels`](/tidb-configuration-file.md#labels) 加上 `"app"="Order"` 和 `"app"="BI"`。
-4. 如果需要同时隔离存储层的资源,可配置 [Placement Rules](/configure-placement-rules.md) 或[资源管控](/tidb-resource-control.md)。
-5. 交易和 BI 业务的客户端分别连接到 2 台 TiProxy 的地址。
+2. 配置至少 2 台 TiProxy 实例,用于交易业务的 TiProxy 实例配置 [`labels`](/tiproxy/tiproxy-configuration.md#labels) 为 `{"app"="Order"}`;用于 BI 业务的实例配置 [`labels`](/tiproxy/tiproxy-configuration.md#labels) 为 `{"app"="BI"}`。
+3. 如果同时需要 TiProxy 的高可用,配置至少 4 台 TiProxy 实例,不同业务的实例配置不同的虚拟 IP。例如用于交易业务的 2 台 TiProxy 实例配置虚拟 IP `10.0.1.10/24`,用于 BI 业务的 2 台 TiProxy 实例配置虚拟 IP `10.0.1.20/24`。
+4. 将 TiDB 实例分为 2 组,分别为配置项 [`labels`](/tidb-configuration-file.md#labels) 加上 `"app"="Order"` 和 `"app"="BI"`。
+5. 如果需要同时隔离存储层的资源,可配置 [Placement Rules](/configure-placement-rules.md) 或[资源管控](/tidb-resource-control-ru-groups.md)。
+6. 交易和 BI 业务的客户端分别连接到 2 个虚拟 IP 地址。
@@ -58,23 +59,37 @@ server_configs:
tiproxy_servers:
- host: tiproxy-host-1
config:
- labels: {app: "Order"}
+ labels: {"app": "Order"}
+ ha.virtual-ip: "10.0.1.10/24"
+ ha.interface: "eth0"
- host: tiproxy-host-2
config:
- labels: {app: "BI"}
+ labels: {"app": "Order"}
+ ha.virtual-ip: "10.0.1.10/24"
+ ha.interface: "eth0"
+ - host: tiproxy-host-3
+ config:
+ labels: {"app": "BI"}
+ ha.virtual-ip: "10.0.1.20/24"
+ ha.interface: "eth0"
+ - host: tiproxy-host-4
+ config:
+ labels: {"app": "BI"}
+ ha.virtual-ip: "10.0.1.20/24"
+ ha.interface: "eth0"
tidb_servers:
- host: tidb-host-1
config:
- labels: {app: "Order"}
+ labels: {"app": "Order"}
- host: tidb-host-2
config:
- labels: {app: "Order"}
+ labels: {"app": "Order"}
- host: tidb-host-3
config:
- labels: {app: "BI"}
+ labels: {"app": "BI"}
- host: tidb-host-4
config:
- labels: {app: "BI"}
+ labels: {"app": "BI"}
tikv_servers:
- host: tikv-host-1
- host: tikv-host-2
diff --git a/tiproxy/tiproxy-traffic-replay.md b/tiproxy/tiproxy-traffic-replay.md
index ade5e33e2bc3..9d90d8d90b09 100644
--- a/tiproxy/tiproxy-traffic-replay.md
+++ b/tiproxy/tiproxy-traffic-replay.md
@@ -5,11 +5,7 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
# TiProxy 流量回放
-> **警告:**
->
-> TiProxy 流量回放目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tiproxy/issues) 反馈。
-
-从 TiProxy v1.3.0 开始,你可以使用 TiProxy 捕获 TiDB 生产集群中的访问流量,并在测试集群中按照指定的速率回放这些流量。通过该功能,你可以在测试环境中重现生产集群的实际工作负载,从而验证所有 SQL 的执行结果和性能表现。
+从 TiProxy v1.4.0 开始,你可以使用 TiProxy 捕获 TiDB 生产集群中的访问流量,并在测试集群中按照指定的速率回放这些流量。通过该功能,你可以在测试环境中重现生产集群的实际工作负载,从而验证所有 SQL 的执行结果和性能表现。
@@ -29,6 +25,60 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
## 使用步骤
+在 TiDB v9.0.0 之前,仅支持使用 `tiproxyctl` 连接 TiProxy 进行流量捕获和回放。从 TiDB v9.0.0 开始,建议使用 SQL 捕获和回放流量。
+
+
+
+
+1. 准备测试环境:
+
+ 1. 创建测试集群,详情参考[使用 TiUP 部署 TiDB 集群](/production-deployment-using-tiup.md)。
+ 2. 同步生产集群的数据到测试集群,详情参考[数据迁移概述](/migration-overview.md)。
+ 3. 在测试集群中运行 [`ANALYZE`](/sql-statements/sql-statement-analyze-table.md) 更新统计信息。
+
+2. 使用 [`TRAFFIC CAPTURE`](/sql-statements/sql-statement-traffic-capture.md) 语句捕获流量。
+
+ TiProxy 支持捕获流量到本地和外部存储。捕获到本地时,需要在捕获之后把流量文件手动复制到回放的 TiProxy 集群上,而使用外部存储时不需要手动复制。TiProxy 支持的外部存储包括 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage,或者实现 S3 协议的其他文件存储服务。关于外部存储,请参见[外部存储服务的 URI 格式](/external-storage-uri.md)。
+
+ 捕获流量需要当前用户具备 `SUPER` 或 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+ > **注意:**
+ >
+ > - TiProxy 会捕获所有连接上的流量,包括已创建的和新创建的连接。
+ > - TiProxy 的 CPU 使用率越高,捕获流量对 QPS 的影响越大。为减少对生产集群的影响,建议预留至少 30% 的 CPU,此时平均 QPS 下降约 3%。有关详细性能数据,请参阅[捕获流量测试](/tiproxy/tiproxy-performance-test.md#捕获流量测试)。
+ > - 再次捕获流量时,上次的流量文件不会自动删除,需要手动删除。
+
+ 例如,以下语句使所有 TiProxy 实例捕获一个小时的流量,并将流量保存到 TiProxy 实例的 `/tmp/traffic` 目录下:
+
+ ```sql
+ TRAFFIC CAPTURE TO "/tmp/traffic" DURATION="1h"
+ ```
+
+ 流量文件会自动转轮和压缩。更多选项,请参考 [`TRAFFIC CAPTURE`](/sql-statements/sql-statement-traffic-capture.md)。
+
+3. 如果流量文件捕获到 TiProxy 本机上,需要将流量文件目录复制到测试集群的 TiProxy 实例上。
+
+4. 使用 [`TRAFFIC REPLAY`](/sql-statements/sql-statement-traffic-replay.md) 语句回放流量。
+
+ 捕获流量需要当前用户具备 `SUPER` 或 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+ 默认配置下,SQL 语句的执行速率与生产集群相同,数据库连接也与生产集群一一对应,以模拟生产集群的负载。
+
+ 例如,如下 SQL 通过用户名 `u1` 和密码 `123456` 连接到所有 TiProxy 实例,并从各实例的 `/tmp/traffic` 目录下读取流量文件并回放流量:
+
+ ```sql
+ TRAFFIC REPLAY FROM "/tmp/traffic" USER="u1" PASSWORD="123456"
+ ```
+
+ 由于所有流量在用户 `u1` 下运行,请确保 `u1` 能访问所有数据库和表。如果用户不存在,则需要创建。如果生产集群有[资源组](/tidb-resource-control-ru-groups.md#管理资源组),那么回放时 TiProxy 会自动将每个会话的资源组设置为与捕获时相同。因此,要为 `u1` 配置 [`SET RESOURCE GROUP`](/sql-statements/sql-statement-set-resource-group.md) 的[权限](/sql-statements/sql-statement-set-resource-group.md#权限)。
+
+ 如果回放所有语句,再次回放前可能需要恢复数据到上次回放之前,以避免数据重复引起的报错。也可以加上 `READ_ONLY=true` 选项,只回放只读语句,避免每次回放前恢复数据。
+
+ 更多信息,请参考 [`TRAFFIC REPLAY`](/sql-statements/sql-statement-traffic-replay.md)。
+
+
+
+
1. 准备测试环境:
1. 创建测试集群,详情参考[使用 TiUP 部署 TiDB 集群](/production-deployment-using-tiup.md)。
@@ -38,11 +88,12 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
2. 使用 [`tiproxyctl traffic capture`](/tiproxy/tiproxy-command-line-flags.md#traffic-capture) 命令连接到生产集群的 TiProxy 实例,开始捕获流量。
+ TiProxy 支持捕获流量到本地和外部存储。捕获到本地时,需要在捕获之后把流量文件手动复制到回放的 TiProxy 集群上,而使用外部存储时不需要手动复制。TiProxy 支持的外部存储包括 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage,或者实现 S3 协议的其他文件存储服务。关于外部存储,请参见[外部存储服务的 URI 格式](/external-storage-uri.md)。
+
> **注意:**
>
> - TiProxy 会捕获所有连接上的流量,包括已创建的和新创建的连接。
- > - 在 TiProxy 主备模式下,请确保连接到 TiProxy 主实例。
- > - 如果 TiProxy 配置了虚拟 IP,建议连接到虚拟 IP 地址。
+ > - 如果 TiProxy 配置了虚拟 IP,建议连接到虚拟 IP 地址。如果有多台活跃的 TiProxy 实例,需要连接到每一台 TiProxy 实例执行。
> - TiProxy 的 CPU 使用率越高,捕获流量对 QPS 的影响越大。为减少对生产集群的影响,建议预留至少 30% 的 CPU,此时平均 QPS 下降约 3%。有关详细性能数据,请参阅[捕获流量测试](/tiproxy/tiproxy-performance-test.md#捕获流量测试)。
> - 再次捕获流量时,上次的流量文件不会自动删除,需要手动删除。
@@ -52,19 +103,12 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
tiproxyctl traffic capture --host 10.0.1.10 --port 3080 --output="/tmp/traffic" --duration=1h
```
- 流量文件会自动转轮和压缩。`/tmp/traffic` 目录下的文件示例如下:
-
- ```shell
- ls /tmp/traffic
- # meta traffic-2024-08-29T17-37-12.477.log.gz traffic-2024-08-29T17-43-11.166.log.gz traffic.log
- ```
-
- 更多信息,请参考 [`tiproxyctl traffic capture`](/tiproxy/tiproxy-command-line-flags.md#traffic-capture)。
+ 流量文件会自动转轮和压缩。更多选项,请参考 [`tiproxyctl traffic capture`](/tiproxy/tiproxy-command-line-flags.md#traffic-capture)。
3. 将流量文件目录复制到测试集群的 TiProxy 实例上。
4. 使用 [`tiproxyctl traffic replay`](/tiproxy/tiproxy-command-line-flags.md#traffic-replay) 连接到测试集群的 TiProxy 实例,开始回放流量。
- 默认配置下,SQL 语句的执行速率与生产集群相同,数据库连接也与生产集群一一对应,以模拟生产集群的负载,并保证事务的执行顺序一致。
+ 默认配置下,SQL 语句的执行速率与生产集群相同,数据库连接也与生产集群一一对应,以模拟生产集群的负载。
例如,如下命令通过用户名 `u1` 和密码 `123456` 连接到 TiProxy 实例 `10.0.1.10:3080`,从 TiProxy 实例的 `/tmp/traffic` 目录下读取流量文件并回放流量:
@@ -72,72 +116,94 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --password="123456" --input="/tmp/traffic"
```
- 由于所有流量在用户 `u1` 下运行,请确保 `u1` 能访问所有数据库和表。如果没有这样的用户,则需要创建一个。
+ 由于所有流量在用户 `u1` 下运行,请确保 `u1` 能访问所有数据库和表。如果用户不存在,则需要创建。如果生产集群有[资源组](/tidb-resource-control-ru-groups.md#管理资源组),那么回放时 TiProxy 会自动将每个会话的资源组设置为与捕获时相同。因此,要为 `u1` 配置 [`SET RESOURCE GROUP`](/sql-statements/sql-statement-set-resource-group.md) 的[权限](/sql-statements/sql-statement-set-resource-group.md#权限)。
+
+ 如果回放所有语句,再次回放前可能需要恢复数据到上次回放之前,以减少报错。也可以加上 `--read-only=true` 选项,只回放只读语句,避免每次回放前恢复数据。
更多信息,请参考 [`tiproxyctl traffic replay`](/tiproxy/tiproxy-command-line-flags.md#traffic-replay)。
-5. 查看回放报告。
+
+
- 回放完成后,报告存储在测试集群的 `tiproxy_traffic_replay` 数据库下。该数据库包含两个表 `fail` 和 `other_errors`。
+## 查看回放报告
- `fail` 表存储运行失败的 SQL 语句,字段说明如下:
+回放完成后,报告存储在测试集群的 `tiproxy_traffic_replay` 数据库下。该数据库包含两个表 `fail` 和 `other_errors`。
- - `cmd_type`:运行错误的命令类型,例如 `Query`(执行普通语句)、`Prepare`(预处理语句)、`Execute`(执行预处理语句)。
- - `digest`:执行失败的 SQL 语句的指纹。
- - `sample_stmt`:SQL 语句首次执行失败时的 SQL 文本。
- - `sample_err_msg`:SQL 语句执行失败的报错信息。
- - `sample_conn_id`:SQL 语句在流量文件中记录的连接 ID,可用于在流量文件中查看 SQL 语句的执行上下文。
- - `sample_capture_time`:SQL 语句在流量文件中记录的执行时间,可用于在流量文件中查看 SQL 语句的执行上下文。
- - `sample_replay_time`:SQL 语句在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
- - `count`:SQL 语句执行失败的次数。
+`fail` 表存储运行失败的 SQL 语句,字段说明如下:
- 以下是 `fail` 表的输出示例:
+- `replay_start_time`:回放任务的开始时间,用于唯一标识一次回放任务。可用于过滤回放任务。
+- `cmd_type`:运行错误的命令类型,例如 `Query`(执行普通语句)、`Prepare`(预处理语句)、`Execute`(执行预处理语句)。
+- `digest`:执行失败的 SQL 语句的指纹。
+- `sample_stmt`:SQL 语句首次执行失败时的 SQL 文本。
+- `sample_err_msg`:SQL 语句执行失败的报错信息。
+- `sample_conn_id`:SQL 语句在流量文件中记录的连接 ID,可用于在流量文件中查看 SQL 语句的执行上下文。
+- `sample_capture_time`:SQL 语句在流量文件中记录的执行时间,可用于在流量文件中查看 SQL 语句的执行上下文。
+- `sample_replay_time`:SQL 语句在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
+- `count`:SQL 语句执行失败的次数。
- ```sql
- SELECT * FROM tiproxy_traffic_replay.fail LIMIT 1\G
- ```
+以下是 `fail` 表的输出示例:
- ```
- *************************** 1. row ***************************
- cmd_type: StmtExecute
- digest: 89c5c505772b8b7e8d5d1eb49f4d47ed914daa2663ed24a85f762daa3cdff43c
- sample_stmt: INSERT INTO new_order (no_o_id, no_d_id, no_w_id) VALUES (?, ?, ?) params=[3077 6 1]
- sample_err_msg: ERROR 1062 (23000): Duplicate entry '1-6-3077' for key 'new_order.PRIMARY'
- sample_conn_id: 1356
- sample_capture_time: 2024-10-17 12:59:15
- sample_replay_time: 2024-10-17 13:05:05
- count: 4
- ```
+```sql
+SELECT * FROM tiproxy_traffic_replay.fail LIMIT 1\G
+```
- `other_errors` 表存储其他未预期错误,例如网络错误、连接数据库错误。字段说明如下:
+```
+*************************** 1. row ***************************
+ replay_start_time: 2024-10-17 13:05:03
+ cmd_type: StmtExecute
+ digest: 89c5c505772b8b7e8d5d1eb49f4d47ed914daa2663ed24a85f762daa3cdff43c
+ sample_stmt: INSERT INTO new_order (no_o_id, no_d_id, no_w_id) VALUES (?, ?, ?) params=[3077 6 1]
+ sample_err_msg: ERROR 1062 (23000): Duplicate entry '1-6-3077' for key 'new_order.PRIMARY'
+ sample_conn_id: 1356
+sample_capture_time: 2024-10-17 12:59:15
+ sample_replay_time: 2024-10-17 13:05:05
+ count: 4
+```
- - `err_type`:错误的类型,是一个简短的错误信息,例如 `i/o timeout`。
- - `sample_err_msg`:错误首次出现时的完整错误信息。
- - `sample_replay_time`:错误在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
- - `count`:错误出现的次数。
+`other_errors` 表存储其他未预期错误,例如网络错误、连接数据库错误。字段说明如下:
- 以下是 `other_errors` 表的输出示例:
+- `replay_start_time`:回放任务的开始时间,用于唯一标识一次回放任务。可用于过滤回放任务。
+- `err_type`:错误的类型,是一个简短的错误信息,例如 `i/o timeout`。
+- `sample_err_msg`:错误首次出现时的完整错误信息。
+- `sample_replay_time`:错误在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
+- `count`:错误出现的次数。
- ```sql
- SELECT * FROM tiproxy_traffic_replay.other_errors LIMIT 1\G
- ```
+以下是 `other_errors` 表的输出示例:
- ```
- *************************** 1. row ***************************
- err_type: failed to read the connection: EOF
- sample_err_msg: this is an error from the backend connection: failed to read the connection: EOF
- sample_replay_time: 2024-10-17 12:57:39
- count: 1
- ```
+```sql
+SELECT * FROM tiproxy_traffic_replay.other_errors LIMIT 1\G
+```
- > **注意:**
- >
- > - `tiproxy_traffic_replay` 中的表结构在未来版本中可能会改变。不推荐在应用程序开发或工具开发中读取 `tiproxy_traffic_replay` 中的数据。
- > - 回放不保证连接之间的事务执行顺序与捕获时完全一致,因此可能会误报错误。
- > - 再次回放时,上一次的回放报告不会自动删除,需要手动删除。
+```
+*************************** 1. row ***************************
+ replay_start_time: 2024-10-17 12:57:35
+ err_type: failed to read the connection: EOF
+ sample_err_msg: this is an error from the backend connection: failed to read the connection: EOF
+sample_replay_time: 2024-10-17 12:57:39
+ count: 1
+```
+
+> **注意:**
+>
+> - `tiproxy_traffic_replay` 中的表结构在未来版本中可能会改变。不推荐在应用程序开发或工具开发中读取 `tiproxy_traffic_replay` 中的数据。
+> - 回放不保证连接之间的事务执行顺序与捕获时完全一致,因此可能会误报错误。
## 测试吞吐量
+
+
+
+如果需要测试集群的吞吐量,可以使用 `SPEED` 选项调整回放的速率。
+
+例如,`SPEED=2` 会使 SQL 语句以两倍速率执行,总回放时间缩短一半:
+
+```sql
+TRAFFIC REPLAY FROM "/tmp/traffic" USER="u1" PASSWORD="123456" SPEED=2
+```
+
+
+
+
如果需要测试集群的吞吐量,可以使用 `--speed` 选项调整回放的速率。
例如,`--speed=2` 会使 SQL 语句以两倍速率执行,总回放时间缩短一半:
@@ -146,10 +212,55 @@ summary: 介绍 TiProxy 的流量回放的使用场景和使用步骤。
tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --password="123456" --input="/tmp/traffic" --speed=2
```
+
+
+
调大回放速率只会缩短 SQL 语句之间的空闲时间,不会增加连接数。因此当会话的空闲时间本身较短时,仅调大倍速可能无法有效提升吞吐量。在这种情况下,可以部署多个 TiProxy 实例,让它们同时回放相同的流量文件,通过增加并发度来提高吞吐量。
## 任务查看与管理
+
+
+
+在捕获和回放过程中,如果遇到未知错误会自动停止任务。使用 [`SHOW TRAFFIC JOBS`](/sql-statements/sql-statement-show-traffic-jobs.md) 可查看当前的任务进度或上次任务的错误信息:
+
+```sql
+SHOW TRAFFIC JOBS
+```
+
+当前用户拥有的权限不同,执行该语句显示结果也不同。
+
+- 如果用户有 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限,执行该语句显示流量捕获任务。
+- 如果用户有 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限,执行该语句显示流量回放任务。
+- 如果用户有 `SUPER` 权限或同时具有上述两种权限,执行该语句同时显示流量捕获和流量回放任务。
+
+例如,如下输出代表有 2 台 TiProxy 正在捕获流量:
+
+```
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| START_TIME | END_TIME | INSTANCE | TYPE | PROGRESS | STATUS | FAIL_REASON |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+| 2024-12-17 10:54:41.000000 | | 10.1.0.10:3080 | capture | 45% | running | |
+| 2024-12-17 10:54:41.000000 | | 10.1.0.11:3080 | capture | 45% | running | |
++----------------------------+----------+----------------+---------+----------+---------+-------------+
+2 rows in set (0.01 sec)
+```
+
+更多信息,请参考 [`SHOW TRAFFIC JOBS`](/sql-statements/sql-statement-show-traffic-jobs.md)。
+
+如果需要取消当前的捕获或回放任务,可使用 [`CANCEL TRAFFIC JOBS`](/sql-statements/sql-statement-cancel-traffic-jobs.md):
+
+```sql
+CANCEL TRAFFIC JOBS
+```
+
+取消捕获任务需要 `SUPER` 或 [`TRAFFIC_CAPTURE_ADMIN`](/privilege-management.md#动态权限) 权限,取消回放任务需要 `SUPER` 或 [`TRAFFIC_REPLAY_ADMIN`](/privilege-management.md#动态权限) 权限。
+
+更多信息,请参考 [`CANCEL TRAFFIC JOBS`](/sql-statements/sql-statement-cancel-traffic-jobs.md)。
+
+
+
+
在捕获和回放过程中,如果遇到未知错误会自动停止任务。使用 [`tiproxyctl traffic show`](/tiproxy/tiproxy-command-line-flags.md#traffic-show) 命令可查看当前的任务进度或上次任务的错误信息:
```shell
@@ -181,12 +292,22 @@ tiproxyctl traffic cancel --host 10.0.1.10 --port 3080
更多信息,请参考 [`tiproxyctl traffic cancel`](/tiproxy/tiproxy-command-line-flags.md#traffic-cancel)。
+
+
+
## 使用限制
- TiProxy 仅支持回放 TiProxy 捕获的流量文件,不支持其他文件格式,因此生产集群必须先使用 TiProxy 捕获流量。
-- TiProxy 不支持过滤 SQL 类型,DML 和 DDL 语句也会被回放,因此重新回放前需要将集群数据恢复到回放前的状态。
-- 由于 TiProxy 使用同一个用户名回放流量,因此无法测试[资源管控](/tidb-resource-control.md)和[权限管理](/privilege-management.md)。
- 不支持回放 [`LOAD DATA`](/sql-statements/sql-statement-load-data.md) 语句。
+- 为安全原因,以下语句和命令不会被捕获和回放:
+
+ - `CREATE USER` 语句
+ - `ALTER USER` 语句
+ - `SET PASSWORD` 语句
+ - `GRANT` 语句
+ - `BACKUP` 语句
+ - `RESTORE` 语句
+ - `IMPORT` 语句
## 资源