首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >gbase8a GDCP笔记

gbase8a GDCP笔记

原创
作者头像
大大刺猬
发布2026-09-17 11:38:12
发布2026-09-17 11:38:12
810
举报

最近抽空整了GBase8aGDCP, 简单记录下.

基础概念

代码语言:txt
复制
GCluster: 调度节点,SQL解析优化,分布式执行计划生成等(类似tdsql/ob的proxy),运行gclusterd,gcrecover,gcmonit,gcmmonit服务

GCware: 管理节点,GCluster之间共享信息使用的. 类似tdsql的zk? 运行gcware,gcware_monit,gcware_mmonit服务

GNode: 计算节点.数据节点(data node),存储数据的. 运行gbased,gc_sync_server,gcmonit,gcmmonit服务.

Coordinator = Gcluster + Gcware
RC: root cluster 所有的coordinator,datanode(含free的)
VC: Virtual Cluster, 从root cluster里面分割一部分GNode(free node)出来组成一个虚拟的集群

segment: 即分片, 节点上存储的表(一部分),比如: data_node1节点存储的表t2_n1 表示为t2表的第一个分片.
	分片数量为vc内node数量

rack: 机架. 将一组节点合成1组.

pattern: 节点分布模式
	1: 负载均衡模式: 主分片在rack1上,则备(duplication)分片在rack2上; 若主分片在rack2上,则备分片在rack3上; 以此类推. 主备分片不能在同一rack中.
	2. 高可用模式: 基于node而不是rack的分配而已.(所有rack都相当于1个rack). 主备分片不能在同一node中
	还可以自定义分布

环境

本次环境如下:

NODE IP

ROLE

规格

192.168.101.201

CN,DN

4C8G

192.168.101.202

CN,DN

4C8G

192.168.101.203

CN,DN

4C8G

在国产数据库里面算是吃资源很少的集群了,文档上资源要求更低,但我直接就复用之前其他集群的机器了.

安装

集群安装

代码语言:txt
复制
# 第一个节点上传软件包(第一个节点执行)
ls GBase8a_MPP_Cluster-9.5.3.28.35_patch.2-rhel7--license.zip
unzip GBase8a_MPP_Cluster-9.5.3.28.35_patch.2-rhel7--license.zip
cd GBase8a_MPP_Cluster-9.5.3.28.35_patch.2-rhel7--license
# GBase8a_MPP_Cluster-License-9.5.3.28.35_patch.2-redhat7-x86_64.tar.bz2 # 软件包
# gccli_MPP_Cluster-9.5.3.28.35_patch.2-redhat7-x86_64.tar.bz2 # 客户端工具
# 安装解压软件
yum install bzip2 -y
tar xfj GBase8a_MPP_Cluster-License-9.5.3.28.35_patch.2-redhat7-x86_64.tar.bz2
# 把gcinstall放到opt目录
mv gcinstall /opt


# 配置环境(所有节点执行)
yum install bzip2 -y
yum install libcgroup libcgroup-tools -y
useradd gbase # uid和gid建议保持一样,不然nfs可能有坑. usermode -u uid username; groupmode -g gid username;
echo 'gbase' | passwd gbase --stdin
mkdir /opt/gbase
chown -R gbase:gbase /opt/gbase
# 拷贝环境脚本
scp root@192.168.101.201:/opt/gcinstall/SetSysEnv.py /opt
cd /opt
python SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase --cgroup


# 集群安装(第一个节点执行)
chown gbase:gbase /opt/gcinstall -R
su - gbase
cd /opt/gcinstall/
cat << EOF > /opt/gcinstall/demo.options
installPrefix= /opt/gbase
coordinateHost = 192.168.101.201,192.168.101.202,192.168.101.203
coordinateHostNodeID = 201,202,203
dataHost = 192.168.101.201,192.168.101.202,192.168.101.203
#existCoordinateHost =
#existDataHost =
#existGcwareHost=
gcwareHost = 192.168.101.201,192.168.101.202,192.168.101.203
gcwareHostNodeID = 201,202,203
# OS USER
dbaUser = gbase
# OS USER GROUP
dbaGroup = gbase
# OS USER(dbaUser) PASSWORD
dbaPwd = 'gbase'
# OS ROOT PASSWORD
rootPwd = 'XXXXX'
#dbaHome =
#numaCpuBind=''
#numaMemBind=''
#numaHddBind=''
#dbRootPwd = ''
#rootPwdFile = rootPwd.json
#characterSet = utf8
#sshPort = 22
EOF

# 获取esn(方便申请license,但这里已经有license了)
python getesn.py --silent=demo.options
# 得到: 03-AYR6Z549-ESU7C3C7-UML24ZXU-RX3E6ZVT-@
python gcinstall.py --silent=demo.options --license_file=/opt/20260127-04.lic
# 确认接受license,输出如下:
*********************************************************************************
Do you accept the above licence agreement ([Y,y]/[N,n])? y
*********************************************************************************
                     Welcome to install GBase products
*********************************************************************************
check DBA_HOME environment variable
check crontab privilege ...
get server and data host dict
create flag file every data host
read host list every data host
delete flag file every data host
get server and data host dict end
check crontab privilege successfully
get server and host dict ...
create flag file every host
read host list every host
delete flag file every host
get server and host dict successfully
Environmental Checking on cluster nodes.
clear and get md5sum every nodes
write ip information every nodes
read ip information from every nodes
clear ip information every nodes
checking rpms ...
checking Cgconfig service
parse extendCfg.xml
CoordinateHost:
192.168.101.201    192.168.101.202    192.168.101.203
DataHost:
192.168.101.201    192.168.101.202    192.168.101.203
GcwareHost:
192.168.101.201    192.168.101.202    192.168.101.203
Are you sure to install GCluster on these nodes ([Y,y]/[N,n])? y
192.168.101.201      	start install gcware on host 192.168.101.201
192.168.101.202      	start install gcware on host 192.168.101.202
192.168.101.203      	start install gcware on host 192.168.101.203

192.168.101.201      	mkdir /opt/gbase/192.168.101.201/cluster_prepare on host 192.168.101.201.
192.168.101.202      	mkdir /opt/gbase/192.168.101.202/cluster_prepare on host 192.168.101.202.
192.168.101.203      	mkdir /opt/gbase/192.168.101.203/cluster_prepare on host 192.168.101.203.

192.168.101.201      	mkdir /opt/gbase/192.168.101.201/cluster_prepare on host 192.168.101.201.
192.168.101.202      	mkdir /opt/gbase/192.168.101.202/cluster_prepare on host 192.168.101.202.
192.168.101.203      	mkdir /opt/gbase/192.168.101.203/cluster_prepare on host 192.168.101.203.

192.168.101.201      	Copying InstallFuns.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying InstallTar.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying InstallFuns.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying InstallFuns.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying InstallFuns.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying InstallFuns.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying rmt.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying rmt.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying rmt.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying SSHThread.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying SSHThread.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying SSHThread.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying RestoreLocal.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying SSHThread.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying RestoreLocal.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying pexpect.py to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying pexpect.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying pexpect.py to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying BUILDINFO to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying pexpect.py to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying BUILDINFO to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying UpdateSysTable.json to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying BUILDINFO to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying UpdateSysTable.json to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying bundle.tar.bz2 to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying UpdateSysTable.json to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying UpdateSysTable.json to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying bundle.tar.bz2 to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying bundle.tar.bz2 to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying bundle.tar.bz2 to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Copying bundle_data.tar.bz2 to host 192.168.101.201:/opt/gbase/192.168.101.201/cluster_prepare
192.168.101.202      	Copying bundle.tar.bz2 to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying bundle.tar.bz2 to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Installing gcware and gcluster.
192.168.101.202      	Copying bundle_data.tar.bz2 to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Copying bundle_data.tar.bz2 to host 192.168.101.203:/opt/gbase/192.168.101.203/cluster_prepare

