返回首页

gbase数据、南大通用产品文档:GBase8a工具管理

更新日期:2024年09月11日

GDR、GDS 工具
概述
GDR 和GDS 是GBaseUP 集群的两个子功能。
GDR 主要为Coordinator 提供各数据
库引擎之间的数据流转服务。GDS 主要提供两个跨域的GBase UP 集群之间的数据
同步服务。GDR 和GDS 两个组件在GBaseUP 集群架构的中位置如下图所示。
Coordinator
GDR
GDS
Express
Hive
GBase8t
Coordinator
GDR
Express
Hive
GBase8t
GBaseUP1
GBaseUP2

说明
箭头表示数据流向。如果是单个GBaseUP 内各数据库引擎的数据流转,数据只经过GDR 服
务。如果是两个GBaseUP 之间各引擎的数据流转,就需要GDR 和GDS 同时协作。

将缓冲区写入磁盘称为缓冲区清空。当用户线程修改缓冲区中的数据时,它会将缓冲区标
为脏。当数据库服务器将缓冲区清空到磁盘时,它随后会将缓冲区标为不脏并允许覆盖缓
冲区中的数据。
数据库服务器将清空以下缓冲区:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 130 -

缓冲池(包含在本节中)

物理日志缓冲区
请参阅清空物理日志缓冲区。

逻辑日志缓冲区
请参阅清空逻辑日志缓冲区。
页清除程序线程缓冲区清空。数据库服务器总是运行至少一个页清除程序线程。如果数据
库服务器配置了多个页清除程序线程,那么 LRU 队列将分配到这些页清除程序中以便更
有效的清空。有关指定数据库服务器运行多少页清除程序线程的信息,请参阅《GBase 8s
管理员参考》中的 CLEANERS 配置参数。
清空物理日志缓冲区、已修改的共享内存页缓冲区和逻辑日志缓冲区必须依照设计用以保
持数据一致性的特定规则与页清除程序活动同步。

清空缓冲池缓冲区
缓冲区的清空由以下任何一种条件启动:
• MLRU 队列中缓冲区数达到 BUFFERPOOL 配置参数中lru_max_dirty 值指定的
数目。
• 页清除程序线程无法跟上。换句话说,用户线程必定需要获取缓冲区,但是没有
未修改的缓冲区可用。
• 数据库服务器必须执行检查点。(请参阅检查点。)
自动 LRU 调节可影响所有缓冲池并调整 BUFFERPOOL 配置参数中的 lru_min_dirty
和 lru_max_dirty 值。

首先清空前映像
已修改页的前映像在已修改页本身之前清空到磁盘。
实际上,首先清空物理日志缓冲区然后再清空包含已修改的页的缓冲区。因此,即便由于
用户线程正在试图获取缓冲区但没有缓冲区可用(前台写入),而必须对共享内存缓冲区
页清空时,也只有在页的前映像已写入磁盘后才能将缓冲区页清空。

清空物理日志缓冲区
数据库服务器临时存储物理日志缓冲区中存储一些已修改的磁盘页的前映像。如果前映像
已写入物理日志缓冲区但未写入磁盘上的物理日志,那么服务器会在将已修改的页清空到
磁盘之前先将物理日志缓冲区清空到磁盘。
数据库服务器总是在将任何数据缓冲区清空到磁盘之前首先将物理日志缓冲区的内容清空
到磁盘。
以下事件将导致活动的物理日志缓冲区清空:

活动物理日志缓冲区变满。

共享内存中的已修改页必须清空,但前映像仍然在活动物理日志缓冲区中。

出现检查点。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 131 -
数据库服务器一次只使用两个物理日志缓冲区中的一个。此缓冲区是活动(或当前)物理
日志缓冲区。在数据库服务器将当前物理日志缓冲区清空到磁盘之前,它使其他缓冲区称
为当前物理日志缓冲区,以便该服务器可以在清空第一个缓冲区时继续写入。
物理日志缓冲区和物理日志都有助于保持数据在物理上和逻辑上的一致性。有关物理记
录、检查点和快速恢复的信息,请参阅物理日志记录、检查点和快速恢复。

同步缓冲区清空
当首先启动共享内存时,所有的缓冲区都是空的。当处理发生时,数据页将从磁盘读入缓
冲区,而用户线程则开始修改这些页。

描述清空活动
为了向您提供有关提示缓冲区清空活动的特定条件的信息,数据库服务器定义了三种类型
的写入并计算发生每次写入的频率:

前台写入

LRU 写入

