GBase 8a
运维管理
文章

GBase8a手工恢复表分片数据方案及步骤

发表于2025-01-02 10:42:3877次浏览0个评论

问题背景:
用户在对表tdb.t1表进行DQL操作时,报“表不存在,分片表不存在,分片表文件损坏”等错误;进行DML操作时报“分片表不存在,分片表文件损坏,主备分片元数据不一致,主备分片数据不一致”等错误。

集群环境:
[gbase@GBASEMA01 ~]$ gcadmin
CLUSTER STATE:         ACTIVE
VIRTUAL CLUSTER MODE:  NORMAL

======================================
|  GBASE GCWARE CLUSTER INFORMATION  |
======================================
| NodeName |   IpAddress    | gcware |
--------------------------------------
| gcware1  | 192.168.195.10 |  OPEN  |
--------------------------------------
========================================================
|        GBASE COORDINATOR CLUSTER INFORMATION         |
========================================================
|   NodeName   |   IpAddress    | gcluster | DataState |
--------------------------------------------------------
| coordinator1 | 192.168.195.10 |   OPEN   |     0     |
--------------------------------------------------------
=========================================================================================================
|                                    GBASE DATA CLUSTER INFORMATION                                     |
=========================================================================================================
| NodeName |                IpAddress                 | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |             192.168.195.103              |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
|  node2   |             192.168.195.101              |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
|  node3   |             192.168.195.105              |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------

[gbase@GBASEMA01 ~]$ gcadmin showdistribution

                                Distribution ID: 1 | State: new | Total segment num: 3

            Primary Segment Node IP                   Segment ID                 Duplicate Segment node IP
========================================================================================================================
|                192.168.195.103                 |         1          |                192.168.195.101                 |
------------------------------------------------------------------------------------------------------------------------
|                192.168.195.101                 |         2          |                192.168.195.105                 |
------------------------------------------------------------------------------------------------------------------------
|                192.168.195.105                 |         3          |                192.168.195.103                 |
========================================================================================================================

[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "show nodes"
+------------+-----------------+-------+--------------+----------------+--------+-----------+
| Id         | ip              | name  | primary part | duplicate part | status | datastate |
+------------+-----------------+-------+--------------+----------------+--------+-----------+
| 1740875968 | 192.168.195.103 | node1 | n1           | n3             | online |         0 |
| 1707321536 | 192.168.195.101 | node2 | n2           | n1             | online |         0 |
| 1774430400 | 192.168.195.105 | node3 | n3           | n2             | online |         0 |
+------------+-----------------+-------+--------------+----------------+--------+-----------+

[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "show vcs"
+---------+--------------+---------+
| id      | name         | default |
+---------+--------------+---------+
| vc00001 | vcname000001 | Y       |
+---------+--------------+---------+


故障节点:
192.168.195.105节点上tdb.t1表故障,192.168.195.105的主分片在192.168.195.101节点n2上,备份分片在192.168.195.103节点n1上


应急处理:

1)故障节点隔离:gcadmin setnodestate 192.168.195.105 failure
2)故障处理后恢复:gcadmin setnodestate 192.168.195.105 normal

 

问题处理方法:
*********************************************** S1 重建表 ************************************************************* 
方案一:服务器无问题,且故障表不多时,并且集群层还能查询正确数据,通过“重建表”恢复表数据
参考网址:https://www.gbase8.cn/174

1)复制表结构
create table tdb.t1_1 like tdb.t1;

2)复制表数据
insert into tdb.t1_1 select * from tdb.t1;

3)修改表名
alter table tdb.t1 rename tdb.t1_0;
alter table tdb.t1_1 rename tdb.t1;

4)根据情况考虑删除(存储空间足够可不删)
drop table tdb.t1_0;

 

************************************************** S2 工具同步 ********************************************************** 
方案二:服务器无问题,且故障表不多时,通过工具同步正常节点的表分片数据,手工恢复表分片数据。
参考网址:https://www.gbase8.cn/176

1)检查故障节点分片(Coor)
#105节点上分片t1_n2文件为0,但101节点上分片t1_n2文件大小不为0,说明105节点上该分片数据异常
[gbase@GBASEMA01 ~]$ cexec data: 'du -sh /opt/192.*/gnode/userdata/gbase/tdb/sys_tablespace/t1_n*'
************************* data *************************
--------- 192.168.195.101---------
16K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
28K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
--------- 192.168.195.103---------
16K     /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
0       /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3
--------- 192.168.195.105---------
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3