192.168.101.201      	Installing gcware and gcluster.
192.168.101.202      	Copying bundle_data.tar.bz2 to host 192.168.101.202:/opt/gbase/192.168.101.202/cluster_prepare
192.168.101.203      	Installing gcware and gcluster.

....

192.168.101.201      	Installing gcware and gcluster.
192.168.101.202      	Installing gcware and gcluster.
192.168.101.203      	Installing gcware and gcluster.

192.168.101.201      	install gcware and cluster on host 192.168.101.201 successfully.
192.168.101.202      	Installing gcware and gcluster.
192.168.101.203      	install gcware and cluster on host 192.168.101.203 successfully.

192.168.101.201      	install gcware and cluster on host 192.168.101.201 successfully.
192.168.101.202      	install gcware and cluster on host 192.168.101.202 successfully.
192.168.101.203      	install gcware and cluster on host 192.168.101.203 successfully.
Starting all gcluster nodes ...
adding new datanodes to gcware ...
InstallCluster Successfully


# 安装完成之后, 可以使用gcadmin查看集群信息
source ~/.bash_profile
gcadmin
# 输出如下:
CLUSTER STATE:         ACTIVE

=======================================
|  GBASE GCWARE CLUSTER INFORMATION   |
=======================================
| NodeName |    IpAddress    | gcware |
---------------------------------------
| gcware1  | 192.168.101.201 |  OPEN  |
---------------------------------------
| gcware2  | 192.168.101.202 |  OPEN  |
---------------------------------------
| gcware3  | 192.168.101.203 |  OPEN  |
---------------------------------------
=========================================================
|         GBASE COORDINATOR CLUSTER INFORMATION         |
=========================================================
|   NodeName   |    IpAddress    | gcluster | DataState |
---------------------------------------------------------
| coordinator1 | 192.168.101.201 |   OPEN   |     0     |
---------------------------------------------------------
| coordinator2 | 192.168.101.202 |   OPEN   |     0     |
---------------------------------------------------------
| coordinator3 | 192.168.101.203 |   OPEN   |     0     |
---------------------------------------------------------
================================================================
|           GBASE CLUSTER FREE DATA NODE INFORMATION           |
================================================================
| NodeName  |    IpAddress    | gnode | syncserver | DataState |
----------------------------------------------------------------
| FreeNode1 | 192.168.101.201 | OPEN  |    OPEN    |     0     |
----------------------------------------------------------------
| FreeNode2 | 192.168.101.202 | OPEN  |    OPEN    |     0     |
----------------------------------------------------------------
| FreeNode3 | 192.168.101.203 | OPEN  |    OPEN    |     0     |
----------------------------------------------------------------

0 virtual cluster
3 coordinator node
3 free data node

# 检查license (sql:show license;)
/opt/gcinstall/checkLicense

配置日志归档(轮转?)

代码语言:shell
复制
# 所有节点都执行(root)
cd /opt
python SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase --cgroup
ll /etc/logrotate.d/

创建VC

代码语言:shell
复制
# 生成vc配置文件模板
gcadmin createvc e vc.xml
cat << EOF > vc.xml
<?xml version='1.0' encoding="utf-8"?>
<servers>

    <rack>
        <node ip="192.168.101.201"/>
        <node ip="192.168.101.202"/>
    </rack>

    <vc_name name="vc01"/>
    <comment message="vc01 cluster for test"/>

</servers>
EOF


# 生成VC
gcadmin createvc vc.xml

# 查看所有vc
gcadmin showcluster
# 查看指定vc
gcadmin showcluster vc vc01

# 给vc生成distribution表
cat << EOF > gcChangeInfo.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<rack>
<node ip="192.168.101.201"/>
<node ip="192.168.101.202"/>
</rack>
</servers>
EOF

gcadmin distribution gcChangeInfo.xml p 1 d 1 pattern 1
# p: primary segment  每个节点的主分片数量. 要求小于rack中node数量(pattern=1)
# d: duplication segment 每个分片的备份数量. 范围0,1,2

# 数据库初始化(默认密码是Admin2O11O531)
gccli -uroot -pAdmin2O11O531
use vc vc01; -- 切换vc
initnodedatamap;
show license; -- 初始化之前无法执行

-- 设置默认vc(不然每次都use,太麻烦了)
set default_vc for root=vc01; -- 设置root默认使用vc01

-- 查看所有vc
show vcs;

-- 查看当前vc
select vc();

集群管理

组件名称

默认端口

Gcluster

5258

Gnode

5050

Gcware

5918

gcware

5919

Recover_monit_port

6268

Syncserver

5288

Gcrecovermonit

6268

代码语言:shell
复制
# 查看各集各服务群状态
gcmonit --status

# 启动集群(每个节点都要执行)
gcluster_services all start # gcluster_services gbase start # gbased和gcluster都是这个服务管理的
gcware_services all start # 启动gcware

# 停止集群(每个节点都要执行)
gcluster_services all stop
gcware_services all start # 停止gcware

# 重启
gcluster_services all restart # 重启集群
gcware_services all restart # 重启gcware

基础使用

代码语言:sql
复制
-- 查看参数
show variables;
show global variables;

-- 修改参数 (有些参数需要重启才能生效,比如密码策略那几个)
set global audit_log=on;

用户

代码语言:sql
复制
-- 创建用户
create user u1;
create user u2;

-- 设置密码
set password for u1=password('123456');

-- 设置权限
grant all on vc01.*.* to u1;

-- 查看权限
show grants for current_user(); -- show grants for u1@'%';

-- 设置默认vc, 不然-e之类的执行不了(还没use vc)
set default_vc for u1=vc01;

-- 查看gbase.user表
select * from gbase.user\G
-- 加密方式为: select CONCAT('*', UPPER(SHA1(UNHEX(SHA1('123456')))))

代码语言:sql
复制
-- 创建数据库
create database db1;

-- 查看有哪些数据库
show databases;

-- 切换数据库
use db1;

-- 删库
drop database db1;

代码语言:sql
复制
-- 建表
create table t1(c1 int, c2 varchar(20),c3 varchar(10),c4 date,c5 varchar(50));
create table vc01.db1.tblname1(id int);

-- 删表
drop table t1;

数据加载

代码语言:sql
复制
-- 准备数据
cat << EOF > /tmp/testdata.txt
001|'LILY'|'M'|19810520|'天津南开区'
002|'BOB'|'F'|19801010|'天津高新区'
003|'NANA'|'M'|19820301|'天津高新区'
EOF

-- 加载数据 (如果编码不对,不会报错,只是没有数据)
create table t1(c1 int, c2 varchar(20),c3 varchar(10),c4 date,c5 varchar(50));
load data infile 'file://192.168.101.201/tmp/testdata.txt' into table t1
data_format 3
fields terminated by '|'
enclosed by '\''
date format '%Y%c%d'
trace 1
trace_path '/tmp/loader_logs';

-- other
cat << EOF > /tmp/testdata2.txt
asdfsacq| PQEWIIAZX==|ftp://192.168.101.201/test.jpg
safffff | QQEWIIAZX==|ftp://192.168.101.201/test.jpg
EOF
create table t2(c1 longblob, c2 longblob, c3 longblob);
load data infile 'file://192.168.101.201/tmp/testdata2.txt' into table t2 
fields terminated by '|' 
table_fields 'c1 type_text, c2 type_base64, c3 type_url';


option有一大堆, 
data_format 3 标准格式的(有分隔符)
data_format 4 定长格式(每列的长度固定的)
data_format 5 文本文件宽松模式(类似3,但可能丢失数据,有些数据可能超过定义的长度)
			6 json
			8 orc
table_fields 'c1,c2 filler' 定义字段对应关系, 表多列,txt多列,或者顺序对不上等各种情况的时候就可以使用
		比如: table_fields 'c1,c2,c3,filler,c5'; 如果filler不存在,txt的那一列就不导入了. 如果还有个c6没定义,那也不管了