块写入
要显示数据库服务器保留的写入计数,请如《GBase 8s 管理员参考》中所述使用 onstat -
F。
如果实现数据库服务器的镜像,那么数据总是先写入主块。然后写入会在镜像块上重复。
对镜像块的写入次数包含在计数中。有关监视数据库服务器所执行的写入类型的更多信
息,请参阅监视缓冲池活动。
前台写入
只要 sqlexec 线程将缓冲区写入磁盘,都称为前台写入。当 sqlexec 线程代表用户在
LRU 队列中搜索但无法找到空的或未修改的缓冲区时将发生前台写入。为了腾出空间,
sqlexec 线程将一次清空一个页以容纳要从磁盘读取的数据。(有关更多信息,请参阅
FIFO/LRU 队列。)
如果 sqlexec 线程必须执行缓冲区清空以获取共享内存缓冲区,那么性能会变差。必须避
免前台写入。要显示对前台写入次数的计数,请运行 onstat -F。如果发现前台写入定期发
生,请调整页清除参数的值。 要么增加页清除程序的数目,要么减少 BUFFERPOOL
lru_max_dirty 值。
LRU 写入
与前台写入不同,LRU 写入由页清除程序执行而不是由 sqlexec 线程执行。数据库服务
器将 LRU 写入作为后台写入执行,后者通常在脏缓冲区的百分比超过在 BUFFERPOOL
配置参数中为 lru_max_dirty 指定的百分比时发生。
此外,前台写入可触发 LRU 写入。当发生前台写入时,已执行写入的 sqlexec 线程将提
醒页清除程序唤醒并清除该线程已为之执行前台写入的 LRU。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 132 -
在已正确调整的系统中,页清除程序将确保有足够的未修改的缓冲区页可用于存储从磁盘
读取的页。因此,执行查询的 sqlexec 线程无需在读入查询所需的磁盘页之前,先将页清
空到磁盘。对于不利用前台写入的查询而言,这种情况可以使性能有显著地提高。
由于页清除程序线程执行缓冲区写入比 sqlexec 线程更有效率,因此 LRU 写入比前台写
入更受欢迎。要监视写入的两种类型,请使用 onstat -F。
块写入
块写入统称由页清除程序线程在检查点期间执行,或在可能的情况下在共享内存缓冲池中
的每个页已修改时执行。块写入(作为已排序的写入执行)是数据库服务器可用的最有效
的写入。
在块写入期间,每个页清除程序线程都指定到一个或多个块。每个页清除程序线程在缓冲
区头中读取并将一组指针创建到与其特定的块关联的页。(页清除程序对此信息有访问
权,因为块编号包含在物理页编号地址中,它是页头的一部分。)此排序将最小化磁盘上
的磁头移动(磁盘搜索时间)并在可能的情况下使页清除程序线程能够在写入时使用大缓
冲区。
此外,由于用户线程必须等待检查点完成,因此页清除器线程不会与大量线程争用 CPU
时间。结果,页清除程序线程可以通过更少的上下文切换来完成它们的工作。

清空逻辑日志缓冲区
数据库服务器使用共享内存逻辑日志缓冲区作为临时存储器用于存储向数据库服务器页描
述修改的记录。这些更改记录将从逻辑日志缓冲区写入磁盘上当前的逻辑日志文件,并最
终写入逻辑日志备份介质。有关逻辑日志记录的描述,请参阅逻辑日志。
五个事件导致当前逻辑日志缓冲区清空:

当前的逻辑日志缓冲区变满。

事务已在带有未缓冲日志记录的数据库中准备或落实。

非日志记录数据库会话终止。

出现检查点。

已修改不需要物理日志中的前映像的页。
以下主题将详细讨论其中每个事件。
事务已在带有未缓冲日志记录的数据库中准备或终止之后
以下日志记录将导致逻辑日志缓冲区在带有未缓冲日志记录的数据库中清空:

COMMIT

PREPARE

XPREPARE

ENDTRANS
有关已缓冲日志记录和未缓冲日志记录的比较,请参阅 《GBase 8s SQL 指南:语法》
中的 SET LOG 语句。
使用非日志记录数据库或未缓冲日志记录的会话终止时

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 133 -
甚至对于非日志记录数据库,数据库服务器会记录某些改变数据库方式的活动,如创建表
或扩展数据块。当数据库服务器终止那些使用未缓冲日志记录或非日志记录数据库的会话
时,会清空逻辑日志缓冲区以确保已记录任何日志记录活动。
当出现检查点时
有关在检查点期间所发生事件的详细描述,请参阅检查点。
当已修改不需要物理日志文件中的前映像的页时
当修改了不需要物理日志中的前映像的页时,必须在页清空到磁盘前清空逻辑日志缓冲
区。

