阿里云首页

应急预案:专有云V3环境中Redis实例误删除的恢复方法

1. 概述

本文主要介绍在专有云V3环境中,Redis实例误删除的恢复方法。

1.1. 适用范围

  • 专有云V3企业版,RDS

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L1(一线驻场工程师)、L2(二线技术支持工程师)
  • 临时或固化方案:固化
  • 操作复杂度:中
  • 预估执行时长:60分钟
  • 业务影响:是
    注意:涉及元数据库的数据更改,需要注意执行的SQL语句。
  • 风险等级:中

2. 问题描述

由于误操作将Redis实例在前台释放,实例释放之前存在临时备份,可以通过临时备份进行紧急恢复。

3. 解决方案

3.1. 环境检查

  1. 登录RDS运维管理控制台,选择系统管理>服务节点信息,单击高级搜索,在名称框中输入dbaas,单击搜索,搜索RDS元数据库dbaas。
  2. 单击操作列的修改,查看RDS的dbaas元数据库信息。
  3. 登录dbaas数据库,执行以下SQL语句,确认误删除的实例的ID。
    select id,ins_name,comment from cust_instance where ins_name like '%[$Instance]%';
    说明:[$Instance_ID]为误删除的实例名。
    系统显示类似如下。

    如果不知道实例名,可以执行以下SQL语句,按照comment过滤。

    select id,ins_name,comment from cust_instance where comment like '%[$Comment]%';
    说明:[$Comment]为实例备注信息。

3.2. 实施步骤

确认新实例和原实例的一一对应关系

  1. 创建新临时实例。
    注意:创建的新临时实例规格和节点需要与原被释放实例规格和节点相同。

    说明:以误删除的实例为8节点集群版为例。
  2. 执行以下SQL语句,确定新建实例DB节点的子实例ID。
    select id,ins_name,comment from cust_instance where ins_name like '%[$New_Instance]%';
    说明:[$New_Instance]为新建临时实例的实例名。
    系统显示类似如下。
  3. 做好一一对应关系表。

    节点

    原实例ID

    新实例ID

    逻辑节点

    33570

    33624

    db-0

    33571

    33625

    db-1

    33572

    33626

    db-2

    33573

    33627

    db-3

    33574

    33628

    db-4

    33575

    33629

    db-5

    33576

    33630

    db-6

    33577

    33631

    db-7

    33578

    33632

    proxy-0

    33579

    33633

    cs-0   

    33580

    33634

修改bak库备份挂载信息

删除实例的过程中RDS运维管理控制台会自动为实例创建临时备份,可以用于备份恢复。

  1. 执行以下SQL语句,查看备份历史。
    select *from bakhistory where custins_id=[$Instance_ID] order by gmt_created desc limit 1\G
    说明:[$Instance_ID]为原实例ID。
    系统显示类似如下。
  2. 执行以下SQL语句,将bakhistory表中最新的记录一一挂到新实例ID。
    注意:修改之前请备份bakhistory表。
    update bakhistory set custins_id=[$New_Instance_ID]  where custins_id=[$Instance_ID] order by gmt_created desc limit 1;
    说明:[$New_Instance_ID]为新实例ID。
    示例如下:
    update bakhistory set custins_id=33625  where custins_id=33571 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33626  where custins_id=33572 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33627  where custins_id=33573 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33628  where custins_id=33574 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33629  where custins_id=33575 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33630  where custins_id=33576 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33631  where custins_id=33577 order by gmt_created desc limit 1;
    update bakhistory set custins_id=33632  where custins_id=33578 order by gmt_created desc limit 1;
    系统显示类似如下。
  3. 登录RDS运维管理控制台,在新实例的备份恢复页面,找到这8个备份集,可以看到原实例的备份信息已经关联到新的实例。
  4. 将备份通过OSS下载至本地。
    说明:下载的文件是一个RDB文件。
  5. 使用redis-shake迁移RDB文件内的数据,详情请参见使用redis-shake迁移RDB文件内的数据。需要将redis-shake工具和备份文件上传至可以与新Redis实例连通的ECS实例。
    1. 登录可以连接云数据库Redis版实例(目的端Redis)的ECS。
    2. 在ECS中下载redis-shake
    3. 执行以下命令,解压redis-shake工具,解压获得的redis-shake为64位Linux系统所需的二进制文件,redis-shake.conf为redis-shake的配置文件,您将在下个步骤对其进行修改。
      tar -xvf redis-shake.tar.gz
    4. 修改redis-shake.conf配置文件。
      • rdb.input:备份文件(RDB文件)的路径,可使用相对路径或绝对路径。
      • target.address:目的Redis的连接地址与端口号。
      • target.password_raw:目的Redis的连接密码。
      • target.db:设置待迁移的数据在目的Redis中的逻辑数据库名,默认值为-1
        例如,要将所有数据迁移到目的Redis中的DB10,则需将此参数的值设置为10。当该值设置为-1时,逻辑数据库名在源Redis和目的Redis中的名称相同,即源Redis中的DB0将被迁移至目的Redis中的DB0,DB1将被迁移至DB1,以此类推。
      • rewrite:如果目的Redis有与RDB文件中相同的key,是否覆盖,可选值如下:
        • true(覆盖)
        • false(不覆盖) 
    5. 执行以下命令,迁移数据。
      ./redis-shake.linux -type=restore -conf=redis-shake.conf
      系统显示类似如下。

      说明:出现rdb done,表示迁移成功。

3.3. 结果验证

登录实例验证数据,确认数据已恢复。

4. 回滚方案

无需回滚。

首页 应急预案:专有云V3环境中Redis实例误删除的恢复方法