.....
Options :
[CHARACTER SET charset_name]
[DATA_FORMAT number [HAVING LINES SEPARATOR]] 
[NULL_VALUE 'string'] 
[FIELDS [TERMINATED BY ‘string’] [ENCLOSED BY ‘string’] [PRESERVE BLANKS] [AUTOFILL] 
[LENGTH ‘string’] [DEFINER‘num,num,...’] [TABLE_FIELDS ‘string’] [SET ]]
[LINES [TERMINATED BY 'string'] ]
[MAX_BAD_RECORDS number]
[DATETIME FORMAT format]
[DATE FORMAT format] 
[TIMESTAMP FORMAT format]
[TIME FORMAT format]
[TRACE number]
[TRACE_PATH]
[NOSPLIT]
[PARALLEL number]
[MAX_DATA_PROCESSORS number]
[MIN_CHUNK_SIZE number]
[SKIP_BAD_FILE number]
[IGNORE NUM LINES]
[FILE_FORMAT format]


-- 查看加载状态
select * from information_schema.load_status;

-- 查看历史加载情况
select * from information_schema.load_result;

-- 日志
/opt/gbase/192.168.101.201/gcluster/log/gcluster/loader_logs/16/16_loader_result.log
-- 数据库里面查询
show load logs 16 ;

ftp安装

代码语言:shell
复制
# 安装服务端
yum install vsftpd -y
# 安装客户端
yum install ftp -y
# 准备目录
mkdir -p /opt/ftp
# 修改配置文件
cat << EOF > /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=NO
write_enable=NO
anon_mkdir_write_enable=NO
anon_upload_enable=NO
anon_root=/opt/ftp
no_anon_password=YES
allow_writeable_chroot=NO
EOF
# 启动服务
systemctl start vsftpd

数据导出

gcdump 导出表结构(只有结构/存储过程/函数,没得数据.)

代码语言:sql
复制
-- 导出全库
gcdump -uroot -p123456 -W vc01 --all-databases > vc01_all_db.sql

-- 导出指定库
gcdump -uroot -p123456 -W vc01 --databases db1 > vc01_db1.sql

select into outfile (导出数据)

代码语言:sql
复制
-- 导出t1表的数据
select * from t1 into outfile '/tmp/vc01_db1_t1.txt';
-- rmt:select * from t1 into outfile '/tmp/vc01_db1_t1.txt'; -- 输出到客户端(gbase_export_directory=不生效)
-- select * from t3 into outfile '/tmp/vc01_db1_t3.txt' FIELDS  DOUBLE_ENCLOSED BY '\'' fields escaped by ''; -- DOUBLE_ENCLOSED 表示如果字段值和包裹符一样,就使用两个包裹符来表示, 比如 ddcw's 就是 'ddcw''s' 前提是设置fields escaped by '',即转义符为空, 即不转义

输出:
16:44:11 [gbase@ddcw201 ~]$cat /tmp/vc01_db1_t1.txt/vc01_db1_t1.txt 
2	BOB	F	1980-10-10	天津高新区
1	LILY	M	1981-05-20	天津南开区
3	NANA	M	1982-03-01	天津高新区


导出时候也可以指定包裹符/分割符等..
Options :
[FIELDS [TERMINATED BY ‘string’] [ENCLOSED BY ‘string’] [LENGTH] [ESCAPED BY ] 
[DOUBLE_ENCLOSED BY] ]
[LINES [TERMINATED BY ‘string’] [ STARTING BY ] ]
[CHARACTER SET charset_name]
[NULL_VALUE 'string'] 
[OUTFILEMODE BY]
[WRITEMODE BY]
[FILECOUNT ] 
[FILESIZE]
[WITH HEAD]

审计

代码语言:sql
复制
-- 开启审计(默认关闭的)
set global audit_log=1;

-- 设置审计日志输出为表(默认是文件gclusterd-audit.log)
set global log_output='table';

select @@global.audit_log,@@global.log_output;

-- 设置审计策略(范围)
create audit policy audit_policy_01(enable='Y',sql_commands='DELETE,DROP_TABLE,TRUNCATE,CREATE_TABLE');

-- 查看审计策略
select * from gbase.audit_policy;

-- 查看审计日志
select * from gbase.audit_log;

-- 清空审计日志 (不能直接truncate table gbase.audit_log)
use gbase;
truncate self audit_log;

脱敏

注意: 有unmask权限的账户查询的是原始数据 (all包含了unmask)

对指定字段进行函数运算后返回脱敏后的值, 是字段属性, 所以也可以使用alter修改, 比如alter table t1_default alter name masked with(function='MD5()')

代码语言:sql
复制
-- 默认脱敏(DEFAULT)
create table t1_default(name varchar(20) masked with(function='DEFAULT()'));
insert into t1_default values('ddcw name'),('Tom'),('Jary');

-- 查询验证(需要不含unmask权限的账号:revoke unmask on *.* from u1@'%';)
gbase> select * from db1.t1_default;  
+------+
| name |
+------+
| xxxx |
| xxxx |
| xxxx |
+------+



-- 随机脱敏(就是返回一个范围的随机数)
create table t1_random(id int masked with(function='RANDOM(1,10)'));
insert into t1_random values(1),(11),(22);

-- 查询验证
gbase> select * from t1_random;
+------+
| id   |
+------+
|    4 |
|    6 |
|    2 |
+------+
3 rows in set (Elapsed: 00:00:00.03)

gbase> select * from t1_random;
+------+
| id   |
+------+
|    7 |
|   10 |
|    9 |
+------+
3 rows in set (Elapsed: 00:00:00.03)


-- 自定义脱敏(就是保留部分,剩下的使用指定字符代替)
create table t1_partial(phone varchar(20) masked with(function='PARTIAL(3,"XXXX",4)')); -- 就是保留前3位和后4位,中间的使用XXXX来代替
insert into t1_partial values('12345678901'),('13345678902'),('14345678903');

-- 查询验证
gbase> select * from t1_partial;
+-------------+
| phone       |
+-------------+
| 123XXXX8901 |
| 133XXXX8902 |
| 143XXXX8903 |
+-------------+
3 rows in set (Elapsed: 00:00:00.03)


-- hash脱敏(就是hash目标对象, 因为hash通常不可逆), 比如md5,sha,crc32等 
-- 有道题好像是问支持的脱敏函数有几个? 不知道这个md5算不算在里面. 也可能是问的种类(5种),是我记错了.
create table t1_hash(name varchar(20) masked with(function='MD5()'));
insert into t1_hash values('ddcw name'),('Tom'),('Jary');

-- 验证
gbase> select * from t1_hash;
+----------------------+
| name                 |
+----------------------+
| c192e577cb9015d54429 |
| d9ffaca46d5990ec3950 |
| 0a203bfce92e6ab2a7a0 |
+----------------------+



-- 指定位置脱敏keymask, 就是匹配特定字符串,然后将前面(0)或者后面(1)的值替换成指定字符串
create table t1_keymask(email varchar(20) masked with(function='keymask("@","xxxx",0)'));
insert into t1_keymask values('u1@test.com'),('u2@example.com');

-- 验证
gbase> select * from t1_keymask;
+------------------+
| email            |
+------------------+
| xxxx@test.com    |
| xxxx@example.com |
+------------------+

认证与加密

代码语言:sql
复制
-- 认证(设置密码策略,是只读参数,需要修改gn,gc节点的配置文件,并重启集群)
-- 这里就只修改 password_min_length = 6 了, 简单点.. (在[gbased]组里面添加)
# 所有节点都要修改, 不然会出现有的能修改,有的不能
# 如果只修改了node1,但连上node2去修改密码就是可以的.
vim /opt/gbase/192.168.101.201/gnode/config/gbase_8a_gbase.cnf
vim /opt/gbase/192.168.101.201/gcluster/config/gbase_8a_gcluster.cnf
gcluster_services all restart