2)同步分片数据(Gnode):
# 如果在105节点上没有t1_n2分片目录,需手工创建mkdir t1_n2,否则工具不能正常同步
[gbase@GBASEDATA01 ~]$ source /opt/192.168.195.105/gbase_profile
[gbase@GBASEDATA01 ~]$ /opt/192.168.195.105/gnode/server/bin/gc_sync_client 192.168.195.101 vcname000001 tdb t1_n2 192.168.195.10 5258
参数:正确分片的节点IP VC名 库名 表分片名 管理节点IP 管理节点端口

3)刷新表分片(Gnode):
[gbase@GBASEDATA01 ~]$ gncli -ugbase -pX@gbase2024 -e "refresh table tdb.t1_n2"

4)核对主备分片(Coor):
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.101 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.105 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ cexec data: 'du -sh /opt/192.*/gnode/userdata/gbase/tdb/sys_tablespace/t1_n*'
************************* data *************************
--------- 192.168.195.101---------
16K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
28K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
--------- 192.168.195.103---------
16K     /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
0       /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3
--------- 192.168.195.105---------
12K     /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3


************************************************** S3 自动恢复 ********************************************************** 
方案三:服务器无问题,且故障表不多时,通过设置不一致标志,由GBas的同步机制自动恢复表分片数据。
参考网址:https://www.gbase8.cn/5799

1)检查故障节点分片(Coor)
#105节点上分片t1_n2文件为0,但101节点上分片t1_n2文件大小不为0,说明105节点上该分片数据异常
[gbase@GBASEMA01 ~]$ cexec data: 'du -sh /opt/192.*/gnode/userdata/gbase/tdb/sys_tablespace/t1_n*'
************************* data *************************
--------- 192.168.195.101---------
16K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
36K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
--------- 192.168.195.103---------
16K     /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
0       /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3
--------- 192.168.195.105---------
36K     /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3

2)同步分片数据(Coor):
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "set self gcluster_node_status_list='vc00001.tdb.t1:n2:1774430400:0:1'"
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "set self gcluster_node_status_list='vc00001.tdb.t1:n3:1774430400:0:1'"
参数:vcid.库名.表名:分片号:主机nodeid:状态:SCN号,如果是复制表分片号为空,例如:vc00001.tdb.t1::1774430400:0:1

3)核对主备分片(Coor):
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.101 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.105 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ cexec data: 'du -sh /opt/192.*/gnode/userdata/gbase/tdb/sys_tablespace/t1_n*'
************************* data *************************
--------- 192.168.195.101---------
16K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
36K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
--------- 192.168.195.103---------
16K     /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
0       /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3
--------- 192.168.195.105---------
36K     /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3


************************************************** S4 手工复制 ********************************************************** 
方案四:服务器无问题,且故障表不多时,故障表处理期间无DML DDL操作,通过手工复制正常节点的表分片数据,手工恢复表分片数据。
参考网址:https://www.gbase8.cn/7619

1)对故障表进行锁写表处理(Coor)
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "lock table tdb.t1 write; select sleep(100000)" &
[1] 78149
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "show processlist"
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
| Id   | User            | Host      | db   | Command | Time  | State                       | Info                 |
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
|    1 | event_scheduler | localhost | NULL | Daemon  | 11738 | Waiting for next activation | NULL                 |
| 1469 | gbase           | localhost | NULL | Sleep   |  4058 |                             | NULL                 |
| 2005 | gbase           | localhost | NULL | Query   |    19 | checking permissions        | select sleep(100000) |
| 2009 | gbase           | localhost | NULL | Query   |     0 | NULL                        | show processlist     |
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
[gbase@GBASEMA01 ~]$ gcadmin showlock
+======================================================================================+
|                                    GCLUSTER LOCK                                     |
+======================================================================================+
+----------------------------+--------------+---------------+--------------+------+----+
|         Lock name          |    owner     |    content    | create time  |locked|type|
+----------------------------+--------------+---------------+--------------+------+----+
|       gc-event-lock        |192.168.195.10| global master |20241029063626| TRUE | E  |
+----------------------------+--------------+---------------+--------------+------+----+
|    vc00001.hashmap_lock    |192.168.195.10|2005(LWP:78150)|20241029095146| TRUE | S  |
+----------------------------+--------------+---------------+--------------+------+----+
|    vc00001.tdb.db_lock     |192.168.195.10|2005(LWP:78150)|20241029095146| TRUE | S  |
+----------------------------+--------------+---------------+--------------+------+----+
|vc00001.tdb.t1.execute_lock |192.168.195.10|2005(LWP:78150)|20241029095146| TRUE | E  |
+----------------------------+--------------+---------------+--------------+------+----+
|  vc00001.tdb.t1.meta_lock  |192.168.195.10|2005(LWP:78150)|20241029095146| TRUE | S  |
+----------------------------+--------------+---------------+--------------+------+----+
|vc00001.tdb.table_space_lock|192.168.195.10|2005(LWP:78150)|20241029095146| TRUE | S  |
+----------------------------+--------------+---------------+--------------+------+----+

