From 61af6cee089ae1fc1137ef920076c0dc867f07d7 Mon Sep 17 00:00:00 2001 From: Ran Date: Mon, 13 Jul 2020 13:04:58 +0800 Subject: [PATCH] cherry pick #3925 to release-4.0 Signed-off-by: ti-srebot --- TOC.md | 4 + br/backup-and-restore-storages.md | 81 ++++++++ media/sqlgram/BackupOption.png | Bin 0 -> 11980 bytes media/sqlgram/BackupStmt.png | Bin 0 -> 3034 bytes media/sqlgram/BackupTSO.png | Bin 0 -> 1418 bytes media/sqlgram/RestoreOption.png | Bin 0 -> 7323 bytes media/sqlgram/RestoreStmt.png | Bin 0 -> 2860 bytes media/sqlgram/ShowBRIEStmt.png | Bin 0 -> 3370 bytes media/sqlgram/ShowLikeOrWhereOpt.png | Bin 7022 -> 6656 bytes sql-statements/sql-statement-backup.md | 185 +++++++++++++++++++ sql-statements/sql-statement-restore.md | 160 ++++++++++++++++ sql-statements/sql-statement-show-backups.md | 98 ++++++++++ 12 files changed, 528 insertions(+) create mode 100644 br/backup-and-restore-storages.md create mode 100644 media/sqlgram/BackupOption.png create mode 100644 media/sqlgram/BackupStmt.png create mode 100644 media/sqlgram/BackupTSO.png create mode 100644 media/sqlgram/RestoreOption.png create mode 100644 media/sqlgram/RestoreStmt.png create mode 100644 media/sqlgram/ShowBRIEStmt.png create mode 100644 sql-statements/sql-statement-backup.md create mode 100644 sql-statements/sql-statement-restore.md create mode 100644 sql-statements/sql-statement-show-backups.md diff --git a/TOC.md b/TOC.md index 79f5e0803e51..050038cd3df2 100644 --- a/TOC.md +++ b/TOC.md @@ -63,6 +63,7 @@ + 使用 BR 工具(推荐) + [使用 BR 进行备份与恢复](/br/backup-and-restore-tool.md) + [BR 备份与恢复场景示例](/br/backup-and-restore-use-cases.md) + + [BR 存储](/br/backup-and-restore-storages.md) + [使用 Dumpling 和 TiDB Lightning 进行备份与恢复(推荐)](/backup-and-restore-using-dumpling-lightning.md) + [使用 Mydumper 和 TiDB Lightning 进行备份与恢复](/backup-and-restore-using-mydumper-lightning.md) + [读取历史数据](/read-historical-data.md) @@ -243,6 +244,7 @@ - [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md) - [`ALTER USER`](/sql-statements/sql-statement-alter-user.md) - [`ANALYZE TABLE`](/sql-statements/sql-statement-analyze-table.md) + - [`BACKUP`](/sql-statements/sql-statement-backup.md) - [`BEGIN`](/sql-statements/sql-statement-begin.md) - [`CHANGE COLUMN`](/sql-statements/sql-statement-change-column.md) - [`CHANGE DRAINER`](/sql-statements/sql-statement-change-drainer.md) @@ -288,6 +290,7 @@ - [`RENAME INDEX`](/sql-statements/sql-statement-rename-index.md) - [`RENAME TABLE`](/sql-statements/sql-statement-rename-table.md) - [`REPLACE`](/sql-statements/sql-statement-replace.md) + - [`RESTORE`](/sql-statements/sql-statement-restore.md) - [`REVOKE `](/sql-statements/sql-statement-revoke-privileges.md) - [`ROLLBACK`](/sql-statements/sql-statement-rollback.md) - [`SELECT`](/sql-statements/sql-statement-select.md) @@ -296,6 +299,7 @@ - [`SET ROLE`](/sql-statements/sql-statement-set-role.md) - [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md) - [`SET [GLOBAL|SESSION] `](/sql-statements/sql-statement-set-variable.md) + - [`SHOW [BACKUPS|RESTORES]`](/sql-statements/sql-statement-show-backups.md) - [`SHOW ANALYZE STATUS`](/sql-statements/sql-statement-show-analyze-status.md) - [`SHOW BINDINGS`](/sql-statements/sql-statement-show-bindings.md) - [`SHOW BUILTINS`](/sql-statements/sql-statement-show-builtins.md) diff --git a/br/backup-and-restore-storages.md b/br/backup-and-restore-storages.md new file mode 100644 index 000000000000..59aa6552e0ee --- /dev/null +++ b/br/backup-and-restore-storages.md @@ -0,0 +1,81 @@ +--- +title: BR 存储 +summary: 了解 BR 中所用存储服务的 URL 格式。 +--- + +# BR 存储 + +Backup & Restore (BR) 支持在本地文件系统、Amazon S3 和 Google Cloud Storage (GCS) 上读写数据。通过传入 BR 的 `--storage` 参数中的不同 URL scheme,可以区分不同的存储方式。 + +## Scheme + +BR 支持以下存储服务: + +| 服务 | Scheme | 示例 | +|---------|---------|-------------| +| 本地文件系统(分布在各节点上) | local | `local:///path/to/dest/` | +| Amazon S3 及其他兼容 S3 的服务 | s3 | `s3://bucket-name/prefix/of/dest/` | +| GCS | gcs, gs | `gcs://bucket-name/prefix/of/dest/` | +| 不写入任何存储(仅作为基准测试) | noop | `noop://` | + +## 参数 + +S3 和 GCS 等云存储有时需要额外的连接配置,你可以为这类配置指定参数。例如: + +{{< copyable "shell-regular" >}} + +```shell +./br backup full -u 127.0.0.1:2379 -s 's3://bucket-name/prefix?region=us-west-2' +``` + +### S3 参数 + +| 参数 | 描述 | +|----------:|---------| +| `access-key` | 访问密钥 | +| `secret-access-key` | secret 访问密钥 | +| `region` | Amazon S3 服务区域(默认为 `us-east-1`) | +| `use-accelerate-endpoint` | 是否在 Amazon S3 上使用加速端点(默认为 `false`) | +| `endpoint` | S3 兼容服务自定义端点的 URL(例如 `https://s3.example.com/`)| +| `force-path-style` | 使用 path-style,而不是 virtual-hosted style(默认为 `false`) | +| `storage-class` | 上传对象的存储类别(例如 `STANDARD`、`STANDARD_IA`) | +| `sse` | 用于加密上传的服务器端加密算法(可以设置为空,`AES256` 或 `aws:kms`) | +| `sse-kms-key-id` | 如果 `sse` 设置为 `aws:kms`,则使用该参数指定 KMS ID | +| `acl` | 上传对象的 canned ACL(例如,`private`、`authenticated-read`) | + +> **注意:** +> +> 不建议在存储 URL 中直接传递访问密钥和 secret 访问密钥,因为这些密钥是明文记录的。BR 尝试按照以下顺序从环境中推断这些密钥: + +1. `$AWS_ACCESS_KEY_ID` 和 `$AWS_SECRET_ACCESS_KEY` 环境变量。 +2. `$AWS_ACCESS_KEY` 和 `$AWS_SECRET_KEY` 环境变量。 +3. BR 节点上的共享凭证文件,路径由 `$AWS_SHARED_CREDENTIALS_FILE` 环境变量指定。 +4. BR 节点上的共享凭证文件,路径为 `~/.aws/credentials`。 +5. 当前 Amazon EC2 容器的 IAM 角色。 +6. 当前 Amazon ECS 任务的 IAM 角色。 + +### GCS 参数 + +| 参数 | 描述 | +|----------:|---------| +| `credentials-file` | TiDB 节点上的凭证 JSON 文件的路径 | +| `storage-class` | 上传对象的存储类别(例如 `STANDARD`、`COLDLINE`) | +| `predefined-acl` | 上传对象的预定义 ACL(例如 `private`、`project-private` | + +如果没有指定 `credentials-file`,BR 尝试按照以下顺序从环境中推断出凭证: + +1. BR 节点上位于 `$GOOGLE_APPLICATION_CREDENTIALS` 环境变量所指定路径的文件内容。 +2. BR 节点上位于 `~/.config/gcloud/application_default_credentials.json` 的文件内容。 +3. 在 GCE 或 GAE 中运行时,从元数据服务器中获取的凭证。 + +## 向 TiKV 发送凭证 + +在默认情况下,使用 S3 和 GCS 存储时,BR 会将凭证发送到每个 TiKV 节点,以减少设置的复杂性。 + +但是,这个操作不适合云端环境,因为每个节点都有自己的角色和权限。在这种情况下,你需要用 `--send-credentials-to-tikv=false`(或简写为 `-c=0`)来禁止发送凭证: + +{{< copyable "shell-regular" >}} + +```shell +./br backup full -c=0 -u pd-service:2379 -s 's3://bucket-name/prefix' +``` diff --git a/media/sqlgram/BackupOption.png b/media/sqlgram/BackupOption.png new file mode 100644 index 0000000000000000000000000000000000000000..4425d81c996e06d6d8f3d2cd8e70a826456bba40 GIT binary patch literal 11980 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�~LoqQiMn*>E<>i5afns7}f`WopR#rVdJw!xAu&}UZ zW@gLF%TG^FT3T9AP*B|5+?SV^*x1->YimNG{HOo`3O`9iK~#9!?Va~y+DI11MG$%- zlGqRs#uPaQgN-Y0v7NTbrfu%Fw=27MyVraB|9`nD8i7Cp$*2*%?+=L>2|UAm^ya-m zGf$FG@4Y@qSJ(ll1u8?jy1*_#Ex_}Cchl6jh$m_hp5;{keEnIu{5$LgR7UaKRN*f6 z0xGL`0^*56JW+@z;)y~$QHUqvi9$RPPZZ*bLOc;q6yk|OJP}XS+Tf{G5l>XwcvfYq zYB)SK@)pfiV(8?bnp{IXQIX-(*Ei z*^uM6HHrlX7KLIC2IlsTdSbHds&aq$ZYL zV4K>eJXOZ5C&jZ$38#FrQ<{Nzq894j#d9B^JXM{>07fQuR4!$KW(Dy*snH{TCN+Bwp0cKS;^`XPZ-M9B z;I1^_Ep}B7bp$8DLL)McGb{;mlfhlmScGo42X`klqJE`Q7GiMs@I95mId)bKZKo12 za@TDvY3Qyyp%F8v^n#i!@T5V{)WnigMuD6OjY8llnS&$juAHfTPz(^cJE0LhVwCCR zpvLg5&=bTZ)p_LZ%-`!Gnwpg9^Ak%U@Ra(1{%6iq90!9f@-?Rftu?|^8uYQt@}&MiiWJX?)6yk|^q7Y9M;)!^o5KqJt@kBgPYlvs5oTgqOo~Q+Q{?IX+MewoX!5x_ZuKn`McBb(>8VB@dte$~*ritfu9PL(MoMk*)o=e6(_37E?h-Z3uo{VFu z-iu>B!+4$s|MFVkhce=s0G=_eS?Ztp^lB#XJP5Il@DJ)2nZUD=M?Bkc?dJe+m03I$ z2=O7-aA+Z(Dd8Ear^4t0yur@`o}s=w1=No+fai&}R(PI9v&)h)j;Vfsf+s(JFYuH= z_1*y?Sv+I2Bk}0kiY79OYs~olA$*)!JVV{u06Qn?<0%E7Y{-E8_B8SJF=LLf=06zV zWej+VeO4;2OcJq1!2rWz2Jl>~UA2niKuA6pk7pELDFN`@C@|I83zHn#?xV?yH`oQ_ zWrrSj3mwTW=&;k>Sv+Amo|8O0#`MmARsK?zYqBjZHazQv!lcz3c01j89*4klD(8xK zVj%m1n%IOmD4zX;_1RUcJ^Qf2^SQ@_lvm_Sh2uSbqId`ol^}RZ(pI6cC0OM>Mey6E zuebOGb=H+GJiGLD;TCv0d3X$##6%Ol>etJ$SkEnSABtOW+l?pO4o`1QT@VUSNn4*i zhab$waSn$9&WCVF@l@3wJ5k(G!3$6iJhyH0$xMoEUs!+DIi6db+F3jW)#35vd3c5t;sdp-NdK3B%wgI}fI-cA1Xi;~Y&tQ0pO7M!aYO<68A|DXj2HSAq8Pa;v zJ=GSb^!1~S?+soa8uIZ2yRb#V;d7E)5Ch2xAZ+J zS`1Iwa9K;44eQR}-qfbk@z`l2w5I3MM;7-26k=LiFGocZ$gb$vzzOTCeMSV|l z`qEnNdvZKEeaw)GPRbc zr5PHD+stopudP0~udf^q$+2}gR2@9kL-?>oBX@H8(h3r}Gizz`A)Jv)=Zt11mO5-G zG^xSaS{+YawtdeUHIiO@8c(MZEV}c+lg4!wcjRtg zn-4r~4wk$T6OSd#gaj%Roj8c&~T`9P7osD#cZmS*v!&a=j>CvO>RfF5RIX|3@T911}9 zdixa5j$K&1{4Bt)Mp6E(6$sCG71fWL5Y>;GhH>jUuQ{Hb*(tHlF3Feb6#7k=A)X20 z*{n)Z#q(FrJmA?1ScZ6}g{L!dmPb5qD^&c@@&`BX6;=Tq-N zb{BIPA%)`opygkY447#C0^{myQSoGe_5kX^pCw;@~?-*Wt-IgC!IQ@ cP^j4Te`c~V<`K0bkpKVy07*qoM6N<$f}OnYVE_OC literal 0 HcmV?d00001 diff --git a/media/sqlgram/BackupTSO.png b/media/sqlgram/BackupTSO.png new file mode 100644 index 0000000000000000000000000000000000000000..29ea0bf28a549b892ca0a08eccd0271178ae4e84 GIT binary patch literal 1418 zcmV;51$Fv~P)+9>Osj0}w z$WBg9t*x!s*Vn5=NEG#T3DJeieK-SjQpP!#xTwEt7CoeBA zJUl!zGc&upyRNRTDk>^!YHB$-Igyc(FfcH8cXvNOKTAtXK|w(}Iyx;aEml@m%gf6s zC@8tPxm8tFXJ==GgoJ5nY31eRJv}|l%*;18H-&|TkdTnc$;mrAJ3c->-QC@cjEt|Z zuhP=ewVQQYxiVDy32?r82eBTx=L_5lYm|RXMUZ+YEa4y)*uY z29BFt*+jdJ=SM7+NTFLg%2uh}t*<%F*MI2Q(;jzf=Z#p-v`VCOa!{)M6{q>Sp|<(i z1Lo9DK<&qHhA5kgLc5QeWCPO%oir$jzcjDgkxs!>iFE&btYby#TKobDl>ma%JZ%5~ zSCSor-lsF7ggDM%C4KEGG$FgB+ti`>t^Qap+L3M%%&L+!bm?1wPzohM^iHUg7*!CI zWXF?puLr=L7w_s?eP=wsAE4~8VZdFUnbbg4qH@trY-D?FEd2}UI6z6dySQ~&@3i^^ zz;|9e;6_mi>J+B_5!3##)$-`3*V+<4e*`FLx{nemjYlPen55TfiTw2?KXQPx4Tg?Y)0eDPsUuAIUn z`ry<~)bqxjwWrM(jF_tr9ZcO4G>CTHUz669fap`|2Oj=j0C`l$We*CS(|o&$f9 za3ein!$`uJ+0m4ILi!tmhOC?lX72&wPZCkd`1A;rd@M&`ifinH)$B7**;uv~gEiIy zJwq*nPk7CwpX(whotB8&oMEOD;p*e7bjq$S%+?%~Zup#v5jKp{DQO0$M}{iLIFo;Q z@VL_dc{xrdmw(|@TG=u)xxCh@v~p$~f)b=sDy32?rE+hTzit#6B`I%0u~Cll`a7ed zm}M#ZjRIp(lJaJ;@unPQ6+$YdQYxiVDy32?rLqv^(_8t(=SnG$hq-)Mja!AkpWhY0 zm*d9=pzIBf4nP^R-cBl|@*tJ-gHRf?Dl2Ws=C%e@S!raX3@e|ghSD5nbl;&_VP!_e z6XZgZ3M*%3M)!4tQ??RH)3dX>aSKOR3iaz&U@_CO#MBC|b&sWVXIf@&ukBqXQ3i)_ zKx(CpafVqm^02#0xmkn%SLtjP=?kUb{;|oG#uc`+oGdPe%MV+XtUMjB)Zo)%?yw?# zwlmdO+VcrGcE*c>@e*J%xzIwY^E-|ni@@#$e(RrzJu+oa7EaSI%QI&jhhGwkwA1E!vo`D^) z27g7lEYcU0U1i_KlGWySYGMukigH<`@0anjiHg!aNlMDtT@j^7f3KC1i}d$f8MR1% z|1-8Gl~O5{QYn>EDV0*Wx5}KVC#t1<+HU7jx7~wEDQkIE=T}adPgG2q(+^}`)np`y Yf5q>DI^O$z&Hw-a07*qoM6N<$f*ugIZU6uP literal 0 HcmV?d00001 diff --git a/media/sqlgram/RestoreOption.png b/media/sqlgram/RestoreOption.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff807478df1590886ae3e39c887093adfec934b GIT binary patch literal 7323 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 literal 0 HcmV?d00001 diff --git a/media/sqlgram/RestoreStmt.png b/media/sqlgram/RestoreStmt.png new file mode 100644 index 0000000000000000000000000000000000000000..7fae5bc1152b7463e4ba21b44e4d1194a3f013ac GIT binary patch literal 2860 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 OlDv$vbOp#H@P7b9cDZ{1 delta 6950 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 HXAb`_4O@Ms diff --git a/sql-statements/sql-statement-backup.md b/sql-statements/sql-statement-backup.md new file mode 100644 index 000000000000..61dd7a8801ab --- /dev/null +++ b/sql-statements/sql-statement-backup.md @@ -0,0 +1,185 @@ +--- +title: BACKUP +summary: TiDB 数据库中 BACKUP 的使用概况。 +--- + +# BACKUP + +`BACKUP` 语句用于对 TiDB 集群执行分布式备份操作。 + +`BACKUP` 语句使用的引擎与 [BR](/br/backup-and-restore-use-cases.md) 相同,但备份过程是由 TiDB 本身驱动,而非单独的 BR 工具。BR 工具的优势和警告也适用于 `BACKUP` 语句。 + +执行 `BACKUP` 需要 `SUPER` 权限。此外,执行备份的 TiDB 节点和集群中的所有 TiKV 节点都必须有对目标存储的读或写权限。 + +`BACKUP` 语句开始执行后将会加锁,直到整个备份任务完成、失败或取消。因此,执行 `BACKUP` 时需要准备一个持久的连接。如需取消任务,可执行 [`KILL TIDB QUERY`](/sql-statements/sql-statement-kill.md) 语句。 + +一次只能执行一个 `BACKUP` 和 [`RESTORE`](/sql-statements/sql-statement-restore.md) 任务。如果 TiDB server 上已经在执行一个 `BACKUP` 或 `RESTORE` 语句,新的 `BACKUP` 将等待前面所有的任务完成后再执行。 + +## 语法图 + +**BackupStmt:** + +![BackupStmt](/media/sqlgram/BackupStmt.png) + +**BRIETables:** + +![BRIETables](/media/sqlgram/BRIETables.png) + +**BackupOption:** + +![BackupOption](/media/sqlgram/BackupOption.png) + +**Boolean:** + +![Boolean](/media/sqlgram/Boolean.png) + +**BackupTSO:** + +![BackupTSO](/media/sqlgram/BackupTSO.png) + +## 示例 + +### 备份数据库 + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 'local:///mnt/backup/2020/04/'; +``` + +```sql ++------------------------------+-----------+-----------------+---------------------+---------------------+ +| Destination | Size | BackupTS | Queue Time | Execution Time | ++------------------------------+-----------+-----------------+---------------------+---------------------+ +| local:///mnt/backup/2020/04/ | 248665063 | 416099531454472 | 2020-04-12 23:09:48 | 2020-04-12 23:09:48 | ++------------------------------+-----------+-----------------+---------------------+---------------------+ +1 row in set (58.453 sec) +``` + +上述示例中,`test` 数据库被备份到本地,数据以 SST 文件的形式存储在分布于所有 TiDB 和 TiKV 节点的 `/mnt/backup/2020/04/` 目录中。 + +输出结果的第一行描述如下: + +| 列名 | 描述 | +| :-------- | :--------- | +| `Destination` | 目标存储的 URL | +| `Size` | 备份文件的总大小,单位为字节 | +| `BackupTS` | 创建备份时的快照 TSO(用于[增量备份](#增量备份)) | +| `Queue Time` | `BACKUP` 任务开始排队的时间戳(当前时区) | +| `Execution Time` | `BACKUP` 任务开始执行的时间戳(当前时区) | + +### 备份表 + +{{< copyable "sql" >}} + +```sql +BACKUP TABLE `test`.`sbtest01` TO 'local:///mnt/backup/sbtest01/'; +``` + +{{< copyable "sql" >}} + +```sql +BACKUP TABLE sbtest02, sbtest03, sbtest04 TO 'local:///mnt/backup/sbtest/'; +``` + +### 备份集群 + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE * TO 'local:///mnt/backup/full/'; +``` + +注意,备份中不包含系统表 (`mysql.*`、`INFORMATION_SCHEMA.*`、`PERFORMANCE_SCHEMA.*` 等)。 + +### 远端存储 + +BR 支持备份数据到 Amazon S3 或 Google Cloud Storage (GCS): + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 's3://example-bucket-2020/backup-05/?region=us-west-2'; +``` + +有关详细的 URL 语法,见 [BR 存储](/br/backup-and-restore-storages.md)。 + +当运行在云环境中时,不能分发凭证,可设置 `SEND_CREDENTIALS_TO_TIKV` 选项为 `FALSE`: + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 's3://example-bucket-2020/backup-05/?region=us-west-2' + SEND_CREDENTIALS_TO_TIKV = FALSE; +``` + +### 性能调优 + +如果你需要减少网络带宽占用,可以通过 `RATE_LIMIT` 来限制每个 TiKV 节点的平均上传速度。 + +默认情况下,每个 TiKV 节点上运行 4 个备份线程。可以通过 `CONCURRENCY` 选项来调整这个值。 + +在备份完成之前,`BACKUP` 将对集群上的数据进行校验,以验证数据的正确性。如果你确信无需进行校验,可以通过 `CHECKSUM` 选项禁用这一步骤。 + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 's3://example-bucket-2020/backup-06/' + RATE_LIMIT = 120 MB/SECOND + CONCURRENCY = 8 + CHECKSUM = FALSE; +``` + +### 快照 + +可以指定一个时间戳、TSO 或相对时间,来备份历史数据。 + +{{< copyable "sql" >}} + +```sql +-- 相对时间 +BACKUP DATABASE `test` TO 'local:///mnt/backup/hist01' + SNAPSHOT = 36 HOUR AGO; +-- 时间戳(当前时区) +BACKUP DATABASE `test` TO 'local:///mnt/backup/hist02' + SNAPSHOT = '2020-04-01 12:00:00'; +-- TSO +BACKUP DATABASE `test` TO 'local:///mnt/backup/hist03' + SNAPSHOT = 415685305958400; +``` + +对于相对时间,支持以下时间单位: + +* MICROSECOND(微秒) +* SECOND(秒) +* MINUTE(分钟) +* HOUR(小时) +* DAY(天) +* WEEK(周) + +注意,相对时间的单位遵循 SQL 标准,永远使用单数。 + +### 增量备份 + +提供 `LAST_BACKUP` 选项,只备份从上一次备份到当前快照之间的增量数据。 + +{{< copyable "sql" >}} + +```sql +-- 时间戳(当前时区) +BACKUP DATABASE `test` TO 'local:///mnt/backup/hist02' + LAST_BACKUP = '2020-04-01 12:00:00'; + +-- TSO +BACKUP DATABASE `test` TO 'local:///mnt/backup/hist03' + LAST_BACKUP = 415685305958400; +``` + +## MySQL 兼容性 + +该语句是 TiDB 对 MySQL 语法的扩展。 + +## 另请参阅 + +* [RESTORE](/sql-statements/sql-statement-restore.md) +* [SHOW BACKUPS](/sql-statements/sql-statement-show-backups.md) diff --git a/sql-statements/sql-statement-restore.md b/sql-statements/sql-statement-restore.md new file mode 100644 index 000000000000..6bc1bf8e015c --- /dev/null +++ b/sql-statements/sql-statement-restore.md @@ -0,0 +1,160 @@ +--- +title: RESTORE +summary: TiDB 数据库中 RESTORE 的使用概况。 +--- + +# RESTORE + +`RESTORE` 语句用于执行分布式恢复,把 [`BACKUP` 语句](/sql-statements/sql-statement-backup.md)生成的备份文件恢复到 TiDB 集群中。 + +`RESTORE` 语句使用的引擎与 [BR](/br/backup-and-restore-use-cases.md) 相同,但恢复过程是由 TiDB 本身驱动,而非单独的 BR 工具。BR 工具的优势和警告也适用于 `RESTORE` 语句。需要注意的是,**`RESTORE` 语句目前不遵循 ACID 原则**。 + +执行 `RESTORE` 语句前,确保集群已满足以下要求: + +* 集群处于“下线”状态,当前的 TiDB 会话是唯一在访问待恢复表的活跃 SQL 连接。 +* 执行全量恢复时,确保即将恢复的表不存在于集群中,因为现有的数据可能被覆盖,从而导致数据与索引不一致。 +* 执行增量恢复时,表的状态应该与创建备份时 `LAST_BACKUP` 时间戳的状态完全一致。 + +执行 `RESTORE` 需要 `SUPER` 权限。此外,执行恢复操作的 TiDB 节点和集群中的所有 TiKV 节点都必须有对目标存储的读权限。 + +`RESTORE` 语句开始执行后将会加锁,直到整个恢复任务完成、失败或取消。因此,执行 `RESTORE` 时需要准备一个持久的连接。如需取消任务,可执行 [`KILL TIDB QUERY`](/sql-statements/sql-statement-kill.md) 语句。 + +一次只能执行一个 `BACKUP` 和 `RESTORE` 任务。如果 TiDB server 上已经在执行一个 `BACKUP` 或 `RESTORE` 语句,新的 `RESTORE` 将等待前面所有的任务完成后再执行。 + +`RESTORE` 只能在 "tikv" 存储引擎上使用,如果使用 "mocktikv" 存储引擎,`RESTORE` 操作会失败。 + +## 语法图 + +**RestoreStmt:** + +![RestoreStmt](/media/sqlgram/RestoreStmt.png) + +**BRIETables:** + +![BRIETables](/media/sqlgram/BRIETables.png) + +**RestoreOption:** + +![RestoreOption](/media/sqlgram/RestoreOption.png) + +**Boolean:** + +![Boolean](/media/sqlgram/Boolean.png) + +## 示例 + +### 从备份文件恢复 + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE * FROM 'local:///mnt/backup/2020/04/'; +``` + +```sql ++------------------------------+-----------+----------+---------------------+---------------------+ +| Destination | Size | BackupTS | Queue Time | Execution Time | ++------------------------------+-----------+----------+---------------------+---------------------+ +| local:///mnt/backup/2020/04/ | 248665063 | 0 | 2020-04-21 17:16:55 | 2020-04-21 17:16:55 | ++------------------------------+-----------+----------+---------------------+---------------------+ +1 row in set (28.961 sec) +``` + +上述示例中,所有数据均从本地的备份文件中恢复到集群中。`RESTORE` 从 SST 文件里读取数据,SST 文件存储在所有 TiDB 和 TiKV 节点的 `/mnt/backup/2020/04/` 目录下。 + +输出结果的第一行描述如下: + +| 列名 | 描述 | +| :-------- | :--------- | +| `Destination` | 读取的目标存储 URL | +| `Size` | 备份文件的总大小,单位为字节 | +| `BackupTS` | 不适用 | +| `Queue Time` | `RESTORE` 任务开始排队的时间戳(当前时区) | +| `Execution Time` | `RESTORE` 任务开始执行的时间戳(当前时区) | + +### 部分恢复 + +你可以指定恢复部分数据库或部分表数据。如果备份文件中缺失了某些数据库或表,缺失的部分将被忽略。此时,`RESTORE` 语句不进行任何操作即完成执行。 + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE `test` FROM 'local:///mnt/backup/2020/04/'; +``` + +{{< copyable "sql" >}} + +```sql +RESTORE TABLE `test`.`sbtest01`, `test`.`sbtest02` FROM 'local:///mnt/backup/2020/04/'; +``` + +### 远端存储 + +BR 支持从 Amazon S3 或 Google Cloud Storage (GCS) 恢复数据: + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE * FROM 's3://example-bucket-2020/backup-05/?region=us-west-2'; +``` + +有关详细的 URL 语法,见 [BR 存储](/br/backup-and-restore-storages.md)。 + +当运行在云环境中时,不能分发凭证,可设置 `SEND_CREDENTIALS_TO_TIKV` 选项为 `FALSE`: + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE * FROM 's3://example-bucket-2020/backup-05/?region=us-west-2' + SEND_CREDENTIALS_TO_TIKV = FALSE; +``` + +### 性能调优 + +如果你需要减少网络带宽占用,可以通过 `RATE_LIMIT` 来限制每个 TiKV 节点的平均下载速度。 + +默认情况下,每个 TiKV 节点上运行 128 个恢复线程。可以通过 `CONCURRENCY` 选项来调整这个值。 + +在恢复完成之前,`RESTORE` 将对备份文件中的数据进行校验,以验证数据的正确性。如果你确信无需进行校验,可以通过 `CHECKSUM` 选项禁用这一步骤。 + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE * FROM 's3://example-bucket-2020/backup-06/' + RATE_LIMIT = 120 MB/SECOND + CONCURRENCY = 64 + CHECKSUM = FALSE; +``` + +### 增量恢复 + +增量恢复没有特殊的语法。TiDB 将识别备份文件属于全量备份或增量备份,然后执行对应的恢复操作,用户只需按照正确顺序进行增量恢复。 + +假设按照如下方式创建一个备份任务: + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 's3://example-bucket/full-backup' SNAPSHOT = 413612900352000; +BACKUP DATABASE `test` TO 's3://example-bucket/inc-backup-1' SNAPSHOT = 414971854848000 LAST_BACKUP = 413612900352000; +BACKUP DATABASE `test` TO 's3://example-bucket/inc-backup-2' SNAPSHOT = 416353458585600 LAST_BACKUP = 414971854848000; +``` + +在恢复备份时,需要采取同样的顺序: + +{{< copyable "sql" >}} + +```sql +RESTORE DATABASE * FROM 's3://example-bucket/full-backup'; +RESTORE DATABASE * FROM 's3://example-bucket/inc-backup-1'; +RESTORE DATABASE * FROM 's3://example-bucket/inc-backup-2'; +``` + +## MySQL 兼容性 + +该语句是 TiDB 对 MySQL 语法的扩展。 + +## 另请参阅 + +* [BACKUP](/sql-statements/sql-statement-backup.md) +* [SHOW RESTORES](/sql-statements/sql-statement-show-backups.md) diff --git a/sql-statements/sql-statement-show-backups.md b/sql-statements/sql-statement-show-backups.md new file mode 100644 index 000000000000..764dff7129d3 --- /dev/null +++ b/sql-statements/sql-statement-show-backups.md @@ -0,0 +1,98 @@ +--- +title: SHOW [BACKUPS|RESTORES] +summary: TiDB 数据库中 SHOW [BACKUPS|RESTORES] 的使用概况。 +--- + +# SHOW [BACKUPS|RESTORES] + +`SHOW [BACKUPS|RESTORES]` 语句会列出所有队列中或正在执行的 [`BACKUP`](/sql-statements/sql-statement-backup.md) 和 [`RESTORE`](/sql-statements/sql-statement-restore.md) 任务。 + +查询 `BACKUP` 任务时,使用 `SHOW BACKUPS` 语句。查询 `RESTORE` 任务时,使用 `SHOW RESTORES` 语句。执行两个语句均需要 `SUPER` 权限。 + +## 语法图 + +**ShowBRIEStmt:** + +![ShowBRIEStmt](/media/sqlgram/ShowBRIEStmt.png) + +**ShowLikeOrWhereOpt:** + +![ShowLikeOrWhereOpt](/media/sqlgram/ShowLikeOrWhereOpt.png) + +## 示例 + +在一个连接中,执行以下命令备份数据库: + +{{< copyable "sql" >}} + +```sql +BACKUP DATABASE `test` TO 's3://example-bucket/backup-01/?region=us-west-1'; +``` + +在备份完成之前,在新的连接中执行 `SHOW BACKUPS`: + +{{< copyable "sql" >}} + +```sql +SHOW BACKUPS; +``` + +```sql ++--------------------------------+---------+----------+---------------------+---------------------+-------------+------------+ +| Destination | State | Progress | Queue_Time | Execution_Time | Finish_Time | Connection | ++--------------------------------+---------+----------+---------------------+---------------------+-------------+------------+ +| s3://example-bucket/backup-01/ | Backup | 98.38 | 2020-04-12 23:09:03 | 2020-04-12 23:09:25 | NULL | 4 | ++--------------------------------+---------+----------+---------------------+---------------------+-------------+------------+ +1 row in set (0.00 sec) +``` + +输出结果的第一行描述如下: + +| 列名 | 描述 | +| :-------- | :--------- | +| `Destination` | 目标存储的 URL(为避免泄露密钥,所有参数均不显示) | +| `State` | 任务状态 | +| `Progress` | 当前状态的进度(百分比) | +| `Queue Time` | 任务开始排队的时间 | +| `Execution Time` | 任务开始执行的时间;对于队列中任务,该值为 `0000-00-00 00:00:00` | +| `Finish_Time` | (暂不适用) | +| `Connection` | 运行任务的连接 ID | + +连接 ID 可用于在 [`KILL TIDB QUERY`](/sql-statements/sql-statement-kill.md) 语句中取消备份/恢复任务: + +{{< copyable "sql" >}} + +```sql +KILL TIDB QUERY 4; +``` + +```sql +Query OK, 0 rows affected (0.00 sec) +``` + +### 过滤 + +在 `LIKE` 子句中使用通配符,可以按目标存储 URL 筛选任务: + +{{< copyable "sql" >}} + +```sql +SHOW BACKUPS LIKE 's3://%'; +``` + +使用 `WHERE` 子句,可以按列筛选任务: + +{{< copyable "sql" >}} + +```sql +SHOW BACKUPS WHERE `Progress` < 25.0; +``` + +## MySQL 兼容性 + +该语句是 TiDB 对 MySQL 语法的扩展。 + +## 另请参阅 + +* [BACKUP](/sql-statements/sql-statement-backup.md) +* [RESTORE](/sql-statements/sql-statement-restore.md)