gbase> alter user u1@'%' identified by '12345';
ERROR 1809 (HY000): Invalid password format,password length should be more than 6



-- 加密
-- 创建密钥认证
create encryption certificate identified by '123456';
-- 会在每个cluster节点和该vc对应的node节点下存储crt文件.
/opt/gbase/192.168.101.202/gcluster/config/encryption.crt
/opt/gbase/192.168.101.202/gnode/config/encryption.crt
-- 开启认证
alter encryption certificate open identified by '123456';
-- 确认开启(open_status为ON)
select * from information_schema.ENCRYPTION_CERTIFICATE_STATUS;

-- 开启加密之后创建的表(encrypt)存储的时候就是加密了的, 所以如果关闭加密功能, 就无法读取数据了
create table db1.t20260906(id int, name varchar(20)) encrypt; -- 建表
insert into db1.t20260906 values(1,'ddcw'); -- 准备数据
select * from db1.t20260906; -- 查询准备的数据
alter encryption certificate close; -- 关闭加密认证
select * from db1.t20260906; -- 无法查询数据
insert into db1.t20260906 values(2,'ddcw2'); -- 也无法插入数据

gbase> create table db1.t20260906(id int, name varchar(20)) encrypt; -- 建表
Query OK, 0 rows affected (Elapsed: 00:00:00.12)

gbase> insert into db1.t20260906 values(1,'ddcw'); -- 准备数据
Query OK, 1 row affected (Elapsed: 00:00:00.41)

gbase> select * from db1.t20260906; -- 查询准备的数据
+------+------+
| id   | name |
+------+------+
|    1 | ddcw |
+------+------+
1 row in set (Elapsed: 00:00:00.10)

gbase> alter encryption certificate close; -- 关闭加密认证
Query OK, 0 rows affected (Elapsed: 00:00:00.06)

gbase> select * from db1.t20260906; -- 无法查询数据
ERROR 1708 (HY000): [192.168.101.201:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-700) Gbase general error: Decrypt key invalid.
SQL: SELECT /*192.168.101.201_14_15_2026-09-08_15:56:57*/ /*+ TID('852023') */ `vc01.db1.t20260906`.`id` AS `id`, `vc01.db1.t20260906`.`name` AS `name` FROM `db1`.`t20260906_n1` `vc01.db1.t20260906`
gbase> insert into db1.t20260906 values(2,'ddcw2');
ERROR 1705 (HY000): gcluster DML error: No successful nodes, (GBA-01EX-700) Gbase general error: Encrypt key invalid.
gbase> 

镜像

集群扩缩容

其实就添加删除节点.由于资源关系, 我们就先做缩容,再做扩容. 大概流程如下,基本上就是那几步组合,所以还是比较简单的:

代码语言:txt
复制
缩容DN:
数据重分布(去掉需要移除的节点) --> 移除节点

扩容DN:
添加节点(把新的节点加上) --> 数据重分布(加上新的节点)

缩容CN:
停服务,编写配置文件,配置环境,安装节点.

扩容CN:
停服务,编写配置文件,卸载节点.

这里的DN其实是指VC

为了方便演示, 建议步骤为:

DN缩容 --> CN缩容-->移除节点-->添加节点(CN扩容) --> DN扩容 (这个流程走一遍就又回到最初的环境了.)

DN缩容

我们以移除192.168.101.202为例

代码语言:txt
复制
# 重分布
(略)

# 从vc中删除该node
cat << EOF > rack_202.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<rack>
<node ip="192.168.101.202"/>
</rack>
</servers>
EOF

# 使用gcadmin从vc中移除该节点
gcadmin rmnodes rack_202.xml vc01

# 查看节点状态
gcadmin showcluster vc vc01 # 应该看不到该节点了
gcadmin showcluster # 应该能看到多了个free node

# 移除该节点
见移除节点

DN扩容

需要先添加free node, 见添加free node

代码语言:txt
复制
# 编辑配置文件
cat << EOF > rack_202.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<rack>
<node ip="192.168.101.202"/>
</rack>
</servers>
EOF

# 添加到vc
gcadmin addnodes rack_202.xml vc01 # 不要vc名字就是加入根集群
gcadmin showcluster vc vc01 # 应该能看到一个空的节点了

# 重分布
(略)

CN缩容

代码语言:txt
复制
# 见移除节点(把coordinateHost包含上就行)

CN扩容

代码语言:txt
复制
见添加节点(把coordinateHost包含上就行)

移除节点

代码语言:txt
复制
# 移除节点(节点不能是free node,也不能是vc使用中的)
gcadmin rmnodes rack_202.xml # 要加回来就是gcadmin addnodes rack_202.xml

# 编辑配置文件(这里的coordinateHost只有gcluster,没得gcware)
cat << EOF > /tmp/demo_rmnode.options
installPrefix= /opt/gbase
coordinateHost = 192.168.101.202
#coordinateHostNodeID = 202
# 这里包含了上面DN缩容的,不需要的话,去掉即可.
dataHost = 192.168.101.202
existCoordinateHost =192.168.101.201,192.168.101.203
existDataHost =192.168.101.201,192.168.101.203
existGcwareHost=192.168.101.201,192.168.101.203
dbaUser = gbase
dbaGroup = gbase
dbaPwd = 'gbase'
EOF

# 关闭集群(所有节点)
gcluster_services all stop;gcware_services all stop

# 移除节点
cd /opt/gcinstall
./unInstall.py --silent=/tmp/demo_rmnode.options

# 启动集群(可选,本环境不需要执行)
gcluster_services all start;gcware_services all start

# 验证
gcadmin

添加节点(free node)

代码语言:txt
复制
# 准备SetSysEnv.py
scp SetSysEnv.py 192.168.101.202:/opt

# (os的root)在待添加节点执行初始化环境
cd /opt
python SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase

# 准备好配置文件(这里是CN和DN都有)
cat << EOF > /tmp/adddemo.options
installPrefix= /opt/gbase
coordinateHost = 192.168.101.202
#coordinateHostNodeID = 202
dataHost = 192.168.101.202
existCoordinateHost =192.168.101.201,192.168.101.203
existDataHost =192.168.101.201,192.168.101.203
# gcware我们之前并没有删除,可以gcadmin查看验证
existGcwareHost=192.168.101.201,192.168.101.202,192.168.101.203
dbaUser = gbase
dbaGroup = gbase
dbaPwd = 'gbase'
EOF

# 停止所有节点的集群服务
gcluster_services all stop;gcware_services all stop

# 执行安装
./gcinstall.py --silent=/tmp/adddemo.options --license_file=/opt/20260127-04.lic --generalDBUser=gbase --generalDBPwd=GBase2O11O531

# (os的root)在待添加节点执行初始化环境后续
cd /opt
python SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase

# 启动集群(可选,本环境不需要执行)
gcluster_services all start;gcware_services all start

# 验证
gcadmin

重分布

dn添加/删除节点都需要重分布, 所以可以单独拎出来

代码语言:txt
复制
# 创建新的配置文件(缩容使用的)
cat << EOF > rack_201.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<rack>
<node ip="192.168.101.201"/>
</rack>
</servers>
EOF
# 创建新的配置文件(扩容使用的)
cat << EOF > rack_201_202.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<rack>
<node ip="192.168.101.201"/>
<node ip="192.168.101.202"/>
</rack>
</servers>
EOF

# 创建新的分片规则
gcadmin distribution rack_201.xml p 1 d 0 vc vc01  # 缩容使用
#gcadmin distribution rack_201_202.xml p 1 d 1 vc vc01 db_user gbase db_pwd GBase2O11O531 dba_os_password gbase # 扩容使用(dba_os_password是os的gbase用户)