为便于理解以上概念,下表举例说明每种典型场景下查询和结果集,用例使用的建

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
463
表语句和数据为:
create table t (i1 int,
vc1 varchar(10) masked with (function='partial(2,"*****",0)'),
vc2 varchar(10) masked with (function='partial(2,"*****",0)'));
insert into t values (1, 'nblknabpa', 'pombkaia');
insert into t values (2, '.mapkna', '0jbadflk');
insert into t values ();

示例1:第i 类函数case when 脱敏列规则;
gbase>select case i1 when 1 then vc1 when 2 then '12345' else '67890' end as res from t;
+---------+
| res
|
+---------+
| nb***** |
| 12***** |
| 67***** |
+---------+

示例2:第i 类函数coalesce 脱敏列规则;
gbase>select coalesce(vc1,'12345') as res from t;
+---------+
| res
|
+---------+
| nb***** |
| .m***** |
| 12***** |
+---------+

示例3:第i 类函数case when 多脱敏列默认脱敏;
gbase> select case i1 when 1 then vc1 when 2 then vc2 else '67890' end as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+

示例4:第ii 类函数substring 默认脱敏;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
464
gbase> select substring(vc1, 1, 2) as res from t;
+------+
| res
|
+------+
| xx
|
| xx
|
| NULL |
+------+

示例5:第ii 类函数concat 默认脱敏;
gbase> select concat(vc1,'123') as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例6:第i 类函数嵌套使用;
gbase> select case when i1 > 1 then coalesce(vc1, '12345') else '67890' end as res from t;
+---------+
| res
|
+---------+
| 67***** |
| .m***** |
| 67***** |
+---------+

示例7:第ii 类函数嵌套使用;
gbase> select concat(substring(vc1,1,2),'123') as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例8:第i 类和ii 类函数混合嵌套调用;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
465
gbase> select coalesce(substring(vc1,1,2),'12345') as res from t;
(或者select substring(coalesce (vc1, '12345'), 1, 2) as res from t;)
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+

示例9:子查询内或外调用i 类;
gbase> select res from (select coalesce(vc1,'12345')as res from t) as tmp;
(或者select coalesce(vc1, '12345') as res from (select vc1 from t) as tmp;)
+---------+
| res
|
+---------+
| nb***** |
| .m***** |
| 12***** |
+---------+

示例10:子查询内或外调用ii 类;
gbase> select res from (select concat(vc1,'123') as res from t) as tmp;
(或者select concat (vc1, '123') as res from (select vc1 from t) as tmp;)
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例11:子查询内外调用i 类;
gbase> select case when i1 > 1 then res1 else '67890' end as res from (select i1,coalesce(vc1,
'12345') as res1 from t) as tmp;
+---------+
| res
|
+---------+
| 67***** |
| .m***** |
| 67***** |
+---------+

示例12:子查询内外调用ii 类;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
466
gbase> select concat(res1,'123') as res from (select substring(vc1,1,2) as res1 from t) as tmp;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例13:子查询内外混合调用i 类和ii 类。
gbase> select substring(res1,1,4) as res from (select coalesce(vc1, '12345') as res1 from t) as
tmp;
(或者
gbase> select coalesce(res1, '12345') as res from (select substring(vc1,1,2) as res1 from
t) as tmp; )
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+
说明
脱敏列脱敏后如果超过脱敏列的最大长度,则自动截断为脱敏列的最大长度。
比如脱敏列定义为:
mask_col varchar(5) masked with (function ='partial(2,"xxxx",2)')
则值“abcde”理论上应脱敏为“abxxxxde”,脱敏后的长度超过了最大长度5,自动截断为
“abxxx”。
脱敏列脱敏后对于一些可设置长度的函数脱敏时也会被截断,比如:
select left(mask_col, 2) from t;
left 函数将使用默认脱敏,理论上应脱敏为“xxxx”,但超过了left 函数设置的最大长度,所
以自动截断为“xx”。
Union、Intersect 和Minus 运算时,对应列的脱敏规则与控制流函数的脱敏规则一致。
比如:
select mask_int_col from t union select mask_int_col as col from t;
将使用mask_int_col 的脱敏规则,而:
select mask_int_col from t union select mask_int_col+1 from t;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
467
将使用默认脱敏。