2)备份故障表及数据(Coor)
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "create table tdb.t1_1 like tdb.t1"
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "insert into tdb.t1_1 select * from tdb.t1"

3)手工清理故障表EVENT(Coor)
[gbase@GBASEMA01 ~]$ gcadmin showddlevent |grep "tdb.t1" |wc -l; gcadmin showdmlevent| grep "tdb.t1"|wc -l; gcadmin showdmlstorageevent |grep "tdb.t1" |wc -l
[gbase@GBASEMA01 ~]$ python
>>> import gcware    
>>> gcware.clearddlfevent('vcname000001','^tdb.t1$')
>>> gcware.cleardmlfevent('vcname000001','^tdb.t1$')
>>> gcware.cleardmlstoragefevent('vcname000001','^tdb.t1$')
>>> exit()
[gbase@GBASEMA01 ~]$ gcadmin showddlevent |grep "tdb.t1" |wc -l; gcadmin showdmlevent| grep "tdb.t1"|wc -l; gcadmin showdmlstorageevent |grep "tdb.t1" |wc -l

4)移除故障表文件(Coor)
[gbase@GBASEMA01 ~]$ ssh -n 192.168.195.105 "mkdir -p /opt/gbase/20241029/metadata; mkdir -p /opt/gbase/20241029/sys_tablespace"
[gbase@GBASEMA01 ~]$ ssh -n 192.168.195.105 "mv /opt/192.168.195.105/gnode/userdata/gbase/tdb/metadata/t1_n2.* /opt/gbase/20241029/metadata"
[gbase@GBASEMA01 ~]$ ssh -n 192.168.195.105 "mv /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2 /opt/gbase/20241029/sys_tablespace"

5)从正常节点复制文件(GNode)
[gbase@GBASEDATA01 ~]$ scp -r 192.168.195.101:/opt/192.168.195.101/gnode/userdata/gbase/tdb/metadata/t1_n2.*  /opt/192.168.195.105/gnode/userdata/gbase/tdb/metadata/
[gbase@GBASEDATA01 ~]$ scp -r 192.168.195.101:/opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2 /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/

6)刷新表分片(GNode):
[gbase@GBASEDATA01 ~]$ source /opt/192.168.195.105/gbase_profile
[gbase@GBASEDATA01 ~]$ gncli -ugbase -pX@gbase2024 -e "refresh table tdb.t1_n2"

7)核对主备分片(Coor):
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.101 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -h192.168.195.105 -P5050 -Ns -e "select count(*) from tdb.t1_n2"
22
[gbase@GBASEMA01 ~]$ cexec data: 'du -sh /opt/192.*/gnode/userdata/gbase/tdb/sys_tablespace/t1_n*'
************************* data *************************
--------- 192.168.195.101---------
16K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
36K     /opt/192.168.195.101/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
--------- 192.168.195.103---------
16K     /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n1
0       /opt/192.168.195.103/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3
--------- 192.168.195.105---------
36K     /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n2
0       /opt/192.168.195.105/gnode/userdata/gbase/tdb/sys_tablespace/t1_n3

8)关闭锁写表进程(Coor)
[gbase@GBASEMA01 ~]$ ps -ef|grep gccli
[gbase@GBASEMA01 ~]$ kill -9 78149
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "show processlist"
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
| Id   | User            | Host      | db   | Command | Time  | State                       | Info                 |
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
|    1 | event_scheduler | localhost | NULL | Daemon  | 11738 | Waiting for next activation | NULL                 |
| 1469 | gbase           | localhost | NULL | Sleep   |  4058 |                             | NULL                 |
| 2005 | gbase           | localhost | NULL | Query   |    19 | checking permissions        | select sleep(100000) |
| 2009 | gbase           | localhost | NULL | Query   |     0 | NULL                        | show processlist     |
+------+-----------------+-----------+------+---------+-------+-----------------------------+----------------------+
[gbase@GBASEMA01 ~]$ gccli -ugbase -pX@gbase2024 -e "kill 2005"
[gbase@GBASEMA01 ~]$ gcadmin showlock
+=====================================================================+
|                            GCLUSTER LOCK                            |
+=====================================================================+
+-------------+--------------+-------------+--------------+------+----+
|  Lock name  |    owner     |   content   | create time  |locked|type|
+-------------+--------------+-------------+--------------+------+----+
|gc-event-lock|192.168.195.10|global master|20241029063626| TRUE | E  |
+-------------+--------------+-------------+--------------+------+----+

 

************************************************** S5 节点替换 ********************************************************** 
方案五:服务器文件系统故障,或故障表很多,修复耗时太长,建议设置为unavaliable, 做节点替换
 

评论

登录后才可以发表评论