# 重新初始化分片
gccli -uroot -p123456
use vc vc01;
initnodedatamap;
rebalance instance; -- 数据重分布

# 确认进度(全部COMPLETED, 如果有进度一直是0的, 可能是之前加密实验中关闭了密钥导致的.重新打开即可.删表也行.)
select index_name,status,percentage from gclusterdb.rebalancing_status; 

# 删除旧的规则
gcadmin showdistribution # 找有old那一行的Distribution ID
old_distribution_id=$(gcadmin showdistribution vc vc01 | awk '{if ($1=="Distribution" && $6=="old") print $3}')
gcadmin rmdistribution ${old_distribution_id} vc vc01
gcadmin showdistribution # 应该看不到old的了

集群节点替换

集群节点替换分为CN节点和DN节点的替换. 如果是复合节点(CN+DN),则需要先替换CN再替换DN,所以不能使用free node来替换.

DN节点替换

我们使用free node 192.168.101.203来替换192.168.101.202节点

代码语言:txt
复制
# 查询当前状态
gcadmin showdistribution vc vc01
gcadmin showcluster vc vc01

# 设置被替换节点为不可用
gcadmin setnodestate 192.168.101.202 unavailable

# 确认节点不可用
gcadmin showcluster vc vc01

# 清除fevent
gcadmin rmfeventlog 192.168.101.202

# 确认分布信息
gcadmin showdistribution vc vc01 node

# 获取分布信息
gcadmin getdistribution $(gcadmin showdistribution vc vc01 | head -2 | tail -1 | awk '{print $3}') distribution_info_vc01.xml vc vc01

# 修改配置文件
1. 若替换节点为主分片, 则需要将主分片的ip改为备分片的ip,备分片的ip删除.
2. 若替换节点为备分片,则直接删除备分片IP即可
说白了就是要剩下的IP是主分片. 参考如下:
cat distribution_info_vc01.xml
<?xml version='1.0' encoding="utf-8"?>
<distributions>
    <distribution>
        <segments>
            <segment>
                <primarynode ip="192.168.101.201"/>
            </segment>
            <segment>
                <primarynode ip="192.168.101.201"/>
            </segment>
        </segments>
    </distribution>
</distributions>

# 创建新的分布规则文件
cat << EOF > gcchangeinfo_vc01.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
<cfgFile file="distribution_info_vc01.xml"/>
</servers>
EOF

# 创建新的分布 (又是重分布那一堆)
gcadmin distribution gcchangeinfo_vc01.xml vc vc01

gcadmin showdistribution vc vc01 node # new里面应该只有201节点了

# 重新初始化分片
gccli -uroot -p123456
use vc vc01;
initnodedatamap;
rebalance instance; -- 数据重分布
select index_name,status,percentage from gclusterdb.rebalancing_status; 

# 替换节点
cd /opt/gcinstall
./replace.py --host=192.168.101.202 --freenode=192.168.101.203 --type=data --dbaUser=gbase --dbaUserPwd=123456 --generalDBUser=root --generalDBPwd=123456 --overwrite --vcname=vc01
# 这里的dbaUser是os的gbase用户,dbaUserPwd是os的gbase密码(如果202上有CN的话是不能直接替换的.这时候咋办呢?缩容加扩容)

# (os的root)设置环境
cd /opt
python SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase

# 数据重分布
gccli -uroot -p123456
use vc vc01;
rebalance instance; -- 数据重分布

# 删除旧的分布信息: 略

# 移除节点: 略

CN节点替换

代码语言:txt
复制
# 设置节点状态不可用
gcadmin setnodestate 192.168.101.202 unavailable

# 清除fevent
gcadmin rmfeventlog 192.168.101.202

# 在替换节点(new)执行(我这里没有额外的机器,替换节点和被替换节点就使用1个了.)
cd /opt/gcinstall
./replace.py --host=192.168.101.202 --type=coor --dbaUser=gbase --dbaUserPwd=gbase --generalDBUser=root --generalDBPwd=123456 --overwrite 
# dbaUser是os上的gbase用户

虚拟集群(VC)操作

可以接管其它集群的VC,但本次环境就一个集群.就不做了.

代码语言:txt
复制
# 配置免密

# 生成模板
gcadmin importvc e import_vc.xml

# 修改模板(密码是使用base64编码的)
vim import_vc.xml

# 导入集群
gcadmin importvc import_vc.xml

备份恢复

备份目录要求所有节点均可访问,NFS

gcrcman.py调用其它节点的rcman做备份. 支持集群级,库级,表级备份

基础命令如下:

代码语言:txt
复制
# -d 备份目录
# -P os的gbase用户密码
# -p 数据库的gbase用户密码
# -e 非交互式的执行命令
gcrcman.py -d /data/backup/instance -P gbase -p GBase2O11O531

# 查看当前备份信息
show backup;

# 备份集群 (0:全备  1:增备), 集群备份要求所有vc只读
backup level 0
# 恢复集群(第一个参数:哪个备份周期, 第二个参数:恢复到哪个备份点)
recover 0

# 库级备份
backup database vc01.db1 level 0
# 恢复库
recover database 0

# 表级备份
backup table vc01.db1.t1 level 0
# 恢复表
recover table 0

# 批量表级备份(小坑:文件名不能使用引号引起来...)
backup tables /data/backup/test_batch_table.txt level 0 # 格式:每行一张表, vcname.dbname.tblname 
# 批量恢复表
recover tables 0

NFS搭建

本次使用第一个 节点作为NFS server

代码语言:txt
复制
# server端配置(192.168.101.201)
yum install rpcbind -y
yum install nfs-utils -y
yum install pexpect -y
mkdir /data/backup -p
chown gbase:gbase /data/backup/
echo "/data/backup 192.168.101.0/24(rw,no_root_squash,no_all_squash,sync)" >> /etc/exports
exportfs -r
systemctl start rpcbind
systemctl start nfs


# 客户端配置
yum install pexpect -y
yum install nfs-utils -y
mkdir /data/backup -p
mount 192.168.101.201:/data/backup /data/backup
chown  gbase:gbase /data/backup/

# 准备测试目录(gbase用户执行,免得还要改权限)
mkdir -p /data/backup/{instance,dbs,table,tables}

集群级备份恢复

备份

代码语言:txt
复制
# 设置所有vc只读
gcadmin switchmode readonly
15:32:05 [gbase@ddcw201 ~]$gcadmin switchmode readonly

========== switch cluster mode...
  switch pre mode:                 [NORMAL]
  switch mode to                   [READONLY]
  switch after mode:                 [READONLY]

# 登录
gcrcman.py -d /data/backup/instance -P gbase -p GBase2O11O531

# 查看当前备份
show backup

# 开始备份(速度还是很快的,备份也比较小)
backup level 0

gcrcman>show backup
no backup data
gcrcman>backup level 0
09.13 15:33:14  BackUp start 
--------------------------------------------
09.13 15:33:14  node (192.168.101.201)  backup begin 
09.13 15:33:14  node (192.168.101.203)  backup begin 
09.13 15:33:14  node (192.168.101.202)  backup begin 
09.13 15:33:57  node (192.168.101.201)  backup success 
09.13 15:33:57  node (192.168.101.203)  backup success 
09.13 15:33:57  node (192.168.101.202)  backup success 
--------------------------------------------
09.13 15:33:58  BackUp end 
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:33:14


# 再来个增备吧
backup level 1
gcrcman>backup level 1   
09.13 15:35:55  check cluster topology begin 
09.13 15:35:55  node (192.168.101.201)  check topology begin 
09.13 15:35:58  node (192.168.101.201)  check topology success 
09.13 15:35:58  check cluster topology end 
09.13 15:35:58  BackUp start 
--------------------------------------------
09.13 15:35:59  node (192.168.101.201)  backup begin 
09.13 15:35:59  node (192.168.101.203)  backup begin 
09.13 15:35:59  node (192.168.101.202)  backup begin 
09.13 15:36:42  node (192.168.101.201)  backup success 
09.13 15:36:42  node (192.168.101.203)  backup success 
09.13 15:36:42  node (192.168.101.202)  backup success 
--------------------------------------------
09.13 15:36:42  BackUp end 
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:33:14
0	1	1	2026-09-13 15:35:59

