[TOC] # 执行恢复 目前 OceanBase 数据库支持租户级别的基于时间点的恢复。 ## 通过命令进行恢复 恢复会先根据用户输入的命令,从备份的目的地将全量备份恢复回来。之后,再将增量备份恢复到全量备份上面。最后,应用备份出去的事务日志。 **说明** 本节中的操作需要使用 root 用户在 sys 租户上执行。 1. 执行以下语句,停止日志备份。 ~~~ obclient> ALTER SYSTEM NOARCHIVELOG; ~~~ **说明** 由于当前版本暂不支持日志备份在集群上发起恢复,如果发起恢复,则会导致日志备份断流,故建议在执行恢复前先停止日志备份。 2. 创建 Unit(资源单元)。 示例如下: ~~~ obclient> CREATE RESOURCE UNIT box_16c96g max_cpu 16, max_memory 103079215104, max_iops 10240, max_disk_size 53687091200, max_session_num 64, MIN_CPU=16, MIN_MEMORY=103079215104, MIN_IOPS=10240; ~~~ 3. 创建 Resource Pool(资源池)。 示例如下: ~~~ obclient> CREATE RESOURCE POOL restore_pool unit = 'box_16c96g', unit_num = 1, zone_list = ('z1','z2','z3'); ~~~ 4. 执行以下语句,设置加密信息。 **说明** 如果未加密或恢复时可以访问原来的 KMS,则跳过本步骤。 ~~~ obclient> SET @kms_encrypt_info = '<加密string>'; ~~~ 其中,`<加密string>`为`EXTERNAL_KMS_INFO`的值,`EXTERNAL_KMS_INFO`为租户级配置项。 5. 打开恢复配置。 检查`restore_concurrency`是否为`0`,如果为`0`,则需要执行以下语句: ~~~ obclient> ALTER SYSTEM SET restore_concurrency = 50; ~~~ 6. (可选)修改恢复的等待时间。 默认恢复等待时间`_restore_idle_time`为 1 分钟,整个恢复期间会有 3 次等待,即 3 分钟的等待时间。对于测试恢复性能的场景,为了减少恢复的空闲时间,您可以执行以下语句将等待时间调整为`10s`。 ~~~ obclient> ALTER SYSTEM SET _restore_idle_time = '10s'; ~~~ 7. 根据现场需要,设置恢复的密码。 ~~~ obclient> SET DECRYPTION IDENTIFIED BY 'password'; ~~~ 只有在备份时添加了密码的场景下才需要设置恢复的密码。同时如果全量备份+增量备份设置的密码不一样,则需要输入多个密码,密码之间使用逗号分隔。示例如下: ~~~ obclient> SET DECRYPTION IDENTIFIED BY 'password1','password2'; ~~~ 8. 执行以下语句,开始执行恢复任务。 ~~~ obclient> ALTER SYSTEM RESTORE <dest_tenantname> FROM <source_tenantname> at 'uri' UNTIL 'timestamp' WITH 'restore_option'; ~~~ 部分参数说明如下表所示。 <table cols="2" id="table-6ly-tjy-v8h" class="table"><colgroup colname="col1" colnum="1" colwidth="2*" id="colgroup-dr9-hpw-1uq" style="width:40%"></colgroup><colgroup colname="col2" colnum="2" colwidth="3*" id="colgroup-2ki-mkd-jtj" style="width:60%"></colgroup><thead id="thead-ccy-uto-yf7" class="thead"><tr id="tr-wj7-dxf-4sm"><th id="td-cxm-ycf-jz4"><p id="p-qay-uy8-y79">参数</p></th><th id="td-dfl-c6i-rug"><p id="p-mkp-p27-2cj">描述</p></th></tr></thead><tbody id="tbody-ydv-dhs-2mm" class="tbody"><tr id="tr-4vb-elx-4jr"><td id="td-x2p-ynl-5lb"><p id="p-koy-dgt-k42">dest_tenantname</p></td><td id="td-tcn-t20-lxe"><p id="p-2zn-nkp-r2c">指恢复的新租户的名称。</p></td></tr><tr id="tr-bcr-du6-58v"><td id="td-v9y-1i2-sth"><p id="p-pyz-xav-gzh">source_tenantname</p></td><td id="td-jvf-t7q-bpr"><p id="p-ygn-2op-59f">指原集群的租户。</p></td></tr><tr id="tr-6ij-1on-nun"><td namest="col1" nameend="col1" id="td-tf2-mfa-zx1"><p id="p-mev-e93-2gj">uri</p></td><td namest="col2" nameend="col2" id="td-c8k-p08-0yt"><p id="p-kkr-7sq-vvr">指备份时设置的 <code data-tag="code" class="code">backup_dest</code>。</p></td></tr><tr id="tr-z98-of5-ezf"><td namest="col1" nameend="col1" id="td-f2c-8k4-9f3"><p id="p-ymc-xz5-e2e">timestamp</p></td><td namest="col2" nameend="col2" morerows="0" id="td-ina-qpx-v0f"><p id="p-xi5-w47-6gq">指恢复的时间戳,需要大于等于最早备份的数据备份的 <code data-tag="code" class="code">CDB_OB_BACKUP_SET_DETAILS </code>的<code data-tag="code" class="code">START_TIME</code>,小于等于日志备份 <code data-tag="code" class="code">CDB_OB_BACKUP_ARCHIVELOG_SUMMARY</code> 的 <code data-tag="code" class="code">MAX_NEXT_TIME</code>。</p></td></tr><tr id="tr-h5s-epj-prc"><td namest="col1" nameend="col1" id="td-8un-joy-bia"><p id="p-wrj-765-236">restore_option</p></td><td namest="col2" nameend="col2" id="td-bc2-3b5-mg5"><p id="p-6zf-zog-tf7">支持 <code data-tag="code" class="code">backup_cluster_name</code>、<code data-tag="code" class="code">backup_cluster_id</code>、<code data-tag="code" class="code">pool_list</code>、<code data-tag="code" class="code">locality</code>、<code data-tag="code" class="code">kms_encrypt</code>:</p><ul id="ul-vx4-eu3-x02"><li id="li-kta-44h-kek"><p id="p-7h5-ppc-x23"><code data-tag="code" class="code">backup_cluster_name</code> 为必选项,填写源集群的名称。</p></li><li id="li-wq7-c4o-9kh"><p id="p-0oz-dkx-n0l"><code data-tag="code" class="code">backup_cluster_id</code> 为必选项,填写源集群的 <code data-tag="code" class="code">cluster_id</code>。</p></li><li id="li-msc-u4i-jcc"><p id="p-3bj-ffo-5o1"><code data-tag="code" class="code">pool_list</code> 为必选项,填写用户的资源池。</p></li><li id="li-ky0-zjz-tb7"><p id="p-j1d-ejv-eer"><code data-tag="code" class="code">locality</code> 为可选项,填写租户的 Locality 信息。</p></li><li id="li-tdh-ex1-bw4"><p id="p-07f-o8b-zun"><code data-tag="code" class="code">kms_encrypt</code> 为可选项,为 <code data-tag="code" class="code">true</code> 则表示在恢复时需要使用步骤 4 指定的 <code data-tag="code" class="code">kms_encrypt_info</code>。</p></li></ul></td></tr></tbody></table> 1. 恢复示例: * NFS ~~~ obclient> ALTER SYSTEM RESTORE restored_trade FROM trade at 'file:///data/nfs/backup' until '2020-05-21 09:39:54.071670' with 'backup_cluster_name=ob20daily.backup&backup_cluster_id=1&pool_list=restore_pool; ~~~ * OSS ~~~ obclient> ALTER SYSTEM RESTORE restored_trade FROM trade at 'oss://antsys-oceanbasebackup/backup_rd/?host=cn-hangzhou-alipay-b.oss-cdn.aliyun-inc.com&access_id=xxx&access_key=xxx' until ' 2020-03-23 08:59:45' with 'backup_cluster_name=ob20daily.backup&backup_cluster_id=1&pool_list=restore_pool'; ~~~ * 腾讯云 COS ~~~ obclient> ALTER SYSTEM RESTORE restored_trade from trade at 'cos://backup-1304745170/backup_rd/20210127?host=cos.ap-nanjing.myqcloud.com&access_id=xxx&access_key=xxx&appid=xxx' until ' 2020-03-23 08:59:45' with 'backup_cluster_name=ob20daily.backup&backup_cluster_id=1&pool_list=restore_pool'; ~~~ 2. 执行以下语句,查看恢复进度。 * 查看系统表 Root Table: ~~~ obclient> SELECT svr_ip,role, is_restore, COUNT(*) FROM __all_root_table AS a, (SELECT value FROM __all_restore_info WHERE name='tenant_id') AS b WHERE a.tenant_id=b.value GROUP BY role, is_restore, svr_ip ORDER BY svr_ip, is_restore; ~~~ 其中,`is_restore`的取值含义如下: * 0:表示正常副本 * 1:表示逻辑恢复的副本 * 2:表示物理恢复需要恢复基线的副本 * 3:表示物理恢复需要恢复转储的副本 * 4:物理恢复需要恢复 clog 的副本 * 5:物理恢复需要转储的副本 * 6:物理恢复等待所有副本转储完成的副本 * 7:物理恢复设置 member list 的副本 `role`的取值含义如下: * 1:表示 Leader * 2:表示 Follower * 3:表示恢复中的 Leader * 查看用户表 Meta Table: ~~~ obclient> SELECT svr_ip,role, is_restore, COUNT(*) FROM __all_virtual_meta_table AS a, (SELECT value FROM __all_restore_info WHERE name='tenant_id') AS b WHERE a.tenant_id=b.value GROUP BY role, is_restore, svr_ip ORDER BY svr_ip, is_restore; ~~~ 或者 ~~~ obclient> SELECT svr_ip ,is_restore, COUNT(*) FROM __all_virtual_partition_store_info WHERE tenant_id>1002 group by svr_ip,is_restore order by svr_ip, is_restore; ~~~ 3. 执行以下语句,查看恢复结果。 ~~~ obclient> SELECT * FROM __all_restore_info; ~~~ ~~~ obclient> SELECT * FROM __all_restore_history; ~~~