Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refine BR words #12022

Merged
merged 28 commits into from
Nov 28, 2022
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b4967cb
refine br word
IANTHEREAL Nov 16, 2022
9145131
refine BR word
IANTHEREAL Nov 16, 2022
72802fc
replace BR with br command-line tool
shichun-0415 Nov 22, 2022
8fd8de3
Merge branch 'master' into ian/br-adjust
shichun-0415 Nov 22, 2022
1ebe6e3
fix typo
Oreoxmt Nov 23, 2022
e9f5c3c
fix format
Oreoxmt Nov 24, 2022
e117a96
remove -
Oreoxmt Nov 24, 2022
bc17b94
remove duplicate 。
Oreoxmt Nov 24, 2022
d478b15
remove duplicate -
Oreoxmt Nov 24, 2022
0ac49fa
replace BR with br command-lin
shichun-0415 Nov 28, 2022
22c1934
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
5520f06
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
44ffe47
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
04de712
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
3d417e2
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
0ec6dd5
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
c76de86
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
48183be
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
a44b087
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
68060aa
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
582138b
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
d443881
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
7a7be15
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
1d667e7
Apply suggestions from code review
IANTHEREAL Nov 28, 2022
e8cf9d3
ci
shichun-0415 Nov 28, 2022
9642488
fix format
IANTHEREAL Nov 28, 2022
ec64f7d
Apply suggestions from code review
shichun-0415 Nov 28, 2022
ae3fb28
Apply suggestions from code review
shichun-0415 Nov 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion br/backup-and-restore-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ summary: 了解 TiDB 的备份与恢复功能的架构设计。

# TiDB 备份与恢复功能架构概述

正如 [TiDB 备份与恢复概述](/br/backup-and-restore-overview.md)所介绍,TiDB 备份恢复功能包含了多种不同类型的集群数据对象的备份与恢复实现。这些功能都以 BR 和 TiDB Operator 为使用入口,创建相应的任务从 TiKV 节点上备份数据,或者恢复数据到 TiKV 节点。
正如 [TiDB 备份与恢复概述](/br/backup-and-restore-overview.md)所介绍,TiDB 备份恢复功能包含了多种不同类型的集群数据对象的备份与恢复实现。这些功能都以 br 命令行工具和 TiDB Operator 为使用入口,创建相应的任务从 TiKV 节点上备份数据,或者恢复数据到 TiKV 节点。

关于各种备份恢复功能的实现架构,请参考以下链接:

Expand Down
20 changes: 10 additions & 10 deletions br/backup-and-restore-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ TiDB 备份恢复功能可以用于满足以下业务的需求:

全量备份是对集群某个时间点的全量数据进行备份。TiDB 支持以下方式的全量备份:

- 快照数据备份:TiDB 集群快照数据包含某个物理时间点上集群满足事务一致性的所有数据。BR 支持备份集群快照数据,使用请参考[快照备份](/br/br-snapshot-guide.md#对集群进行快照备份)。
- 快照数据备份:TiDB 集群快照数据包含某个物理时间点上集群满足事务一致性的所有数据。br 命令行工具支持备份集群快照数据,使用请参考[快照备份](/br/br-snapshot-guide.md#对集群进行快照备份)。

全量备份一般会占用不小的存储空间,且只包含某个时间点的集群数据。如果你需要灵活的选择恢复的时间点,即实现 PITR,可以按以下说明同时使用两种备份方式:

Expand All @@ -61,11 +61,11 @@ TiDB 备份恢复功能可以用于满足以下业务的需求:

- 恢复到集群的历史任意时间点 (PITR)

- 通过 `br restore point` 功能。你可以指定要恢复的时间点,恢复时间点之前最近的快照数据备份,以及日志备份数据。br 会自动判断和读取恢复需要的数据,然后将这些数据依次恢复到指定的集群。
- 通过 `br restore point` 功能。你可以指定要恢复的时间点,恢复时间点之前最近的快照数据备份,以及日志备份数据。br 命令行工具会自动判断和读取恢复需要的数据,然后将这些数据依次恢复到指定的集群。

#### 恢复的性能

- 恢复集群快照数据备份,速度可以达到单 TiKV 存储节点 100 MiB/s,恢复速度具有可扩展性;BR 只支持恢复数据到新集群,会尽可能多的使用恢复集群的资源。更详细说明请参考[恢复性能和影响](/br/br-snapshot-guide.md#快照恢复的性能与影响)。
- 恢复集群快照数据备份,速度可以达到单 TiKV 存储节点 100 MiB/s,恢复速度具有可扩展性;br 命令行工具只支持恢复数据到新集群,会尽可能多的使用恢复集群的资源。更详细说明请参考[恢复性能和影响](/br/br-snapshot-guide.md#快照恢复的性能与影响)。
- 恢复日志备份数据,速度可以达到 30 GiB/h。更详细说明请参考 [PITR 性能和影响](/br/br-pitr-guide.md#pitr-的性能与影响)。

## 备份存储
Expand All @@ -88,7 +88,7 @@ TiDB 支持将数据备份到 Amazon S3、Google Cloud Storage (GCS)、Azure Blo

进行快照恢复

- BR 恢复数据时会尽可能多地占用恢复集群的资源,因此推荐恢复数据到新集群或离线集群。应避免向正在提供服务的生产集群执行恢复,否则,恢复期间会对业务产生不可避免的影响。其中 PITR 仅支持恢复到空集群。
- br 命令行工具恢复数据时会尽可能多地占用恢复集群的资源,因此推荐恢复数据到新集群或离线集群。应避免向正在提供服务的生产集群执行恢复,否则,恢复期间会对业务产生不可避免的影响。其中 PITR 仅支持恢复到空集群。

进行 PITR

Expand All @@ -98,27 +98,27 @@ TiDB 支持将数据备份到 Amazon S3、Google Cloud Storage (GCS)、Azure Blo
备份存储和网络配置

- 推荐使用支持 S3、GCS 或 Azure Blob Storage 协议的存储系统保存备份数据;
- 应确保 BR、TiKV 节点和备份存储系统有足够的网络带宽,备份存储系统能提供足够的写入和读取性能,否则,它们有可能成为备份恢复时的性能瓶颈。
- 应确保 br 命令行工具、TiKV 节点和备份存储系统有足够的网络带宽,备份存储系统能提供足够的写入和读取性能,否则,它们有可能成为备份恢复时的性能瓶颈。

### 兼容性

在使用 BR 之前,需要先了解 BR 与其他功能的兼容性以及使用限制
在使用备份恢复功能之前,需要先了解 br 命令行工具与其他功能的兼容性以及使用限制

#### 与其他功能的兼容性

某些功能在开启或关闭状态下,会导致 BR 功能使用出错。因此需要保证恢复集群的这些配置,与备份集群备份时的配置相同。
某些功能在开启或关闭状态下,会导致备份恢复功能使用出错。因此需要保证恢复集群的这些配置,与备份集群备份时的配置相同。

| 功能 | 相关 issue | 解决方式 |
| ---- | ---- | ----- |
|GBK charset|| BR 在 v5.4.0 之前不支持恢复 `charset=GBK` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GBK` 的表到 v5.4.0 之前的 TiDB 集群。|
|GBK charset|| br 命令行工具在 v5.4.0 之前不支持恢复 `charset=GBK` 的表。并且,任何版本的 br 命令行工具都不支持恢复 `charset=GBK` 的表到 v5.4.0 之前的 TiDB 集群。|
| 聚簇索引 | [#565](https://github.com/pingcap/br/issues/565) | 确保恢复时集群的 `tidb_enable_clustered_index` 全局变量和备份时一致,否则会导致数据不一致的问题,例如 `default not found` 和数据索引不一致。 |
| New collation | [#352](https://github.com/pingcap/br/issues/352) | 确保恢复时集群的 `new_collations_enabled_on_first_bootstrap` 变量值和备份时的一致,否则会导致数据索引不一致和 checksum 通不过。更多信息,请参考 [FAQ - BR 为什么会报 `new_collations_enabled_on_first_bootstrap` 不匹配?](/faq/backup-and-restore-faq.md#br-为什么会报-new_collations_enabled_on_first_bootstrap-不匹配)。 |
| 全局临时表 | | 确保使用 BR v5.3.0 及以上版本进行备份和恢复,否则会导致全局临时表的表定义错误。 |
| 全局临时表 | | 确保使用 br v5.3.0 及以上版本进行备份和恢复,否则会导致全局临时表的表定义错误。 |
| TiDB Lightning Physical Import| |上游数据库使用 TiDB Lightning Physical 方式导入的数据,无法作为数据日志备份下来。推荐在数据导入后执行一次全量备份,细节参考[上游数据库使用 TiDB Lightning Physical 方式导入数据的恢复](/faq/backup-and-restore-faq.md#上游数据库使用-tidb-lightning-physical-方式导入数据时为什么无法使用日志备份功能)。|

#### 版本间兼容性

BR 内置版本会在执行备份和恢复操作前,对 TiDB 集群版本和自身版本进行对比检查。如果版本之间不兼容,BR 会提示报错并退出。如要跳过版本检查,可以通过设置 `--check-requirements=false` 强行跳过版本检查。需要注意的是,跳过检查可能会遇到版本不兼容的问题。
br 命令行工具内置版本会在执行备份和恢复操作前,对 TiDB 集群版本和自身版本进行对比检查。如果版本之间不兼容,br 命令行工具会提示报错并退出。如要跳过版本检查,可以通过设置 `--check-requirements=false` 强行跳过版本检查。需要注意的是,跳过检查可能会遇到版本不兼容的问题。

| 恢复版本(横向)\ 备份版本(纵向) | 恢复到 TiDB v6.0 | 恢复到 TiDB v6.1| 恢复到 TiDB v6.2 | 恢复到 TiDB v6.3 |
| ---- | ---- | ---- | ---- | ---- |
Expand Down
34 changes: 17 additions & 17 deletions br/backup-and-restore-storages.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: 备份存储
summary: 了解 BR 支持的备份存储服务的 URL 格式、鉴权方案和使用方式。
summary: 了解 br 命令行工具支持的备份存储服务的 URL 格式、鉴权方案和使用方式。
aliases: ['/docs-cn/dev/br/backup-and-restore-storages/','/zh/tidb/dev/backup-storage-S3/','/zh/tidb/dev/backup-storage-azblob/','/zh/tidb/dev/backup-storage-gcs/']
---

Expand Down Expand Up @@ -125,10 +125,10 @@ TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS
<SimpleTab groupId="storage">
<div label="Amazon S3" value="amazon">

在备份之前,需要为 BR 访问 Amazon S3 中的备份目录设置相应的访问权限:
在备份之前,需要为 br 命令行工具访问 Amazon S3 中的备份目录设置相应的访问权限:

- 备份时 TiKV 和 BR 需要的访问备份数据目录的最小权限:`s3:ListBucket`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复时 TiKV 和 BR 需要的访问备份数据目录的最小权限:`s3:ListBucket` 和 `s3:GetObject`。
- 备份时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:`s3:ListBucket`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:`s3:ListBucket` 和 `s3:GetObject`。

如果你还没有创建备份数据保存目录,可以参考 [创建存储桶](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-bucket.html)在指定的区域中创建一个 S3 存储桶。如果需要使用文件夹,可以参考 [使用文件夹在 Amazon S3 控制台中组织对象](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-folder.html)在存储桶中创建一个文件夹。

Expand All @@ -138,14 +138,14 @@ TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS

如果指定访问密钥和秘密访问密钥,将按照指定的访问密钥和秘密访问密钥进行鉴权。除了在 URL 中指定密钥外,还支持以下方式:

- BR 读取 `$AWS_ACCESS_KEY_ID` 和 `$AWS_SECRET_ACCESS_KEY` 环境变量
- BR 读取 `$AWS_ACCESS_KEY` 和 `$AWS_SECRET_KEY` 环境变量
- BR 读取共享凭证文件,路径由 `$AWS_SHARED_CREDENTIALS_FILE` 环境变量指定
- BR 读取共享凭证文件,路径为 `~/.aws/credentials`
- br 命令行工具读取 `$AWS_ACCESS_KEY_ID` 和 `$AWS_SECRET_ACCESS_KEY` 环境变量
- br 命令行工具读取 `$AWS_ACCESS_KEY` 和 `$AWS_SECRET_KEY` 环境变量
- br 命令行工具读取共享凭证文件,路径由 `$AWS_SHARED_CREDENTIALS_FILE` 环境变量指定
- br 命令行工具读取共享凭证文件,路径为 `~/.aws/credentials`

- 方式二:基于 IAM Role 进行访问

为运行 TiKV 和 BR 的 EC2 实例关联一个配置了访问 S3 访问权限的 IAM role。正确设置后,BR 可以直接访问对应的 S3 中的备份目录,而不需要额外的设置。
为运行 TiKV 和 br 命令行工具的 EC2 实例关联一个配置了访问 S3 访问权限的 IAM role。正确设置后,br 命令行工具可以直接访问对应的 S3 中的备份目录,而不需要额外的设置。

```shell
br backup full --pd "${PD_IP}:2379" \
Expand All @@ -157,20 +157,20 @@ TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS

配置访问 GCS 的账户可以通过指定访问密钥的方式。如果指定了 `credentials-file` 参数,将按照指定的 `credentials-file` 进行鉴权。除了在 URL 中指定密钥文件外,还支持以下方式:

- BR 读取位于 `$GOOGLE_APPLICATION_CREDENTIALS` 环境变量所指定路径的文件内容
- BR 读取位于 `~/.config/gcloud/application_default_credentials.json` 的文件内容
- br 命令行工具读取位于 `$GOOGLE_APPLICATION_CREDENTIALS` 环境变量所指定路径的文件内容
- br 命令行工具读取位于 `~/.config/gcloud/application_default_credentials.json` 的文件内容
- 在 GCE 或 GAE 中运行时,从元数据服务器中获取的凭证

</div>
<div label="Azure Blob Storage" value="azure">

- 方式一:指定访问密钥

在 URL 配置 `account-name` 和 `account-key`,则使用该参数指定的密钥。除了在 URL 中指定密钥文件外,还支持 BR 读取 `$AZURE_STORAGE_KEY` 的方式。
在 URL 配置 `account-name` 和 `account-key`,则使用该参数指定的密钥。除了在 URL 中指定密钥文件外,还支持 br 命令行工具读取 `$AZURE_STORAGE_KEY` 的方式。

- 方式二:使用 Azure AD 备份恢复

BR 运行环境配置环境变量 `$AZURE_CLIENT_ID`、`$AZURE_TENANT_ID` 和 `$AZURE_CLIENT_SECRET`。
br 命令行工具运行环境配置环境变量 `$AZURE_CLIENT_ID`、`$AZURE_TENANT_ID` 和 `$AZURE_CLIENT_SECRET`。

- 当集群使用 TiUP 启动时,TiKV 会使用 systemd 服务。以下示例介绍如何为 TiKV 配置上述三个环境变量:

Expand Down Expand Up @@ -200,15 +200,15 @@ TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS
systemctl restart tikv-24000
```

- 为命令行启动的 TiKV 和 BR 配置 Azure AD 的信息,只需要确定运行环境中存在 `$AZURE_CLIENT_ID`、`$AZURE_TENANT_ID` 和 `$AZURE_CLIENT_SECRET`。通过运行下列命令行,可以确认 BR 和 TiKV 运行环境中是否存在这三个环境变量:
- 为命令行启动的 TiKV 和 br 命令行工具配置 Azure AD 的信息,只需要确定运行环境中存在 `$AZURE_CLIENT_ID`、`$AZURE_TENANT_ID` 和 `$AZURE_CLIENT_SECRET`。通过运行下列命令行,可以确认 br 命令行工具和 TiKV 运行环境中是否存在这三个环境变量:

```shell
echo $AZURE_CLIENT_ID
echo $AZURE_TENANT_ID
echo $AZURE_CLIENT_SECRET
```

- 使用 BR 将数据备份至 Azure Blob Storage:
- 使用 br 命令行工具将数据备份至 Azure Blob Storage:

```shell
./br backup full -u "${PD_IP}:2379" \
Expand All @@ -222,8 +222,8 @@ TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS

### Amazon S3 存储服务端加密备份数据

BR 支持对备份到 Amazon S3 的数据进行 S3 服务端加密 (SSE)。BR S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥,详细信息请参考 [BR S3 服务端加密](/encryption-at-rest.md#br-s3-服务端加密)。
TiDB 备份恢复功能支持对备份到 Amazon S3 的数据进行 S3 服务端加密 (SSE)。`br` S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥,详细信息请参考 [BR S3 服务端加密](/encryption-at-rest.md#br-s3-服务端加密)。

## 存储服务其他功能支持

v6.3.0 起,BR 支持 AWS S3 Object Lock 功能。你可以在 AWS 中开启 [S3 Object Lock](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html) 功能来防止备份数据写入后被修改或者删除。
`br` v6.3.0 支持 AWS S3 Object Lock 功能。你可以在 AWS 中开启 [S3 Object Lock](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html) 功能来防止备份数据写入后被修改或者删除。
18 changes: 9 additions & 9 deletions br/backup-and-restore-use-cases.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ aliases: ['/docs-cn/dev/br/backup-and-restore-use-cases/','/docs-cn/dev/referenc

通过 TiDB 提供的 PITR 功能,你可以满足业务团队的需求。

## 部署 TiDB 集群和 BR
## 部署 TiDB 集群和 br 命令行工具

使用 PITR 功能,需要部署 v6.2.0 或以上版本的 TiDB 集群,并且更新 BR 到与 TiDB 集群相同的版本,本文假设使用的是 v6.4.0 版本。
使用 PITR 功能,需要部署 v6.2.0 或以上版本的 TiDB 集群,并且更新 br 命令行工具到与 TiDB 集群相同的版本,本文假设使用的是 v6.4.0 版本。

下表介绍了在 TiDB 集群中使用日志备份功能的推荐配置。

Expand All @@ -26,20 +26,20 @@ aliases: ['/docs-cn/dev/br/backup-and-restore-use-cases/','/docs-cn/dev/referenc
| TiDB | 8 核+ | 16 GB+ | SAS | c5.2xlarge | 2 |
| PD | 8 核+ | 16 GB+ | SSD | c5.2xlarge | 3 |
| TiKV | 8 核+ | 32 GB+ | SSD | m5.2xlarge | 3 |
| BR | 8 核+ | 16 GB+ | SAS | c5.2xlarge | 1 |
| br cli | 8 核+ | 16 GB+ | SAS | c5.2xlarge | 1 |
| 监控 | 8 核+ | 16 GB+ | SAS | c5.2xlarge | 1 |

> **注意:**
>
> - BR 执行备份恢复功能需要访问 PD 和 TiKV,请确保 BR 与所有 PD 和 TiKV 连接正常。
> - BR 与 PD 所在服务器时区需要相同。
> - br 命令行工具执行备份恢复功能需要访问 PD 和 TiKV,请确保 br 命令行工具与所有 PD 和 TiKV 连接正常。
> - br 命令行工具与 PD 所在服务器时区需要相同。

使用 TiUP 部署或升级 TiDB 集群:

- 如果没有部署 TiDB 集群,请[部署 TiDB 集群](/production-deployment-using-tiup.md)。
- 如果已经部署的 TiDB 集群版本低于 v6.2.0,请[升级 TiDB 集群](/upgrade-tidb-using-tiup.md)。

使用 TiUP 安装或升级 BR
使用 TiUP 安装或升级 br 命令行工具

- 安装:

Expand Down Expand Up @@ -68,10 +68,10 @@ aliases: ['/docs-cn/dev/br/backup-and-restore-use-cases/','/docs-cn/dev/referenc
1. 创建 bucket。你也可以选择已有的 S3 bucket 来保存备份数据。如果没有可用的 bucket,可以参照 [AWS 官方文档](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-bucket.html)创建一个 S3 Bucket。本文使用的 bucket 名为 `tidb-pitr-bucket`。
2. 创建备份数据总目录。在上一步创建的 bucket(例如 `tidb-pitr-bucket`)下创建目录 `backup-data`,参考 [AWS 官方文档](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-folder.html)。

2. 配置 BR 和 TiKV 访问 S3 中的备份目录的权限。本文推荐使用最安全的 IAM 访问方式,配置过程可以参考[控制存储桶访问](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/walkthrough1.html)。权限要求如下:
2. 配置 br 命令行工具和 TiKV 访问 S3 中的备份目录的权限。本文推荐使用最安全的 IAM 访问方式,配置过程可以参考[控制存储桶访问](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/walkthrough1.html)。权限要求如下:

- 备份集群的 TiKV 和 BR 需要的 `s3://tidb-pitr-bucket/backup-data` 权限:`s3:ListBucket`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复集群的 TiKV 和 BR 需要 `s3://tidb-pitr-bucket/backup-data` 的最小权限:`s3:ListBucket` 和 `s3:GetObject`。
- 备份集群的 TiKV 和 br 命令行工具需要的 `s3://tidb-pitr-bucket/backup-data` 权限:`s3:ListBucket`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复集群的 TiKV 和 br 命令行工具需要 `s3://tidb-pitr-bucket/backup-data` 的最小权限:`s3:ListBucket` 和 `s3:GetObject`。

3. 规划备份数据保存的目录结构,以及快照(全量)备份和日志备份的目录。

Expand Down
Loading