恢复

代码语言:txt
复制
# 恢复前需要将集群设置为recovery状态
gcadmin switchmode recovery
15:38:58 [gbase@ddcw201 ~]$gcadmin switchmode recovery

========== switch cluster mode...
  switch pre mode:                 [READONLY]
  switch mode to                   [RECOVERY]
  switch after mode:                 [RECOVERY]


# 恢复(就不验证数据了)
gcrcman.py -d /data/backup/instance -P gbase -p GBase2O11O531
recover 0

gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:33:14
0	1	1	2026-09-13 15:35:59
gcrcman>recover 0
09.13 15:40:07  check cluster topology begin 
09.13 15:40:07  node (192.168.101.201)  check topology begin 
09.13 15:40:10  node (192.168.101.201)  check topology success 
09.13 15:40:10  check cluster topology end 
09.13 15:40:11  check BackUp start 
--------------------------------------------
....
--------------------------------------------
09.13 15:40:32  check BackUp success 
09.13 15:40:32  Recover start 
--------------------------------------------
09.13 15:40:33  node (192.168.101.201)  Recover begin 
09.13 15:40:33  node (192.168.101.203)  Recover begin 
09.13 15:40:33  node (192.168.101.202)  Recover begin 
09.13 15:40:50  node (192.168.101.201)  Recover success 
09.13 15:40:50  node (192.168.101.203)  Recover success 
09.13 15:40:50  node (192.168.101.202)  Recover success 
--------------------------------------------
09.13 15:40:50  Recover success 
gcrcman>

# 恢复之后,将集群设置为normal状态
gcadmin switchmode normal
15:42:47 [gbase@ddcw201 ~]$gcadmin switchmode normal

========== switch cluster mode...
  switch pre mode:                 [RECOVERY]
  switch mode to                   [NORMAL]
  switch after mode:                 [NORMAL]

库级备份恢复

备份

代码语言:txt
复制
# 登录(换个目录)
gcrcman.py -d /data/backup/dbs -P gbase -p GBase2O11O531

# 备份vc01.db1
backup database vc01.db1 level 0

gcrcman>show backup
no backup data
gcrcman>backup database vc01.db1 level 0
09.13 15:45:38  BackUp database vc01.db1 start 
--------------------------------------------
09.13 15:45:38  node (192.168.101.201)  backup database begin 
09.13 15:45:38  node (192.168.101.203)  backup database begin 
09.13 15:45:38  node (192.168.101.202)  backup database begin 
09.13 15:46:05  node (192.168.101.201)  backup database success 
09.13 15:46:05  node (192.168.101.203)  backup database success 
09.13 15:46:05  node (192.168.101.202)  backup database success 
--------------------------------------------
09.13 15:46:05  BackUp database vc01.db1 end 
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:45:38

恢复

代码语言:txt
复制
# 恢复前需要先干掉原来的库名,不然要报错:database vc01.db1 exist, please drop database at first
gccli -uroot -p123456
use vc vc01;
drop database db1;

gbase> use vc vc01;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> drop database db1;
Query OK, 14 rows affected (Elapsed: 00:00:00.14)


# 恢复
gcrcman.py -d /data/backup/dbs -P gbase -p GBase2O11O531
recover database vc01.db1 0
gcrcman>show backup   
cycle	point	level	time
0	0	0	2026-09-13 15:45:38
gcrcman>recover database vc01.db1 0
09.13 15:50:23  check database BackUp start 
--------------------------------------------
09.13 15:50:23  node (192.168.101.201)  check database backup begin 
09.13 15:50:23  node (192.168.101.203)  check database backup begin 
09.13 15:50:23  node (192.168.101.202)  check database backup begin 
09.13 15:50:36  node (192.168.101.201)  check database backup success 
09.13 15:50:36  node (192.168.101.203)  check database backup success 
09.13 15:50:36  node (192.168.101.202)  check database backup success 
--------------------------------------------
09.13 15:50:36  check database BackUp success 
09.13 15:50:36  recover prepare start 
--------------------------------------------
....
--------------------------------------------
09.13 15:50:44  node (192.168.101.201)  Recover database begin 
09.13 15:50:44  node (192.168.101.203)  Recover database begin 
09.13 15:50:44  node (192.168.101.202)  Recover database begin 
09.13 15:51:00  node (192.168.101.201)  Recover database success 
09.13 15:51:00  node (192.168.101.203)  Recover database success 
09.13 15:51:00  node (192.168.101.202)  Recover database success 
--------------------------------------------
09.13 15:51:00  Recover database vc01.db1 success, please refresh it! 



# 验证数据(如果没有看到表的话,可以执行refresh tables, 本环境未执行)
gbase> select table_vc,table_schema,count(*) from information_schema.tables where table_schema='db1' group by 1,2;
+----------+--------------+----------+
| table_vc | table_schema | count(*) |
+----------+--------------+----------+
| vc01     | db1          |       14 |
+----------+--------------+----------+
1 row in set (Elapsed: 00:00:00.00)

表级备份恢复

单表备份恢复

代码语言:txt
复制
# 备份
gcrcman.py -d /data/backup/table -P gbase -p GBase2O11O531
backup table vc01.db1.t1 level 0
gcrcman>backup table vc01.db1.t1 level 0
09.13 15:56:15  BackUp table vc01.db1.t1 start 
--------------------------------------------
09.13 15:56:16  node (192.168.101.201)  backup table begin 
09.13 15:56:16  node (192.168.101.203)  backup table begin 
09.13 15:56:16  node (192.168.101.202)  backup table begin 
09.13 15:56:39  node (192.168.101.201)  backup table success 
09.13 15:56:39  node (192.168.101.203)  backup table success 
09.13 15:56:39  node (192.168.101.202)  backup table success 
--------------------------------------------
09.13 15:56:39  BackUp table vc01.db1.t1 end 
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:56:16


# 恢复前需要干掉原表(不然报错Table vc01.db1.t1 exist, please drop it at first)
gccli -uroot -p123456
use vc vc01;
drop table db1.t1;

# 恢复表
gcrcman.py -d /data/backup/table -P gbase -p GBase2O11O531
recover table vc01.db1.t1 0
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 15:56:16
gcrcman>recover table vc01.db1.t1 0
09.13 15:59:05  check Table topology start 
--------------------------------------------
09.13 15:59:05  node (192.168.101.201)  check table topology begin 
09.13 15:59:09  node (192.168.101.201)  check table topology success 
--------------------------------------------
09.13 15:59:09  check table topology success 
09.13 15:59:09  check Table BackUp start 
--------------------------------------------
09.13 15:59:09  node (192.168.101.201)  check table backup begin 
09.13 15:59:09  node (192.168.101.203)  check table backup begin 
09.13 15:59:09  node (192.168.101.202)  check table backup begin 
09.13 15:59:21  node (192.168.101.201)  check table backup success 
09.13 15:59:21  node (192.168.101.203)  check table backup success 
09.13 15:59:21  node (192.168.101.202)  check table backup success 
--------------------------------------------
09.13 15:59:21  check table BackUp success 
09.13 15:59:21  refresh table vc01.db1.t1 start 
09.13 15:59:21  node (192.168.101.201)  recreate table begin 
09.13 15:59:25  node (192.168.101.201)  recreate table success 
09.13 15:59:25  refresh table vc01.db1.t1 end 
09.13 15:59:26  Recover table vc01.db1.t1 start 
--------------------------------------------
09.13 15:59:26  node (192.168.101.201)  Recover table begin 
09.13 15:59:26  node (192.168.101.203)  Recover table begin 
09.13 15:59:26  node (192.168.101.202)  Recover table begin 
09.13 15:59:40  node (192.168.101.201)  Recover table success 
09.13 15:59:40  node (192.168.101.203)  Recover table success 
09.13 15:59:40  node (192.168.101.202)  Recover table success 
--------------------------------------------
09.13 15:59:40  Recover table vc01.db1.t1 success, please refresh it!

