GBase 8a
运维管理
文章

恢复delete误删除的数据

发表于2024-12-31 13:43:3534次浏览0个评论
  1. 测试环境

 

4节点集群,2个安全组

[root@cmcc040 ~]# gcadmin

 

 +-------+----------+--------------+--------+-

 | rowid | nodename |   IpAddress | sgname | 

 +-------+----------+--------------+--------+-

 |  1   |    n1   | 10.10.100.40 |  sg01  | 

 +-------+----------+--------------+--------+-

 |  2   |    n2   | 10.10.100.41 |  sg01  | 

 +-------+----------+--------------+--------+-

 |  3   |    n3   | 10.10.100.42 |  sg02  | 

 +-------+----------+--------------+--------+-

 |  4   |    n4   | 10.10.100.43 |  sg02  | 

 +-------+----------+--------------+--------+-

 

表结构:

create table t1 (c1 int, c2 varchar(10));

 

表内数据:

gbase> select count(*) from t1;

+----------+

| count(*) |

+----------+

|    1000 |

+----------+

 

gbase> select * from t1 order by c1 limit 10;

+------+------+

| c1  | c2   |

+------+------+

|   1 | a1   |

|   2 | a2   |

|   3 | a3   |

|   4 | a4   |

|   5 | a5   |

|   6 | a6   |

|   7 | a7   |

|   8 | a8   |

|   9 | a9   |

|  10 | a10  |

+------+------+

 

  1. 测试过程

2.1 方法1,手工切换table.delete.A 、table.delete.B文件

  1. 误删除数据

gbase> delete from t1 where c1 > 997;

Query OK, 3 rows affected (Elapsed: 00:00:00.34)

 

  1. 确定删除了哪些节点的数据

在各节点node层执行以下SQL,注意表名要替换成各分片

select SCN 

  from information_schema.TABLES 

 where TABLE_SCHEMA='testdb' 

   and TABLE_NAME='t1_n1';

 

执行结果如下:

n1 : 844

n2 : 844

n3 : 844

n4 : 842

可以看出删除了n1,n2,n3节点的数据

 

  1. 在各节点切换table.delete文件

(1)n1节点:

cd /opt/gnode/userdata/gbase/testdb/metadata/t1_n1.GED

[gbase@cmcc040 t1_n1.GED]$ ll table.delete.*

-rw-rw---- 1 gbase gbase 54 Jun 18 10:46 table.delete.A

 

如果是首次删除,只有table.delete.A文件,将该文件删除即可。

如果之前曾经执行过删除操作,则会出现table.delete.A和table.delete.B文件,可手工切换这两个文件。

 

这里我们直接删除table.delete.A文件,注意做好备份。

[gbase@cmcc040 t1_n1.GED]$ rm -f table.delete.A 

 

  1. 处理副本

cd /opt/gnode/userdata/gbase/testdb/metadata/t1_n2.GED/

[gbase@cmcc040 t1_n2.GED]$ ll table.delete.*

-rw-rw---- 1 gbase gbase 54 Jun 18 10:46 table.delete.A

 

[gbase@cmcc040 t1_n1.GED]$ rm -f table.delete.A 

 

  1. 按以上操作处理n2,n3分片数据

注意在n3节点处理t1_n3.GED目录,在n4节点也处理t1_n3.GED目录。

 

  1. 将所有节点的集群重启

重启后检查数据

gbase> select count(*) from t1;

+----------+

| count(*) |

+----------+

|     1000 |

+----------+

 

gbase> select * from t1 where c1 > 997;

+------+-------+

| c1   | c2    |

+------+-------+

| 1000 | a1000 |

|  998 | a998  |

|  999 | a999  |

+------+-------+

 

2.2 方法2,使用revert table命令

 

  1. 误删除数据

gbase> delete from t1 where c1=4;

Query OK, 1 row affected (Elapsed: 00:00:00.34)

 

gbase> select * from t1 where c1=4;

Empty set (Elapsed: 00:00:00.02)

 

2.确定删除了哪些节点的数据

与方法1该部分相同,查询结果如下:

n1 : 846

n2 : 844

n3 : 844

n4 : 847

可以看出刚才删除了n4节点的数据

 

  1. 使用revert table命令

分别进入n3,n4节点,在gnode层执行如下命令

gbase> revert table testdb.t1_n4 scn_number 847;

Query OK, 0 rows affected (Elapsed: 00:00:00.00)

 

  1. 检查数据

[gbase@cmcc040 ~]$ gccli -uroot testdb;

GBase client 8.5.1.2 build 40776. Copyright (c) 2004-2013, GBase.  All Rights Reserved.

gbase> select * from t1 where c1=4;

+------+------+

| c1   | c2   |

+------+------+

|    4 | a4   |

+------+------+

1 row in set (Elapsed: 00:00:00.03)

 

gbase> select count(*) from t1;

+----------+

| count(*) |

+----------+

|     1000 |

+----------+

1 row in set (Elapsed: 00:00:00.01)

 

评论

登录后才可以发表评论