# 验证(需要refresh tables才能看到数据)
gbase> select count(*) from db1.t1;
ERROR 1146 (42S02): Table 'vc01.db1.t1' doesn't exist
gbase> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (Elapsed: 00:00:00.02)

gbase> refresh tables;             
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (Elapsed: 00:00:00.03)

批量表备份恢复

代码语言:txt
复制
# 准备需要备份的表名
cat << EOF > /data/backup/test_batch_table.txt
vc01.db1.t1
vc01.db1.t2
EOF

# 备份
gcrcman.py -d /data/backup/tables -P gbase -p GBase2O11O531
backup tables /data/backup/test_batch_table.txt level 0
gcrcman>show backup
no backup data
gcrcman>backup tables /data/backup/test_batch_table.txt level 0
========================BackUpMultiTable=============================
distinct table list ['vc01.db1.t1', 'vc01.db1.t2']
==============BackUp ParallelProcessTable default parallel 4 tablenum 2=============
========================BackUpOneTable===============================
backup table vc01.db1.t1 level 0
========================BackUpOneTable===============================
backup table vc01.db1.t2 level 0
09.13 16:10:16  BackUp table vc01.db1.t1 start 
--------------------------------------------
09.13 16:10:16  node (192.168.101.201)  backup table begin 
09.13 16:10:16  node (192.168.101.203)  backup table begin 
09.13 16:10:16  node (192.168.101.202)  backup table begin 
09.13 16:10:17  BackUp table vc01.db1.t2 start 
--------------------------------------------
....
--------------------------------------------
09.13 16:10:40  BackUp table vc01.db1.t1 end 
09.13 16:10:42  node (192.168.101.201)  backup table success 
09.13 16:10:42  node (192.168.101.203)  backup table success 
09.13 16:10:42  node (192.168.101.202)  backup table success 
--------------------------------------------
09.13 16:10:42  BackUp table vc01.db1.t2 end 
===================ParallelProcessTable End============================
========================SaveBackUpInfo=================================
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 16:09:54
0	0	0	2026-09-13 16:09:54
0	0	0	2026-09-13 16:09:54

# 恢复前要干掉原来的表
gbase> drop table t1;
Query OK, 0 rows affected (Elapsed: 00:00:00.06)

gbase> drop table t2;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)

# 恢复
recover tables 0
gcrcman>show backup
cycle	point	level	time
0	0	0	2026-09-13 16:09:54
0	0	0	2026-09-13 16:09:54
0	0	0	2026-09-13 16:09:54
gcrcman>recover tables 0
=========================RecoverMultiTable=======================================
recover to cycle 0 point 0
table_list ['vc01.db1.t1', 'vc01.db1.t2']
==============Recover ParallelProcessTable default parallel 4 tablenum 2=============
==============RecoverOneTable_CallBack vc01.db1.t1=============
==============RecoverOneTable_CallBack vc01.db1.t2=============
09.13 16:15:27  check Table topology start 
--------------------------------------------
09.13 16:15:27  node (192.168.101.201)  check table topology begin 
09.13 16:15:27  check Table topology start 
--------------------------------------------
.........
--------------------------------------------
09.13 16:16:05  Recover table vc01.db1.t2 success, please refresh it! 
===================ParallelProcessTable End============================

# 验证(也要refresh tables)
gbase> select count(*) from t1;select count(*) from t2;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (Elapsed: 00:00:00.03)

+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (Elapsed: 00:00:00.03)

gbase> refresh tables;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select count(*) from t1;select count(*) from t2;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (Elapsed: 00:00:00.03)

+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (Elapsed: 00:00:00.01)

资源管理

方便各用户/任务使用资源. 有如下概念:

  1. Consumer Group: 消费组,一堆用户的合集. 未显示加入消费组的默认在Default Consumer Group里面.
  2. Resource Pool: 资源池,若干资源的合集. 分为静态资源池(static resource pool)和动态资源池(dynamic resource pool). 动态资源池必须属于某一个静态资源池
  3. Resource Plan: 资源计划. 就是消费组和资源池的关系. 一个资源计划下,资源池可以给多个资源组使用.
  4. Resource directive: 资源指令. 资源计划中, 消费组和资源池的关系. (默认的资源池必须绑定某个资源池)

所以我们可以让某些用户白天使用更多资源, 晚上使用更少资源; 另一些用户白天使用更少的资源,晚上使用更多的资源. 比如:

代码语言:txt
复制
# 创建消费组
create consumer group cg_01 comment = 'test day work';
create consumer group cg_02 comment = 'test night work';
select * from gbase.consumer_group;

# 将用户与消费组绑定
alter consumer group cg_01 add user u1;
alter consumer group cg_01 add user u2;
select * from gbase.consumer_group_user;

# 创建静态资源池(如下选项是最少的参数)
create resource pool sp_01(
cpu_percent=100,
max_memory=2000,
max_disk_readio=100,
max_disk_writeio=100,
max_temp_diskspace=100,
max_disk_space=100
) type static;
select resource_pool_id,resource_pool_name,resource_pool_type from gbase.resource_pool;

# 创建动态资源池
create resource pool dp_high(
cpu_percent=80,
max_memory=1800,
max_disk_readio=80,
max_disk_writeio=80,
max_temp_diskspace=80,
max_disk_space=80
) type dynamic base on sp_01;
select resource_pool_id,resource_pool_name,resource_pool_type from gbase.resource_pool;

create resource pool dp_low(
cpu_percent=20,
max_memory=200,
max_disk_readio=20,
max_disk_writeio=20,
max_temp_diskspace=20,
max_disk_space=20
) type dynamic base on sp_01;
select resource_pool_id,resource_pool_name,resource_pool_type from gbase.resource_pool;

# 创建资源计划
create resource plan rp_day comment 'day work';
create resource plan rp_night comment 'night work';
select * from gbase.resource_plan;

# 创建资源指令(资源池和用户组关联)
create resource directive rd_day_01(
plan_name='rp_day',pool_name='dp_high',group_name='cg_01',
comment='rp_day激化时: cg_01使用dp_high'
);
create resource directive rd_day_02(
plan_name='rp_day',pool_name='dp_low',group_name='cg_02',
comment='rp_day激化时: cg_02使用dp_low'
);
create resource directive rd_day_03(
plan_name='rp_day',pool_name='dp_low',group_name='default_consumer_group',
comment='rp_day激化时: 默认消费组default_consumer_group使用dp_low'
);
select resource_plan_directive_name,resource_plan_id,consumer_group_id from gbase.resource_plan_directive;

create resource directive rd_night_01(
plan_name='rp_night',pool_name='dp_low',group_name='cg_01',
comment='rp_night激化时: cg_01使用dp_low'
);
create resource directive rd_night_02(
plan_name='rp_night',pool_name='dp_high',group_name='cg_02',
comment='rp_night激化时: cg_02使用dp_high'
);
create resource directive rd_night_03(
plan_name='rp_night',pool_name='dp_high',group_name='default_consumer_group',
comment='rp_night激化时: 默认消费组default_consumer_group使用dp_low'
);
select resource_plan_directive_name,resource_plan_id,consumer_group_id from gbase.resource_plan_directive;


# 白天的时候,关闭rp_night,激活rp_day
deactive resource plan on vc vc01;
active resource plan rp_day on vc vc01;
select * from gbase.resource_config;

# 晚上的时候,关闭rp_day,激活rp_night
deactive resource plan on vc vc01;
active resource plan rp_night on vc vc01;
select * from gbase.resource_config;

巡检

如果不使用巡检工具的话, 就是跑命令

代码语言:txt
复制
# 集群状态
gcadmin

# VC状态
gcadmin showcluster vc vc01

# 查看各集各服务群状态
gcmonit --status

# 查看各服务日志
find /opt/gbase -name "*system.log*"
/opt/gbase/192.168.101.201/gcluster/log/gcluster/system.log
/opt/gbase/192.168.101.201/gcluster/log/gcluster/gcrecover_system.log
/opt/gbase/192.168.101.201/gcware/log/gcware_system.log
/opt/gbase/192.168.101.201/gnode/log/gbase/system.log

# 查看license
show license\G

# 查看core/dump
find /opt/gbase/ -name "core.*"
find /opt/gbase/ -name "*.dump"

# 查看空间
df -hT

# 参数,权限等

# GDOM上也有巡检功能, 还能定时巡检
运维-->健康检查-->任务管理-->添加

GDOM

安装

资源有限, 就使用第一个节点来安装gdom了

代码语言:txt
复制
# 上传软件
cd /tmp # 需要gdom用户有权限访问的目录, 不然后续执行的时候没得权限就尴尬了.
不建议放在/tmp目录, 我这是懒得创建目录才这样放的.

# 安装依赖(虽然是本地节点,但还是走的ssh,所以需要expect)
yum install expect -y

# 解压
unzip GDOM-v3.7.0-build4-redhat7-x86_64.zip
cd GDOM-v3.7.0-build4-redhat7-x86_64
tar -xvf GDOM-v3.7.0-build4-redhat7-x86_64.tar.gz
cd GDOM-v3.7.0-build4-redhat7-x86_64 # 套娃

# 编辑配置文件
cat << EOF > demo.options
gdomRoot=/opt/gdom
gdomService=192.168.101.201
gdomServicePort=8080
user=gdom

gdomDb=192.168.101.201
gdomDbPort=3306
gdomDbUser=root
gdomDbPwd=111111
gdomDbDriver=com.mysql.cj.jdbc.Driver
gdomDbUrl=

#gdomDbHa=192.168.101.201
gdomDbHaPort=3307
gdomDbHaMonitorPort=8811
gdomDbHaMonitorAdmin=admin
gdomDbHaMonitorPwd=admin

# 如果没有使用url,这个IP不能注释... 不然一直卡着
gdomGBaseDb=192.168.101.201
# 5258被使用了,我们换一个端口
gdomGBaseDbPort=5259
gdomGBaseDbUser=gbase
gdomGBaseDbPwd=gbase
gdomGBaseDbUrl=

gdomNginx=192.168.101.201
gdomNginxPort=8810
gdomNginxUrl=

gdomRedis=192.168.101.201
gdomRedisPort=7481
gdomRedisDb=0
gdomRedisUrl=

gdomMq=192.168.101.201
gdomMqPort=9876
gdomDashBoardPort=9898
gdomMqUrl=
EOF

# 配置互信(手动输入gdom和root的密码, 注:gdom是设置密码)
./gdomMutualTrust.sh -a

# 安装依赖(手动输入root的密码)
./gdomSetupRPM.sh -a

# 切换到gdom用户执行安装
su - gdom
cd /tmp/GDOM-v3.7.0-build4-redhat7-x86_64/GDOM-v3.7.0-build4-redhat7-x86_64
./gdomInstall.sh -a
如果卡住,可以使用 sh -x ./gdomInstall.sh -a 看下是卡哪了, 比如视频里面gdomGBaseDb是注释的(因为使用了url?), 但实际上会遇到传参为空导致grep -w $1 /etc/hosts 一直卡住的问题...

# 启动服务
./gdomStart.sh -a

# 安装完成之后,即可登录web控制台(账号密码: admin/admin123)
https://192.168.101.201:8810

# 添加集群
集群-->集群管理-->集群导入
	管理节点:192.168.101.201
	SSH端口:22
	(os)dbaUser:gbase
	(os)dbaUser密码:gbase
获取集群信息-->下一步
	集群安装包(需要先上传):GBase8a_MPP_Cluster-License-9.5.3.28.35_patch.2-redhat7-x86_64.tar.bz2 (应该是在/opt/gdom/upload/路径下的)
	数据库用户名:gbase
	数据库用户密码:GBase2O11O531
下一步
	Agent安装路径:/home/gbase
下一步, 确认信息无误后,点击集群导入即可.

注:需要等几分钟(agent采集信息)才能看到各节点信息

管理

使用gdom用户管理

代码语言:txt
复制
su - gdom
cd /tmp/GDOM-v3.7.0-build4-redhat7-x86_64/GDOM-v3.7.0-build4-redhat7-x86_64
# 启动
./gdomStart.sh -a

# 停止
./gdomStop.sh -a

# 查看状态
./gdomStatus.sh -a

# 停止agent(其它节点需要手动停止agent)
su - gbase
/home/gbase/agent/*/gbase-agent/agent -e stop


# 数据库登录(root@localhost)
/opt/gdom/install/mysql/mysql-8.0.44-linux-glibc2.17-x86_64/bin/mysql -h127.0.0.1 -uroot

# 数据库登录(root@%)
/opt/gdom/install/mysql/mysql-8.0.44-linux-glibc2.17-x86_64/bin/mysql -h192.168.101.201 -uroot -p111111
注:如果懒得登录数据库,也可以使用ibd2sql之类的直接在OS层查看数据文件的数据(我当时使用root@localhost的时候加了密码,发现登录不上;然后看了下mysql.ibd中mysql.user表,发现root@%密码才是111111,而root@localhost没得密码....)

升级&回退&卸载

没包,就不测了.

代码语言:txt
复制
# 升级(会自动备份到/home/gbase目录下,方便回退,也可以加--backup_dir手动指定备份目录)
gcluster_services all stop;gcware_services all stop
python gcinstall.py --silent=demo.options --upgrade --generalDBUser=root --generalDBPwd=123456 --license_file=/opt/20260127-04.lic

# 回退
gcluster_services all stop;gcware_services all stop
python Restore.py --backupFile=/home/gbase/gcluster_backup_xxx.tar.bz2 --silent=demo.options 

# 卸载
gcluster_services all stop;gcware_services all stop
python unInstall.py --silent=demo.options

考试总结

考试分为基础考试和运维/开发考试.

2026.09.06(基础篇考试):

培训中期有个<基础科目认证考试>, 80/100才算通过, 都是单选多选和判断. 考试采用的是手机开视频会议,电脑答题的方式(视频需包含考生和答题界面). 第一次我没考过(77.5)....

2026.09.07(基础篇补考):

第二次补考压线过(81), 也是运气比较好了

2026.09.16(运维考试)

又是压线(81)过, 别说,运气还挺好.

除了培训视频和文档外,建议看下官方文档.有些考试内容可能是官方文档才有写的.

参考文档: https://www.gbase.cn/docs/gbase-8a/产品手册/产品概述/产品架构

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 基础概念
  • 环境
  • 安装
    • 集群安装
    • 配置日志归档(轮转?)
    • 创建VC
    • 集群管理
  • 基础使用
    • 用户
    • 数据加载
    • 数据导出
    • 审计
    • 脱敏
    • 认证与加密
    • 镜像
  • 集群扩缩容
    • DN缩容
    • DN扩容
    • CN缩容
    • CN扩容
    • 移除节点
    • 添加节点(free node)
    • 重分布
  • 集群节点替换
    • DN节点替换
    • CN节点替换
  • 虚拟集群(VC)操作
  • 备份恢复
    • NFS搭建
    • 集群级备份恢复
      • 备份
      • 恢复
    • 库级备份恢复
      • 备份
      • 恢复
    • 表级备份恢复
      • 单表备份恢复
      • 批量表备份恢复
  • 资源管理
  • 巡检
  • GDOM
    • 安装
    • 管理
  • 升级&回退&卸载
  • 考试总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档